diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt
index 1b01dd7d213e24fe9e55648b6f44e548e6ef6602..fc95fb753f3cf66d3516cbf55c9cd825fcdf7a78 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt
@@ -48,7 +48,7 @@ fun ContactCard(
         Row(horizontalArrangement = Arrangement.SpaceBetween) {
             Row(modifier = Modifier.align(Alignment.CenterVertically).padding(horizontal = 16.dp)) {
                 // TODO Pull profile pictures
-                ProfileCircle(36.dp, contactItem.contact.author.id.bytes)
+                ProfileCircle(36.dp, contactItem.authorId.bytes)
                 // Draw notification badges
                 if (contactItem.unread > 0) {
                     Canvas(
@@ -64,7 +64,7 @@ fun ContactCard(
                 }
                 Column(modifier = Modifier.align(Alignment.CenterVertically).padding(start = 12.dp)) {
                     Text(
-                        contactItem.contact.author.name,
+                        contactItem.displayName,
                         fontSize = 14.sp,
                         modifier = Modifier.align(Alignment.Start).padding(bottom = 2.dp)
                     )
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactInfoDrawer.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactInfoDrawer.kt
index a0732821932654c0afdad88ad942abafb77c1d13..43462c4da9fe403ef300db44546669ca03b86490 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactInfoDrawer.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactInfoDrawer.kt
@@ -1,7 +1,6 @@
 package org.briarproject.briar.desktop.contact
 
 import androidx.compose.runtime.Composable
-import org.briarproject.bramble.api.contact.Contact
 import org.briarproject.briar.desktop.contact.ContactInfoDrawerState.MakeIntro
 import org.briarproject.briar.desktop.introduction.ContactDrawerMakeIntro
 
@@ -14,11 +13,11 @@ enum class ContactInfoDrawerState {
 
 @Composable
 fun ContactInfoDrawer(
-    contact: Contact,
+    contactItem: ContactItem,
     setInfoDrawer: (Boolean) -> Unit,
     drawerState: ContactInfoDrawerState
 ) {
     when (drawerState) {
-        MakeIntro -> ContactDrawerMakeIntro(contact, setInfoDrawer)
+        MakeIntro -> ContactDrawerMakeIntro(contactItem, setInfoDrawer)
     }
 }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt
index d169ac99ef21cfb9103a2be8feba887fda723b2b..62ebc584ecb602dde7bd4478d65345c8fc6f51a5 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt
@@ -1,20 +1,31 @@
 package org.briarproject.briar.desktop.contact
 
 import org.briarproject.bramble.api.contact.Contact
+import org.briarproject.bramble.api.contact.ContactId
+import org.briarproject.bramble.api.identity.AuthorId
 import org.briarproject.briar.api.client.MessageTracker
 import kotlin.math.max
 
 data class ContactItem(
-    val contact: Contact,
+    val contactId: ContactId,
+    val authorId: AuthorId,
+    val name: String,
+    val alias: String?,
     val isConnected: Boolean,
     val isEmpty: Boolean,
     val unread: Int,
     val timestamp: Long
 ) {
 
+    val displayName = if (alias == null) name else "$alias ($name)"
+
     constructor(contact: Contact, isConnected: Boolean, groupCount: MessageTracker.GroupCount) :
         this(
-            contact, isConnected,
+            contactId = contact.id,
+            authorId = contact.author.id,
+            name = contact.author.name,
+            alias = contact.alias,
+            isConnected = isConnected,
             isEmpty = groupCount.msgCount == 0,
             unread = groupCount.unreadCount,
             timestamp = groupCount.latestMsgTime
@@ -32,10 +43,6 @@ data class ContactItem(
     }
 
     fun updateAlias(a: String?): ContactItem {
-        return copy(contact = contact.updateAlias(a))
-    }
-
-    private fun Contact.updateAlias(a: String?): Contact {
-        return Contact(id, author, localAuthorId, a, handshakePublicKey, isVerified)
+        return copy(alias = a)
     }
 }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt
index 16b1f0a3bc25f02e4b428488ca36781b67e1af3a..fd0d2957599f867b943d1134996179fd6cd8fbc0 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt
@@ -51,8 +51,8 @@ fun ContactList(
                 items(contactList) { contactItem ->
                     ContactCard(
                         contactItem,
-                        { selectContact(contactItem.contact.id) },
-                        isSelected(contactItem.contact.id)
+                        { selectContact(contactItem.contactId) },
+                        isSelected(contactItem.contactId)
                     )
                 }
             }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt
index 6cd88d2945616bc263f7c851b6c575bc467dace8..254ce8fe4ed9f48d0c2fb13f3db319de203b41e1 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt
@@ -4,7 +4,6 @@ import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateOf
 import mu.KotlinLogging
 import org.briarproject.bramble.api.connection.ConnectionRegistry
-import org.briarproject.bramble.api.contact.Contact
 import org.briarproject.bramble.api.contact.ContactId
 import org.briarproject.bramble.api.contact.ContactManager
 import org.briarproject.bramble.api.contact.event.ContactAliasChangedEvent
@@ -44,9 +43,8 @@ constructor(
 
     fun isSelected(contactId: ContactId) = _selectedContactId.value == contactId
 
-    override fun filterContact(contact: Contact) =
-        // todo: also filter on alias
-        contact.author.name.contains(_filterBy.value, ignoreCase = true)
+    override fun filterContactItem(contactItem: ContactItem) =
+        contactItem.displayName.contains(_filterBy.value, ignoreCase = true)
 
     fun setFilterBy(filter: String) {
         _filterBy.value = filter
@@ -58,7 +56,7 @@ constructor(
 
         // reset selected contact to null if not available after filtering
         val id = _selectedContactId.value
-        if (id != null && !contactList.map { it.contact.id }.contains(id)) {
+        if (id != null && !contactList.map { it.contactId }.contains(id)) {
             _selectedContactId.value = null
         }
     }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
index 157e028f680982d1a629373808fd3768355971d0..46a6c68684cdc70754470313ec1659a4c83a2a2c 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
@@ -3,7 +3,6 @@ package org.briarproject.briar.desktop.contact
 import androidx.compose.runtime.mutableStateListOf
 import mu.KotlinLogging
 import org.briarproject.bramble.api.connection.ConnectionRegistry
-import org.briarproject.bramble.api.contact.Contact
 import org.briarproject.bramble.api.contact.ContactId
 import org.briarproject.bramble.api.contact.ContactManager
 import org.briarproject.bramble.api.contact.event.ContactAddedEvent
@@ -33,7 +32,7 @@ abstract class ContactsViewModel(
 
     val contactList: List<ContactItem> = _filteredContactList
 
-    protected open fun filterContact(contact: Contact) = true
+    protected open fun filterContactItem(contactItem: ContactItem) = true
 
     open fun loadContacts() {
         _fullContactList.apply {
@@ -55,7 +54,7 @@ abstract class ContactsViewModel(
     protected open fun updateFilteredList() {
         _filteredContactList.apply {
             clear()
-            addAll(_fullContactList.filter { filterContact(it.contact) }.sortedByDescending { it.timestamp })
+            addAll(_fullContactList.filter(::filterContactItem).sortedByDescending { it.timestamp })
         }
     }
 
@@ -81,12 +80,12 @@ abstract class ContactsViewModel(
     }
 
     protected open fun updateItem(contactId: ContactId, update: (ContactItem) -> ContactItem) {
-        _fullContactList.replaceFirst({ it.contact.id == contactId }, update)
+        _fullContactList.replaceFirst({ it.contactId == contactId }, update)
         updateFilteredList()
     }
 
     protected open fun removeItem(contactId: ContactId) {
-        _fullContactList.removeFirst { it.contact.id == contactId }
+        _fullContactList.removeFirst { it.contactId == contactId }
         updateFilteredList()
     }
 }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationHeader.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationHeader.kt
index 8f28474fe8fe0c501ff327f7348012d715c9da91..deeca393355e666042958afdb4135950c970ba6a 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationHeader.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationHeader.kt
@@ -42,7 +42,7 @@ fun ConversationHeader(
 
     Box(modifier = Modifier.fillMaxWidth().height(HEADER_SIZE + 1.dp)) {
         Row(modifier = Modifier.align(Alignment.Center)) {
-            ProfileCircle(36.dp, contactItem.contact.author.id.bytes)
+            ProfileCircle(36.dp, contactItem.authorId.bytes)
             Canvas(
                 modifier = Modifier.align(Alignment.CenterVertically),
                 onDraw = {
@@ -54,7 +54,7 @@ fun ConversationHeader(
                 }
             )
             Text(
-                contactItem.contact.author.name,
+                contactItem.displayName,
                 modifier = Modifier.align(Alignment.CenterVertically).padding(start = 12.dp),
                 fontSize = 20.sp
             )
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt
index 97604a38d77f6725c8ae7de446b663cca6a40a2a..8390eb90a048f227da1e3020f47c7d32036d24d8 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt
@@ -108,7 +108,7 @@ fun ConversationScreen(
                         RoundedCornerShape(topStart = 10.dp, bottomStart = 10.dp)
                     )
             ) {
-                ContactInfoDrawer(contactItem.contact, setInfoDrawer, contactDrawerState)
+                ContactInfoDrawer(contactItem, setInfoDrawer, contactDrawerState)
             }
         }
     }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
index e157bf065fc5194d0894285f3f7df21f3211fc9e..affc255f9a9a4a2b55502f5ac0cbd898d9f687db 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
@@ -110,7 +110,7 @@ constructor(
 
     @Throws(DbException::class)
     private fun createMessage(text: String): PrivateMessage {
-        val groupId = messagingManager.getContactGroup(_contactItem.value!!.contact).id
+        val groupId = messagingManager.getConversationId(_contactItem.value!!.contactId)
         // todo: this API call needs a database transaction context
         // val timestamp = conversationManager.getTimestampForOutgoingMessage(_contactId.value!!)
         val timestamp = Date().time
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/introduction/ContactDrawerMakeIntro.kt b/src/main/kotlin/org/briarproject/briar/desktop/introduction/ContactDrawerMakeIntro.kt
index c10f6f4519bc0922cf8f5f9065809440158a6e67..e2c12e52f778a113df66011e052d9082661ea1b8 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/introduction/ContactDrawerMakeIntro.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/introduction/ContactDrawerMakeIntro.kt
@@ -26,8 +26,8 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import org.briarproject.bramble.api.contact.Contact
 import org.briarproject.briar.desktop.contact.ContactCard
+import org.briarproject.briar.desktop.contact.ContactItem
 import org.briarproject.briar.desktop.contact.ProfileCircle
 import org.briarproject.briar.desktop.ui.Constants.HEADER_SIZE
 import org.briarproject.briar.desktop.ui.HorizontalDivider
@@ -38,12 +38,12 @@ import java.util.Locale
 
 @Composable
 fun ContactDrawerMakeIntro(
-    contact: Contact,
+    contactItem: ContactItem,
     setInfoDrawer: (Boolean) -> Unit,
     viewModel: IntroductionViewModel = viewModel(),
 ) {
-    LaunchedEffect(contact) {
-        viewModel.setFirstContact(contact)
+    LaunchedEffect(contactItem) {
+        viewModel.setFirstContact(contactItem)
     }
     if (!viewModel.secondScreen.value) {
         Surface {
@@ -56,7 +56,7 @@ fun ContactDrawerMakeIntro(
                         Icon(Icons.Filled.Close, i18n("access.introduction.close"))
                     }
                     Text(
-                        text = i18nF("introduction.title_first", contact.author.name),
+                        text = i18nF("introduction.title_first", contactItem.displayName),
                         fontSize = 16.sp,
                         modifier = Modifier.align(Alignment.CenterVertically)
                     )
@@ -66,7 +66,7 @@ fun ContactDrawerMakeIntro(
                     items(viewModel.contactList) { contactItem ->
                         ContactCard(
                             contactItem,
-                            { viewModel.setSecondContact(contactItem.contact) },
+                            { viewModel.setSecondContact(contactItem) },
                             false
                         )
                     }
@@ -90,13 +90,13 @@ fun ContactDrawerMakeIntro(
             }
             Row(Modifier.fillMaxWidth().padding(12.dp), horizontalArrangement = Arrangement.SpaceAround) {
                 Column(Modifier.align(Alignment.CenterVertically)) {
-                    ProfileCircle(36.dp, viewModel.firstContact.value!!.author.id.bytes)
-                    Text(viewModel.firstContact.value!!.author.name, Modifier.padding(top = 4.dp), Color.White, 16.sp)
+                    ProfileCircle(36.dp, viewModel.firstContact.value!!.authorId.bytes)
+                    Text(viewModel.firstContact.value!!.displayName, Modifier.padding(top = 4.dp), Color.White, 16.sp)
                 }
                 Icon(Icons.Filled.SwapHoriz, i18n("access.swap"), modifier = Modifier.size(48.dp))
                 Column(Modifier.align(Alignment.CenterVertically)) {
-                    ProfileCircle(36.dp, viewModel.secondContact.value!!.author.id.bytes)
-                    Text(viewModel.secondContact.value!!.author.name, Modifier.padding(top = 4.dp), Color.White, 16.sp)
+                    ProfileCircle(36.dp, viewModel.secondContact.value!!.authorId.bytes)
+                    Text(viewModel.secondContact.value!!.displayName, Modifier.padding(top = 4.dp), Color.White, 16.sp)
                 }
             }
             Row(Modifier.padding(8.dp)) {
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt
index e8b2e63bfdfba6959305f49b6c85c6b3f1830001..c57773fb6156f3273b9e5da884c63d987a2cae93 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt
@@ -3,10 +3,10 @@ package org.briarproject.briar.desktop.introduction
 import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateOf
 import org.briarproject.bramble.api.connection.ConnectionRegistry
-import org.briarproject.bramble.api.contact.Contact
 import org.briarproject.bramble.api.contact.ContactManager
 import org.briarproject.bramble.api.event.EventBus
 import org.briarproject.briar.api.conversation.ConversationManager
+import org.briarproject.briar.desktop.contact.ContactItem
 import org.briarproject.briar.desktop.contact.ContactsViewModel
 import javax.inject.Inject
 
@@ -19,24 +19,24 @@ constructor(
     eventBus: EventBus,
 ) : ContactsViewModel(contactManager, conversationManager, connectionRegistry, eventBus) {
 
-    private val _firstContact = mutableStateOf<Contact?>(null)
-    private val _secondContact = mutableStateOf<Contact?>(null)
+    private val _firstContact = mutableStateOf<ContactItem?>(null)
+    private val _secondContact = mutableStateOf<ContactItem?>(null)
     private val _secondScreen = mutableStateOf(false)
     private val _introductionMessage = mutableStateOf("")
 
-    val firstContact: State<Contact?> = _firstContact
-    val secondContact: State<Contact?> = _secondContact
+    val firstContact: State<ContactItem?> = _firstContact
+    val secondContact: State<ContactItem?> = _secondContact
     val secondScreen: State<Boolean> = _secondScreen
     val introductionMessage: State<String> = _introductionMessage
 
-    fun setFirstContact(contact: Contact) {
-        _firstContact.value = contact
+    fun setFirstContact(contactItem: ContactItem) {
+        _firstContact.value = contactItem
         loadContacts()
         backToFirstScreen()
     }
 
-    fun setSecondContact(contact: Contact) {
-        _secondContact.value = contact
+    fun setSecondContact(contactItem: ContactItem) {
+        _secondContact.value = contactItem
         _secondScreen.value = true
     }
 
@@ -49,7 +49,7 @@ constructor(
         _introductionMessage.value = msg
     }
 
-    override fun filterContact(contact: Contact): Boolean {
-        return _firstContact.value?.id != contact.id
+    override fun filterContactItem(contactItem: ContactItem): Boolean {
+        return _firstContact.value?.contactId != contactItem.contactId
     }
 }