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 1b0cae45c3323ff9e24e3b9a0dc855d98646b8d5..70dc74982218b28c8c2f5f5f7fa067f9508c816d 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
@@ -281,6 +281,9 @@ constructor(
                 else ->
                     throw IllegalArgumentException("Only introduction requests are supported for the time being.")
             }
+            // reload all messages to also show request response message
+            // todo: might be better to have an event to react to, also for (all) outgoing messages
+            loadMessages(txn, contactItem.value!!)
         }
     }
 }
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt b/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt
index 1306fdcf55e42ea72e6cdb43f1ec962c9bba080c..2c91bde366d5f88de22abcb18d3b7d3dfba501cc 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt
@@ -5,11 +5,13 @@ import org.briarproject.bramble.BrambleCoreEagerSingletons
 import org.briarproject.bramble.BrambleCoreModule
 import org.briarproject.bramble.api.account.AccountManager
 import org.briarproject.bramble.api.contact.ContactManager
+import org.briarproject.bramble.api.event.EventBus
 import org.briarproject.bramble.api.identity.IdentityManager
 import org.briarproject.bramble.api.lifecycle.LifecycleManager
 import org.briarproject.bramble.api.lifecycle.ShutdownManager
 import org.briarproject.briar.BriarCoreEagerSingletons
 import org.briarproject.briar.BriarCoreModule
+import org.briarproject.briar.api.introduction.IntroductionManager
 import org.briarproject.briar.api.test.TestDataCreator
 import org.briarproject.briar.desktop.testdata.DeterministicTestDataCreator
 import org.briarproject.briar.desktop.ui.BriarUi
@@ -28,8 +30,12 @@ internal interface BriarDesktopTestApp : BrambleCoreEagerSingletons, BriarCoreEa
 
     fun getBriarUi(): BriarUi
 
+    fun getEventBus(): EventBus
+
     fun getIdentityManager(): IdentityManager
 
+    fun getIntroductionManager(): IntroductionManager
+
     fun getContactManager(): ContactManager
 
     fun getSecureRandom(): SecureRandom
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt
index fb6ef1ad1114a87989bc8181ddc8fb0447e6f8dc..02c07e0715a91b33cd2e720899696582f62476ec 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt
@@ -23,13 +23,17 @@ object TestUtils {
         forEachIndexed { i, app1 ->
             forEachIndexed inner@{ k, app2 ->
                 if (i >= k) return@inner
-                val cm1 = app1.getContactManager()
-                val cm2 = app2.getContactManager()
-                val name1 = app1.getIdentityManager().localAuthor.name
-                val name2 = app2.getIdentityManager().localAuthor.name
-                cm1.addPendingContact(cm2.handshakeLink, name2)
-                cm2.addPendingContact(cm1.handshakeLink, name1)
+                connectApps(app1, app2)
             }
         }
     }
+
+    internal fun connectApps(app1: BriarDesktopTestApp, app2: BriarDesktopTestApp) {
+        val cm1 = app1.getContactManager()
+        val cm2 = app2.getContactManager()
+        val name1 = app1.getIdentityManager().localAuthor.name
+        val name2 = app2.getIdentityManager().localAuthor.name
+        cm1.addPendingContact(cm2.handshakeLink, name2)
+        cm2.addPendingContact(cm1.handshakeLink, name1)
+    }
 }
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt
new file mode 100644
index 0000000000000000000000000000000000000000..14ecdd29c28e27caa8ae6dd5edb333aca910249c
--- /dev/null
+++ b/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt
@@ -0,0 +1,36 @@
+package org.briarproject.briar.desktop
+
+import org.briarproject.bramble.api.contact.Contact
+import org.briarproject.bramble.api.contact.event.ContactAddedEvent
+import org.briarproject.briar.desktop.TestUtils.connectApps
+
+fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob", "eve")) {
+    val alice = this[0]
+    val bob = this[1]
+    val eve = this[2]
+
+    listOf(bob, eve).forEach {
+        it.getDeterministicTestDataCreator().createTestData(1, 2, 0, 0, 0)
+        connectApps(alice, it)
+    }
+
+    // alice introduces eve to bob
+    alice.run {
+        var eve: Contact? = null
+        var bob: Contact? = null
+        getEventBus().addListener {
+            when (it) {
+                is ContactAddedEvent -> {
+                    val contact = getContactManager().getContact(it.contactId)
+                    when (contact.author.name) {
+                        "eve" -> eve = contact
+                        "bob" -> bob = contact
+                    }
+                    if (eve != null && bob != null) {
+                        getIntroductionManager().makeIntroduction(eve!!, bob!!, "Eve and Bob")
+                    }
+                }
+            }
+        }
+    }
+}.run()
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
index 8b8da8e91e4f0afc5d0c47ff56cc0f8dc06581a2..9c336eee4d4378a5807c5969539eff434dd8926d 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
@@ -82,8 +82,7 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
         numPrivateGroups: Int,
         numPrivateGroupPosts: Int,
     ) {
-        require(numContacts != 0)
-        require(numPrivateGroups != 0)
+        require(numContacts != 0 || numPrivateGroups != 0)
         require(!(avatarPercent < 0 || avatarPercent > 100))
         ioExecutor.execute {
             try {