diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt
index 9557b64d133914253ab90f17f091a6fab3519666..a1854e9fcd9dfadbc3beb975b653cb22c244c585 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt
@@ -36,6 +36,11 @@ import org.briarproject.briar.BriarCoreModule
 import org.briarproject.briar.api.forum.ForumManager
 import org.briarproject.briar.api.forum.ForumSharingManager
 import org.briarproject.briar.api.introduction.IntroductionManager
+import org.briarproject.briar.api.privategroup.GroupMessageFactory
+import org.briarproject.briar.api.privategroup.PrivateGroupFactory
+import org.briarproject.briar.api.privategroup.PrivateGroupManager
+import org.briarproject.briar.api.privategroup.invitation.GroupInvitationFactory
+import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager
 import org.briarproject.briar.api.test.TestDataCreator
 import org.briarproject.briar.desktop.testdata.DeterministicTestDataCreator
 import org.briarproject.briar.desktop.threading.BriarExecutors
@@ -87,4 +92,14 @@ internal interface BriarDesktopTestApp : BrambleCoreEagerSingletons, BriarCoreEa
     fun getForumManager(): ForumManager
 
     fun getForumSharingManager(): ForumSharingManager
+
+    fun getPrivateGroupManager(): PrivateGroupManager
+
+    fun getPrivateGroupFactory(): PrivateGroupFactory
+
+    fun getGroupMessageFactory(): GroupMessageFactory
+
+    fun getGroupInvitationManager(): GroupInvitationManager
+
+    fun getGroupInvitationFactory(): GroupInvitationFactory
 }
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt
index 20b2397b59fafe65d4f0a6cb69f581fcf6d8bee8..e8347b9cce5e8df403ad83342124f9c0debe69d1 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt
@@ -17,6 +17,7 @@
  */
 
 @file:Suppress("HardCodedStringLiteral")
+
 package org.briarproject.briar.desktop
 
 import mu.KotlinLogging
@@ -32,8 +33,11 @@ import org.briarproject.bramble.api.identity.LocalAuthor
 import org.briarproject.bramble.api.plugin.TransportId
 import org.briarproject.bramble.api.properties.TransportProperties
 import org.briarproject.bramble.api.versioning.event.ClientVersionUpdatedEvent
+import org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER
 import org.briarproject.briar.api.forum.ForumManager
 import org.briarproject.briar.api.forum.event.ForumInvitationRequestReceivedEvent
+import org.briarproject.briar.api.privategroup.PrivateGroupManager
+import org.briarproject.briar.api.privategroup.event.GroupInvitationRequestReceivedEvent
 import org.briarproject.briar.api.sharing.SharingManager.SharingStatus.SHAREABLE
 import org.briarproject.briar.desktop.utils.FileUtils
 import java.io.IOException
@@ -157,8 +161,10 @@ object TestUtils {
     internal fun List<BriarDesktopTestApp>.createForumForAll() {
         if (isEmpty()) return
 
-        // create forum
         val creator = get(0)
+        val contacts = drop(1)
+
+        // create forum
         val forum = creator.getForumManager().addForum("Shared Forum")
 
         // invite all contacts
@@ -174,7 +180,7 @@ object TestUtils {
         }
 
         // accept invitation at all contacts
-        drop(1).forEach { app ->
+        contacts.forEach { app ->
             app.getEventBus().addListenerOnce { e ->
                 if (e is ForumInvitationRequestReceivedEvent) {
                     val contact = app.getContactManager().getContact(e.contactId)
@@ -185,6 +191,52 @@ object TestUtils {
             }
         }
     }
+
+    internal fun List<BriarDesktopTestApp>.createPrivateGroupForAll() {
+        if (isEmpty()) return
+
+        val creator = get(0)
+        val contacts = drop(1)
+
+        // create private group
+        val author = creator.getIdentityManager().localAuthor
+        val group = creator.getPrivateGroupFactory().createPrivateGroup("Shared Private Group", author)
+        val joinMsg = creator.getGroupMessageFactory().createJoinMessage(
+            group.id, System.currentTimeMillis(), author
+        )
+        creator.getPrivateGroupManager().addPrivateGroup(group, joinMsg, true)
+
+        // invite all contacts
+        creator.getEventBus().addListener { e ->
+            if (e is ClientVersionUpdatedEvent && e.clientVersion.clientId == PrivateGroupManager.CLIENT_ID) {
+                creator.getBriarExecutors().onDbThread {
+                    val contact = creator.getContactManager().getContact(e.contactId)
+                    val invitationManager = creator.getGroupInvitationManager()
+                    if (invitationManager.getSharingStatus(contact, group.id) == SHAREABLE) {
+                        val timestamp = System.currentTimeMillis()
+                        val signature = creator.getGroupInvitationFactory().signInvitation(
+                            contact, group.id, timestamp, author.privateKey
+                        )
+                        invitationManager.sendInvitation(
+                            group.id, e.contactId, null,
+                            timestamp, signature, NO_AUTO_DELETE_TIMER
+                        )
+                    }
+                }
+            }
+        }
+
+        // accept invitation at all contacts
+        contacts.forEach { app ->
+            app.getEventBus().addListenerOnce { e ->
+                if (e is GroupInvitationRequestReceivedEvent) {
+                    app.getGroupInvitationManager().respondToInvitation(e.contactId, group, true)
+                    return@addListenerOnce true
+                }
+                false
+            }
+        }
+    }
 }
 
 fun EventBus.addListenerOnce(listener: (Event) -> Boolean) =
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt
index db1857b22e2236f4c6914c97a4165f978187d82d..a7fdf339aeafdd061fb3a1d33ba66af598524f7b 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt
@@ -20,6 +20,7 @@ package org.briarproject.briar.desktop
 
 import org.briarproject.briar.desktop.TestUtils.connectAllInstantly
 import org.briarproject.briar.desktop.TestUtils.createForumForAll
+import org.briarproject.briar.desktop.TestUtils.createPrivateGroupForAll
 
 fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob", "eve")) { // NON-NLS
     forEach {
@@ -27,4 +28,5 @@ fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob", "eve")) { /
     }
     connectAllInstantly()
     createForumForAll()
+    createPrivateGroupForAll()
 }.run()
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt
index c13c5e994369c29f0007acff8d7747bb60c7a31c..f37314b83297b55b9f3885e44af17319c5e629f1 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt
@@ -20,6 +20,7 @@ package org.briarproject.briar.desktop
 
 import org.briarproject.briar.desktop.TestUtils.connectAllInstantly
 import org.briarproject.briar.desktop.TestUtils.createForumForAll
+import org.briarproject.briar.desktop.TestUtils.createPrivateGroupForAll
 
 fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob")) { // NON-NLS
     forEach {
@@ -27,4 +28,5 @@ fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob")) { // NON-N
     }
     connectAllInstantly()
     createForumForAll()
+    createPrivateGroupForAll()
 }.run()