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 2ac199acf78194d66dd3a23dd60c9b52efa298ca..a09a6189205c4da4b2f4a9a05e38dfac52e82e9d 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactCard.kt
@@ -51,7 +51,7 @@ fun main() = preview(
 ) {
     ContactCard(
         RealContactItem(
-            contactId = ContactId(0),
+            idWrapper = RealContactIdWrapper(ContactId(0)),
             authorId = AuthorId(getRandomId()),
             name = getStringParameter("name"),
             alias = getStringParameter("alias"),
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactIdWrapper.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactIdWrapper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..bdca777412419b1f6c6cbb45413d1c3c97b01677
--- /dev/null
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactIdWrapper.kt
@@ -0,0 +1,3 @@
+package org.briarproject.briar.desktop.contact
+
+sealed interface ContactIdWrapper
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 7509758e922afb0c223f5222b3a2dfe2fadfc080..ddf63cf950d93fd9365404b053a1eca8c1ea8091 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactItem.kt
@@ -2,7 +2,7 @@ package org.briarproject.briar.desktop.contact
 
 sealed interface ContactItem {
 
-    val contactId: Any
+    val idWrapper: ContactIdWrapper
     val displayName: String
     val isConnected: Boolean
     val isEmpty: Boolean
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 66b96b6a6d2bc078e3775f5a325bae90b73084fb..f8aca611b53ed9193b190eeda855cb30d4a7eca0 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt
@@ -24,8 +24,8 @@ import org.briarproject.briar.desktop.ui.Constants.HEADER_SIZE
 @Composable
 fun ContactList(
     contactList: List<ContactItem>,
-    isSelected: (Any) -> Boolean,
-    selectContact: (Any) -> Unit,
+    isSelected: (ContactItem) -> Boolean,
+    selectContact: (ContactItem) -> Unit,
     filterBy: String,
     setFilterBy: (String) -> Unit,
 ) {
@@ -50,8 +50,8 @@ fun ContactList(
                 items(contactList) { contactItem ->
                     ContactCard(
                         contactItem,
-                        { selectContact(contactItem.contactId) },
-                        isSelected(contactItem.contactId)
+                        { selectContact(contactItem) },
+                        isSelected(contactItem)
                     )
                 }
             }
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 0e671a526743ca1bc5a6453facd1eab50667e481..f10329afe1b4af4865516fd34cd569356b60bd7c 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactListViewModel.kt
@@ -40,16 +40,16 @@ constructor(
     }
 
     private val _filterBy = mutableStateOf("")
-    private val _selectedContactId = mutableStateOf<Any?>(null)
+    private val _selectedContactId = mutableStateOf<ContactIdWrapper?>(null)
 
     val filterBy = _filterBy.asState()
     val selectedContactId = _selectedContactId.asState()
 
-    fun selectContact(contactId: Any) {
-        _selectedContactId.value = contactId
+    fun selectContact(contactItem: ContactItem) {
+        _selectedContactId.value = contactItem.idWrapper
     }
 
-    fun isSelected(contactId: Any) = _selectedContactId.value == contactId
+    fun isSelected(contactItem: ContactItem) = _selectedContactId.value == contactItem.idWrapper
 
     override fun filterContactItem(contactItem: ContactItem) =
         contactItem.displayName.contains(_filterBy.value, ignoreCase = true)
@@ -64,7 +64,7 @@ constructor(
 
         // reset selected contact to null if not available after filtering
         val id = _selectedContactId.value
-        if (id != null && !contactList.map { it.contactId }.contains(id)) {
+        if (id != null && !contactList.map { it.idWrapper }.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 4fc4251f4d8a10f93c92fd05a7f5862739c5ab13..92c3fcc22ecd04e99b1208fa13be176afdb088e7 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactsViewModel.kt
@@ -106,7 +106,7 @@ abstract class ContactsViewModel(
         _fullContactList.replaceFirst(
             {
                 if (it is RealContactItem)
-                    it.contactId == contactId
+                    it.idWrapper.contactId == contactId
                 else false
             },
             update
@@ -117,7 +117,7 @@ abstract class ContactsViewModel(
     protected open fun removeItem(contactId: ContactId) {
         _fullContactList.removeFirst {
             if (it is RealContactItem)
-                it.contactId == contactId
+                it.idWrapper.contactId == contactId
             else false
         }
         updateFilteredList()
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactIdWrapper.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactIdWrapper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..dd1b013a7ae01a75e3a0a1d0c61391e38f85484b
--- /dev/null
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactIdWrapper.kt
@@ -0,0 +1,5 @@
+package org.briarproject.briar.desktop.contact
+
+import org.briarproject.bramble.api.contact.PendingContactId
+
+class PendingContactIdWrapper(val pendingContactId: PendingContactId) : ContactIdWrapper
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactItem.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactItem.kt
index 1472c4c23d50c0ad0ba1b85624f73f404737b7b1..5610e7a1b0c6ed391920f6654dd18fcd656f2679 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactItem.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/PendingContactItem.kt
@@ -1,10 +1,9 @@
 package org.briarproject.briar.desktop.contact
 
 import org.briarproject.bramble.api.contact.PendingContact
-import org.briarproject.bramble.api.contact.PendingContactId
 
 data class PendingContactItem(
-    override val contactId: PendingContactId,
+    override val idWrapper: PendingContactIdWrapper,
     val name: String,
     val alias: String?,
     override val isConnected: Boolean,
@@ -16,7 +15,7 @@ data class PendingContactItem(
     override val displayName = if (alias == null) name else "$alias ($name)"
 
     constructor(contact: PendingContact) : this(
-        contactId = contact.id,
+        idWrapper = PendingContactIdWrapper(contact.id),
         name = contact.alias,
         alias = contact.alias,
         isConnected = false,
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactIdWrapper.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactIdWrapper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..9810426dfd6b29b03eeb09b56cddaa08bab52629
--- /dev/null
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactIdWrapper.kt
@@ -0,0 +1,5 @@
+package org.briarproject.briar.desktop.contact
+
+import org.briarproject.bramble.api.contact.ContactId
+
+class RealContactIdWrapper(val contactId: ContactId) : ContactIdWrapper
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactItem.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactItem.kt
index 100bc579750a1f7b8fc0f10ac9b09dfc26ca9426..05296b805ff99ac08f94847a8ece93b51f129b2f 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactItem.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/RealContactItem.kt
@@ -1,13 +1,12 @@
 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 RealContactItem(
-    override val contactId: ContactId,
+    override val idWrapper: RealContactIdWrapper,
     val authorId: AuthorId,
     val name: String,
     val alias: String?,
@@ -20,7 +19,7 @@ data class RealContactItem(
     override val displayName = if (alias == null) name else "$alias ($name)"
 
     constructor(contact: Contact, isConnected: Boolean, groupCount: MessageTracker.GroupCount) : this(
-        contactId = contact.id,
+        idWrapper = RealContactIdWrapper(contact.id),
         authorId = contact.author.id,
         name = contact.author.name,
         alias = contact.alias,
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt
index 0637a7a5b2128ee650536498cad17d9b012c303a..fe336200cc5ca5027d7887f4e1cf56af675ebb1e 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt
@@ -6,9 +6,9 @@ import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
-import org.briarproject.bramble.api.contact.ContactId
 import org.briarproject.briar.desktop.contact.ContactList
 import org.briarproject.briar.desktop.contact.ContactListViewModel
+import org.briarproject.briar.desktop.contact.RealContactIdWrapper
 import org.briarproject.briar.desktop.ui.UiPlaceholder
 import org.briarproject.briar.desktop.ui.VerticalDivider
 import org.briarproject.briar.desktop.viewmodel.viewModel
@@ -28,8 +28,8 @@ fun PrivateMessageScreen(
         VerticalDivider()
         Column(modifier = Modifier.weight(1f).fillMaxHeight()) {
             val id = viewModel.selectedContactId.value
-            if (id != null && id is ContactId) {
-                ConversationScreen(id)
+            if (id != null && id is RealContactIdWrapper) {
+                ConversationScreen(id.contactId)
             } else {
                 UiPlaceholder()
             }
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 1d7e290db1c29592944581822368f54beddfe164..9887b78aaf3144da8960679f5a08da8be968dd1a 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/introduction/IntroductionViewModel.kt
@@ -60,7 +60,7 @@ constructor(
 
     override fun filterContactItem(contactItem: ContactItem): Boolean {
         return if (contactItem is RealContactItem) {
-            _firstContact.value?.contactId != contactItem.contactId
+            _firstContact.value?.idWrapper != contactItem.idWrapper
         } else false
     }
 }