diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java
index e2732145a8420d6b3265c2388d65fb256a8c1279..0a04c7138b6566686c2d30f8c20157b99e7caa7a 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java
@@ -96,6 +96,12 @@ public interface ContactManager {
 	void setContactActive(Transaction txn, ContactId c, boolean active)
 			throws DbException;
 
+	/**
+	 * Sets an alias name for the contact or unsets it if alias is null.
+	 */
+	void setContactAlias(Transaction txn, ContactId c, @Nullable String alias)
+			throws DbException;
+
 	/**
 	 * Sets an alias name for the contact or unsets it if alias is null.
 	 */
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java
index 71a63c9b57f32dc3ba47c6e90b8c3da8e1b62b03..f7e03c5c4112f0ce2692ab052bcd50258793fae0 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java
@@ -163,14 +163,20 @@ class ContactManagerImpl implements ContactManager {
 	}
 
 	@Override
-	public void setContactAlias(ContactId c, @Nullable String alias)
-			throws DbException {
+	public void setContactAlias(Transaction txn, ContactId c,
+			@Nullable String alias) throws DbException {
 		if (alias != null) {
 			int aliasLength = toUtf8(alias).length;
 			if (aliasLength == 0 || aliasLength > MAX_AUTHOR_NAME_LENGTH)
 				throw new IllegalArgumentException();
 		}
-		db.transaction(false, txn -> db.setContactAlias(txn, c, alias));
+		db.setContactAlias(txn, c, alias);
+	}
+
+	@Override
+	public void setContactAlias(ContactId c, @Nullable String alias)
+			throws DbException {
+		db.transaction(false, txn -> setContactAlias(txn, c, alias));
 	}
 
 	@Override
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java
index 1dea4f9df9850cf0b34faed098dfd2cab908abaa..24ecd71c59bc48b21d0f4f1f8bd30ac358ad176d 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java
@@ -204,7 +204,8 @@ public class ContactManagerImplTest extends BrambleMockTestCase {
 
 	@Test(expected = IllegalArgumentException.class)
 	public void testSetContactAliasTooLong() throws Exception {
-		contactManager.setContactAlias(contactId,
+		Transaction txn = new Transaction(null, false);
+		contactManager.setContactAlias(txn, contactId,
 				getRandomString(MAX_AUTHOR_NAME_LENGTH + 1));
 	}
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItemViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItemViewHolder.java
index 1ecd449cd20be111411616bad7c7d0e12c3b4aea..5b1274fd77f42636a8871128391a96cb4302e02f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItemViewHolder.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItemViewHolder.java
@@ -10,7 +10,6 @@ import org.briarproject.briar.android.threaded.BaseThreadItemViewHolder;
 import org.briarproject.briar.android.threaded.ThreadItemAdapter.ThreadItemListener;
 
 import static org.briarproject.bramble.api.identity.AuthorInfo.Status.OURSELVES;
-import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName;
 
 @UiThread
 @NotNullByDefault
@@ -37,8 +36,7 @@ class JoinMessageItemViewHolder
 		if (item.isInitial()) {
 			textView.setText(R.string.groups_member_created_you);
 		} else {
-			String name = getContactDisplayName(item.getAuthor(),
-					item.getAuthorInfo().getAlias());
+			String name = item.getAuthorName();
 			textView.setText(getContext()
 					.getString(R.string.groups_member_joined, name));
 		}
@@ -46,8 +44,7 @@ class JoinMessageItemViewHolder
 
 	private void bind(JoinMessageItem item) {
 		Context ctx = getContext();
-		String name = getContactDisplayName(item.getAuthor(),
-				item.getAuthorInfo().getAlias());
+		String name = item.getAuthorName();
 
 		if (item.isInitial()) {
 			textView.setText(
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItem.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItem.java
index 79cc0ab186a57e210c76993c6a99c685be2cc918..4a9a516409ab29995483c29f09b0a18e9f7f8546 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItem.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItem.java
@@ -10,6 +10,7 @@ import javax.annotation.Nullable;
 import javax.annotation.concurrent.NotThreadSafe;
 
 import static org.briarproject.briar.android.threaded.ThreadItemAdapter.UNDEFINED;
+import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName;
 
 @NotThreadSafe
 @NotNullByDefault
@@ -70,6 +71,13 @@ public abstract class ThreadItem implements MessageNode {
 		return authorInfo;
 	}
 
+	/**
+	 * Returns the author's name, with an alias if one exists.
+	 */
+	public String getAuthorName() {
+		return getContactDisplayName(author, authorInfo.getAlias());
+	}
+
 	@Override
 	public void setLevel(int level) {
 		this.level = level;
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
index 12cbbb134474c2c16b1e02c1d7adf35828b9c968..27c24083c9dea7e496370285aef55c68a1976df0 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
@@ -141,7 +141,7 @@ public class UiUtils {
 	}
 
 	public static Spanned getSpanned(@Nullable String s) {
-		// TODO move to HtmlCompat
+		// TODO move to HtmlCompat #1435
 		// https://commonsware.com/blog/2018/05/29/at-last-htmlcompat.html
 		return Html.fromHtml(s);
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java
index defc19c534241f933defe27f7941c534dddc1db9..2879957aa782ea7e53bc023ee9110f9971cdf3f7 100644
--- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java
@@ -421,19 +421,14 @@ class IntroductionManagerImpl extends ConversationClientImpl
 				if (ss == null) throw new AssertionError();
 				MessageType type = meta.getMessageType();
 				if (type == REQUEST) {
-					messages.add(
-							parseInvitationRequest(txn, contactGroupId, m,
-									meta, status, ss.bdfSession, authorInfos));
+					messages.add(parseInvitationRequest(txn, contactGroupId, m,
+							meta, status, ss.bdfSession, authorInfos));
 				} else if (type == ACCEPT) {
-					messages.add(
-							parseInvitationResponse(txn, contactGroupId, m,
-									meta, status, ss.bdfSession, authorInfos,
-									true));
+					messages.add(parseInvitationResponse(txn, contactGroupId, m,
+							meta, status, ss.bdfSession, authorInfos, true));
 				} else if (type == DECLINE) {
-					messages.add(
-							parseInvitationResponse(txn, contactGroupId, m,
-									meta, status, ss.bdfSession, authorInfos,
-									false));
+					messages.add(parseInvitationResponse(txn, contactGroupId, m,
+							meta, status, ss.bdfSession, authorInfos, false));
 				}
 			}
 			return messages;
diff --git a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
index e8519e21905c7d5a22bfbb924a8bf790ea9ff456..f0d37a2c36828230b278d53105eb03309b2db4a5 100644
--- a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
@@ -174,6 +174,10 @@ public class TestDataCreatorImpl implements TestDataCreator {
 			ContactId contactId = contactManager
 					.addContact(txn, author, localAuthorId, secretKey,
 							timestamp, true, verified, true);
+			if (random.nextBoolean()) {
+				contactManager
+						.setContactAlias(txn, contactId, getRandomAuthorName());
+			}
 			transportPropertyManager.addRemoteProperties(txn, contactId, props);
 			contact = db.getContact(txn, contactId);
 			db.commitTransaction(txn);
@@ -202,10 +206,13 @@ public class TestDataCreatorImpl implements TestDataCreator {
 		return authorFactory.createLocalAuthor(name, publicKey, privateKey);
 	}
 
-	private LocalAuthor getRandomAuthor() {
+	private String getRandomAuthorName() {
 		int i = random.nextInt(AUTHOR_NAMES.length);
-		String authorName = AUTHOR_NAMES[i];
-		return getAuthor(authorName);
+		return AUTHOR_NAMES[i];
+	}
+
+	private LocalAuthor getRandomAuthor() {
+		return getAuthor(getRandomAuthorName());
 	}
 
 	private SecretKey getSecretKey() {