diff --git a/src/main/kotlin/org/briarproject/briar/desktop/privategroups/PrivateGroupListViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/privategroups/PrivateGroupListViewModel.kt
index 6e7c7de3e5c8a119ed357b1b2f63b621532e3264..38f715c0e5108ab9a9ded35d0386c3d4536054a9 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/privategroups/PrivateGroupListViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/privategroups/PrivateGroupListViewModel.kt
@@ -1,14 +1,19 @@
 package org.briarproject.briar.desktop.privategroups
 
 import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateListOf
 import androidx.compose.runtime.mutableStateOf
 import org.briarproject.bramble.api.connection.ConnectionRegistry
+import org.briarproject.bramble.api.db.TransactionManager
 import org.briarproject.bramble.api.event.Event
 import org.briarproject.bramble.api.event.EventBus
+import org.briarproject.bramble.api.lifecycle.LifecycleManager
 import org.briarproject.bramble.api.sync.GroupId
 import org.briarproject.briar.api.conversation.ConversationManager
 import org.briarproject.briar.api.privategroup.PrivateGroupManager
-import org.briarproject.briar.desktop.viewmodel.BriarEventListenerViewModel
+import org.briarproject.briar.desktop.threading.BriarExecutors
+import org.briarproject.briar.desktop.utils.clearAndAddAll
+import org.briarproject.briar.desktop.viewmodel.EventListenerDbViewModel
 import javax.inject.Inject
 
 class PrivateGroupListViewModel
@@ -17,24 +22,30 @@ constructor(
     private val privateGroupManager: PrivateGroupManager,
     val conversationManager: ConversationManager,
     val connectionRegistry: ConnectionRegistry,
+    briarExecutors: BriarExecutors,
+    lifecycleManager: LifecycleManager,
+    db: TransactionManager,
     eventBus: EventBus,
-) : BriarEventListenerViewModel(eventBus) {
+) : EventListenerDbViewModel(briarExecutors, lifecycleManager, db, eventBus) {
 
-    private val _fullPrivateGroupList = mutableListOf<PrivateGroupItem>()
+    private val _fullPrivateGroupList = mutableStateListOf<PrivateGroupItem>()
 
     val privateGroupList: List<PrivateGroupItem> = _fullPrivateGroupList
 
     private fun loadPrivateGroups() {
-        _fullPrivateGroupList.apply {
-            clear()
-            addAll(
-                privateGroupManager.privateGroups.map { privateGroup ->
+        val privateGroupList = mutableListOf<PrivateGroupItem>()
+        runOnDbThreadWithTransaction(true) { txn ->
+            privateGroupList.addAll(
+                privateGroupManager.getPrivateGroups(txn).map { privateGroup ->
                     PrivateGroupItem(
                         privateGroup,
-                        privateGroupManager.getGroupCount(privateGroup.id),
+                        privateGroupManager.getGroupCount(txn, privateGroup.id),
                     )
                 }
             )
+            txn.attach {
+                _fullPrivateGroupList.clearAndAddAll(privateGroupList)
+            }
         }
     }
 
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/privategroups/ThreadedConversationViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/privategroups/ThreadedConversationViewModel.kt
index fc5c31571a51e5e9a3eaa6603003c9b861beef4b..a7fc4a869d84890a93752dc77754d47b297e647c 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/privategroups/ThreadedConversationViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/privategroups/ThreadedConversationViewModel.kt
@@ -1,12 +1,15 @@
 package org.briarproject.briar.desktop.privategroups
 
+import org.briarproject.bramble.api.db.TransactionManager
 import org.briarproject.bramble.api.event.Event
 import org.briarproject.bramble.api.event.EventBus
+import org.briarproject.bramble.api.lifecycle.LifecycleManager
 import org.briarproject.briar.api.conversation.ConversationManager
 import org.briarproject.briar.api.messaging.MessagingManager
 import org.briarproject.briar.api.messaging.PrivateMessageFactory
 import org.briarproject.briar.api.privategroup.PrivateGroupManager
-import org.briarproject.briar.desktop.viewmodel.BriarEventListenerViewModel
+import org.briarproject.briar.desktop.threading.BriarExecutors
+import org.briarproject.briar.desktop.viewmodel.EventListenerDbViewModel
 import java.util.logging.Logger
 import javax.inject.Inject
 
@@ -17,8 +20,11 @@ constructor(
     private val conversationManager: ConversationManager,
     private val messagingManager: MessagingManager,
     private val privateMessageFactory: PrivateMessageFactory,
-    private val eventBus: EventBus,
-) : BriarEventListenerViewModel(eventBus) {
+    briarExecutors: BriarExecutors,
+    lifecycleManager: LifecycleManager,
+    db: TransactionManager,
+    eventBus: EventBus,
+) : EventListenerDbViewModel(briarExecutors, lifecycleManager, db, eventBus) {
 
     companion object {
         private val LOG = Logger.getLogger(ThreadedConversationViewModel::class.java.name)