diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt
index 50f555bab1f491e2df916dffa3da9cad49e674ae..4bf308b53c2a732dde8ea65a2246726c34562e50 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, 10, 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..e5218504efafdf11e1de0704854d1d0b6a9f8ab6 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)
-    getTestDataCreator().createTestData(5, 20, 50, 4, 4, 10)
+    getDeterministicTestDataCreator().createTestData(5, 20, 50, 10, 20)
+    getTestDataCreator().createTestData(5, 20, 50, 4, 10, 10)
 }.run()
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestRandomConversations.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestRandomConversations.kt
index 268142d771c4cb370db3d21735108bee06fbd508..4ff0589c5d5b65f9550d51c1cc23d9f94e4db73a 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/TestRandomConversations.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/TestRandomConversations.kt
@@ -1,5 +1,5 @@
 package org.briarproject.briar.desktop
 
 fun main() = RunWithTemporaryAccount {
-    getTestDataCreator().createTestData(5, 20, 50, 4, 4, 10)
+    getTestDataCreator().createTestData(5, 20, 50, 4, 10, 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..7ab686bcad3490a5e1ef06e18c96648791c222b9 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, 10, 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..e852b7226e6e3b596fa76dc5ba16736ee7814518 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, 10, 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..b4bca5b19add9776484a8808d98f392e1ea7161a 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt
@@ -8,13 +8,21 @@ interface DeterministicTestDataCreator {
     /**
      * Create fake test data on the IoExecutor
      *
-     * @param numContacts    Number of contacts to create. Must be >= 1
-     * @param numPrivateMsgs Number of private messages to create for each
+     * @param numContacts          Number of contacts to create. Must be >= 1
+     * @param numPrivateMsgs       Number of private messages to create for each
      * contact.
-     * @param avatarPercent  Percentage of contacts
+     * @param avatarPercent        Percentage of contacts
      * that will use a random profile image. Between 0 and 100.
+     * @param numPrivateGroups     Number of private groups to create. Must be >= 1
+     * @param numPrivateGroupPosts Number of private group messages to create in each group
      */
-    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 aa4b0689c01dd386466b8522470802fcaade1b45..1105860218196269cb33a10129c16f49d8e97e7b 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
@@ -30,6 +30,10 @@ 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.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 java.io.IOException
 import java.io.InputStream
@@ -44,10 +48,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,
@@ -64,13 +71,16 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
     override fun createTestData(
         numContacts: Int,
         numPrivateMsgs: Int,
-        avatarPercent: Int
+        avatarPercent: Int,
+        numPrivateGroups: Int,
+        numPrivateGroupPosts: Int,
     ) {
         require(numContacts != 0)
+        require(numPrivateGroups != 0)
         require(!(avatarPercent < 0 || avatarPercent > 100))
         ioExecutor.execute {
             try {
-                createTestDataOnIoExecutor(numContacts, numPrivateMsgs, avatarPercent)
+                createTestDataOnIoExecutor(numContacts, numPrivateMsgs, avatarPercent, numPrivateGroups, numPrivateGroupPosts)
             } catch (e: DbException) {
                 LOG.warn(e) { }
             }
@@ -82,10 +92,17 @@ 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)
+        for (privateGroup in privateGroups) {
+            createRandomPrivateGroupMessages(privateGroup, contacts, numPrivateGroupPosts)
+        }
     }
 
     @Throws(DbException::class)
@@ -320,4 +337,37 @@ 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> = ArrayList(numPrivateGroups)
+        for (i in 0 until min(numPrivateGroups, GROUP_NAMES.size)) {
+            // create private group
+            val name = GROUP_NAMES[i]
+            var creator = identityManager.localAuthor
+            val privateGroup = privateGroupFactory.createPrivateGroup(name, creator)
+            val joinMsg = groupMessageFactory.createJoinMessage(
+                privateGroup.id,
+                clock.currentTimeMillis() - i * 60 * 1000, creator
+            )
+            privateGroupManager.addPrivateGroup(privateGroup, joinMsg, true)
+
+            // share with all contacts
+            for (contact in contacts) {
+                shareGroup(contact.id, privateGroup.id)
+            }
+            privateGroups.add(privateGroup)
+        }
+        LOG.info { "Created ${min(numPrivateGroups, GROUP_NAMES.size)} private groups." }
+        return privateGroups
+    }
+
+    @Throws(DbException::class)
+    private fun createRandomPrivateGroupMessages(
+        privateGroup: PrivateGroup,
+        contacts: List<Contact>,
+        numPrivateGroupMessages: Int
+    ) {
+        // TODO
+    }
 }
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/testdata/GroupsData.kt b/src/test/kotlin/org/briarproject/briar/desktop/testdata/GroupsData.kt
new file mode 100644
index 0000000000000000000000000000000000000000..11ccd3d44ad0e3eb90d6cd8d7af21d5e9e7de411
--- /dev/null
+++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/GroupsData.kt
@@ -0,0 +1,12 @@
+package org.briarproject.briar.desktop.testdata
+
+var GROUP_NAMES = arrayOf(
+    "The Undiscovered Country",
+    "The Place to Be",
+    "Forum Romanum",
+    "Private Messengers",
+    "The Darknet",
+    "Bletchley Park",
+    "Acropolis",
+    "General Discussion",
+)