diff --git a/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt b/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt
index 70ffee14b4374f0339cf097ab8b8e5a85d16f6d7..558810c4656c14904440afdca9ba65a435a6777f 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt
@@ -9,6 +9,7 @@ import androidx.compose.ui.window.Window
 import org.briarproject.bramble.api.account.AccountManager
 import org.briarproject.bramble.api.lifecycle.LifecycleManager
 import org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.RUNNING
+import org.briarproject.briar.api.privategroup.PrivateGroupManager
 import org.briarproject.briar.desktop.contact.ContactListViewModel
 import org.briarproject.briar.desktop.contact.add.remote.AddContactViewModel
 import org.briarproject.briar.desktop.conversation.ConversationViewModel
@@ -54,6 +55,7 @@ constructor(
     private val sidebarViewModel: SidebarViewModel,
     private val accountManager: AccountManager,
     private val lifecycleManager: LifecycleManager,
+    private val privateGroupManager: PrivateGroupManager,
 ) : BriarUi {
 
     companion object {
@@ -103,7 +105,7 @@ constructor(
                             contactListViewModel.loadContacts()
                             screenState = Screen.MAIN
                         }
-                    else ->
+                    else -> {
                         MainScreen(
                             contactListViewModel,
                             conversationViewModel,
@@ -113,6 +115,8 @@ constructor(
                             isDark,
                             setDark
                         )
+                        privateGroupManager.privateGroups.forEach { println(it.name) }
+                    }
                 }
             }
         }
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt
index 50f555bab1f491e2df916dffa3da9cad49e674ae..db867a8e7da7e0ca0dddfc0bcb4e68d8cc1845a3 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt
@@ -1,5 +1,5 @@
 package org.briarproject.briar.desktop
 
 fun main() = RunWithTemporaryAccount {
-    getDeterministicTestDataCreator().createTestData(5, 20, 50)
+    getDeterministicTestDataCreator().createTestData(5, 20, 50, 4, 20)
 }.run()
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestMixedConversations.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestMixedConversations.kt
index 32c1f1447081f99e70f27017e5b37a853c843a89..939e40adb190aef8a410391ac10bac01400109bf 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/TestMixedConversations.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/TestMixedConversations.kt
@@ -1,6 +1,6 @@
 package org.briarproject.briar.desktop
 
 fun main() = RunWithTemporaryAccount {
-    getDeterministicTestDataCreator().createTestData(5, 20, 50)
+    getDeterministicTestDataCreator().createTestData(5, 20, 50, 4, 20)
     getTestDataCreator().createTestData(5, 20, 50, 4, 4, 10)
 }.run()
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt
index 13257a39f4bc4d3359af4050dfbd10d04a5a816f..f60001132cc5d21ba0fee542e5ed4f157857f3ae 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt
@@ -4,7 +4,7 @@ import org.briarproject.briar.desktop.TestUtils.connectAll
 
 fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob")) {
     forEach {
-        it.getDeterministicTestDataCreator().createTestData(5, 20, 50)
+        it.getDeterministicTestDataCreator().createTestData(5, 20, 50, 4, 20)
     }
     connectAll()
 }.run()
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoTemporaryAccounts.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoTemporaryAccounts.kt
index 110456aa4e31a2157741b9670cf686e059966a4f..0b124123956440b2e68cba676183d53c8f71445c 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoTemporaryAccounts.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoTemporaryAccounts.kt
@@ -2,6 +2,6 @@ package org.briarproject.briar.desktop
 
 fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob")) {
     forEach {
-        it.getDeterministicTestDataCreator().createTestData(5, 20, 50)
+        it.getDeterministicTestDataCreator().createTestData(5, 20, 50, 4, 20)
     }
 }.run()
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt
index d62c030b53a78fbca9fa1f660dd15b08be26022c..e22293e3eaf499c8b1f3f3728aefc32f50b5aac3 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt
@@ -14,7 +14,13 @@ interface DeterministicTestDataCreator {
      * @param avatarPercent  Percentage of contacts
      * that will use a random profile image. Between 0 and 100.
      */
-    fun createTestData(numContacts: Int, numPrivateMsgs: Int, avatarPercent: Int)
+    fun createTestData(
+        numContacts: Int,
+        numPrivateMsgs: Int,
+        avatarPercent: Int,
+        numPrivateGroups: Int,
+        numPrivateGroupPosts: Int,
+    )
 
     @IoExecutor
     @Throws(DbException::class)
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 52f09dbc7afc7cd7f963ea146bc590ff2cd0f2e4..917ec636724d6c85c35a22ab8c7663d4b0f97496 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
@@ -23,6 +23,7 @@ import org.briarproject.bramble.api.sync.Group
 import org.briarproject.bramble.api.sync.GroupFactory
 import org.briarproject.bramble.api.sync.GroupId
 import org.briarproject.bramble.api.sync.Message
+import org.briarproject.bramble.api.sync.MessageId
 import org.briarproject.bramble.api.system.Clock
 import org.briarproject.bramble.util.LogUtils
 import org.briarproject.briar.api.autodelete.AutoDeleteConstants
@@ -30,7 +31,13 @@ import org.briarproject.briar.api.avatar.AvatarManager
 import org.briarproject.briar.api.avatar.AvatarMessageEncoder
 import org.briarproject.briar.api.messaging.MessagingManager
 import org.briarproject.briar.api.messaging.PrivateMessageFactory
+import org.briarproject.briar.api.privategroup.GroupMessage
+import org.briarproject.briar.api.privategroup.GroupMessageFactory
+import org.briarproject.briar.api.privategroup.PrivateGroup
+import org.briarproject.briar.api.privategroup.PrivateGroupFactory
+import org.briarproject.briar.api.privategroup.PrivateGroupManager
 import org.briarproject.briar.api.test.TestAvatarCreator
+import org.briarproject.briar.test.TestData
 import java.io.IOException
 import java.io.InputStream
 import java.time.ZoneOffset
@@ -46,10 +53,13 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
     private val authorFactory: AuthorFactory,
     private val clock: Clock,
     private val groupFactory: GroupFactory,
+    private val groupMessageFactory: GroupMessageFactory,
     private val privateMessageFactory: PrivateMessageFactory,
     private val db: DatabaseComponent,
     private val identityManager: IdentityManager,
     private val contactManager: ContactManager,
+    private val privateGroupManager: PrivateGroupManager,
+    private val privateGroupFactory: PrivateGroupFactory,
     private val transportPropertyManager: TransportPropertyManager,
     private val messagingManager: MessagingManager,
     private val testAvatarCreator: TestAvatarCreator,
@@ -66,13 +76,15 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
     override fun createTestData(
         numContacts: Int,
         numPrivateMsgs: Int,
-        avatarPercent: Int
+        avatarPercent: Int,
+        numPrivateGroups: Int,
+        numPrivateGroupPosts: Int,
     ) {
         require(numContacts != 0)
         require(!(avatarPercent < 0 || avatarPercent > 100))
         ioExecutor.execute {
             try {
-                createTestDataOnIoExecutor(numContacts, numPrivateMsgs, avatarPercent)
+                createTestDataOnIoExecutor(numContacts, numPrivateMsgs, avatarPercent, numPrivateGroups, numPrivateGroupPosts)
             } catch (e: DbException) {
                 LogUtils.logException(LOG, Level.WARNING, e)
             }
@@ -84,10 +96,18 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
     private fun createTestDataOnIoExecutor(
         numContacts: Int,
         numPrivateMsgs: Int,
-        avatarPercent: Int
+        avatarPercent: Int,
+        numPrivateGroups: Int,
+        numPrivateGroupPosts: Int
     ) {
         val contacts = createContacts(numContacts, avatarPercent)
         createPrivateMessages(contacts, numPrivateMsgs)
+
+        val privateGroups = createPrivateGroups(contacts, numPrivateGroups)
+        checkNotNull(privateGroups)
+        for (privateGroup in privateGroups) {
+            createRandomPrivateGroupMessages(privateGroup, contacts, numPrivateGroupPosts)
+        }
     }
 
     @Throws(DbException::class)
@@ -326,4 +346,64 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
             throw AssertionError(e)
         }
     }
+
+    @Throws(DbException::class)
+    private fun createPrivateGroups(contacts: List<Contact>, numPrivateGroups: Int): List<PrivateGroup>? {
+        val privateGroups: MutableList<PrivateGroup> = java.util.ArrayList(numPrivateGroups)
+        for (i in 0 until numPrivateGroups) {
+            // create private group
+            val name = TestData.GROUP_NAMES[random.nextInt(TestData.GROUP_NAMES.size)]
+            val privateGroup = privateGroupFactory.createPrivateGroup("Private group $i", identityManager.localAuthor)
+            val joinMsg = groupMessageFactory.createJoinMessage(
+                privateGroup.id,
+                clock.currentTimeMillis() - i * 60 * 1000, identityManager.localAuthor
+            )
+            privateGroupManager.addPrivateGroup(privateGroup, joinMsg, true)
+
+            // share with all contacts
+            for (contact in contacts) {
+                shareGroup(contact.id, privateGroup.id)
+            }
+            privateGroups.add(privateGroup)
+        }
+        if (LOG.isLoggable(Level.INFO)) {
+            LOG.info("Created $numPrivateGroups private groups.")
+        }
+        return privateGroups
+    }
+
+    @Throws(DbException::class)
+    private fun createRandomPrivateGroupMessages(
+        privateGroup: PrivateGroup,
+        contacts: List<Contact>,
+        numPrivateGroupMessages: Int
+    ) {
+        val messages: MutableList<GroupMessage> = java.util.ArrayList()
+        for (i in 0 until numPrivateGroupMessages) {
+            val contact = contacts[random.nextInt(contacts.size)]
+            val author = localAuthors[contact]
+            val timestamp = clock.currentTimeMillis() - i * 60 * 1000
+            val text: String = "This is a message"
+            var parent: MessageId? = null
+            if (random.nextBoolean() && messages.size > 0) {
+                val parentMessage = messages[random.nextInt(messages.size)]
+                parent = parentMessage.message.id
+            }
+            val message = groupMessageFactory.createGroupMessage(privateGroup.id, timestamp, null, author, text, parent)
+            privateGroupManager.addLocalMessage(message)
+            messages.add(message)
+            db.transaction<RuntimeException>(
+                false
+            ) { txn: Transaction? ->
+                db.receiveMessage(
+                    txn,
+                    contact.id,
+                    message.message
+                )
+            }
+        }
+        if (LOG.isLoggable(Level.INFO)) {
+            LOG.info("Created $numPrivateGroupMessages private group posts.")
+        }
+    }
 }