diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt
index e38203b3afec8f3ea14023a6b7ec7dc2702a0935..a9a0e5695023544ce21a61bb7dcd31da2434cfcb 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt
@@ -63,8 +63,7 @@ fun ForumScreen(
             )
             VerticalDivider()
             Column(modifier = Modifier.weight(1f).fillMaxHeight()) {
-                val item = viewModel.selectedGroupItem.value
-                if (item == null) {
+                if (viewModel.selectedGroupId.value == null) {
                     NoForumSelected()
                 } else {
                     GroupConversationScreen(viewModel.threadViewModel)
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumViewModel.kt
index a2bd6d3b8cb050ca66be6b5a2d054a24d2638560..1e5c78569aa7fa45dd0882038972c99a82747f37 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumViewModel.kt
@@ -63,14 +63,14 @@ class ForumViewModel @Inject constructor(
 
     val noForumsYet = derivedStateOf { _fullForumList.isEmpty() }
 
-    private val _selectedGroupItem = mutableStateOf<GroupItem?>(null)
-    val selectedGroupItem = derivedStateOf {
+    private val _selectedGroupId = mutableStateOf<GroupId?>(null)
+    val selectedGroupId = derivedStateOf {
         // reset selected group item to null if not part of list after filtering
-        val groupItem = _selectedGroupItem.value
-        if (groupItem == null || forumList.value.any { it.id == groupItem.id }) {
-            groupItem
+        val groupId = _selectedGroupId.value
+        if (groupId == null || forumList.value.any { it.id == groupId }) {
+            groupId
         } else {
-            _selectedGroupItem.value = null
+            _selectedGroupId.value = null
             null
         }
     }
@@ -80,9 +80,18 @@ class ForumViewModel @Inject constructor(
 
     override fun onInit() {
         super.onInit()
+        // since the threadViewModel is tightly coupled to the ForumViewModel
+        // and not injected using the usual `viewModel()` approach,
+        // we have to manually call the functions for (de)initialization
+        threadViewModel.onInit()
         loadGroups()
     }
 
+    override fun onCleared() {
+        super.onCleared()
+        threadViewModel.onCleared()
+    }
+
     override fun eventOccurred(e: Event) {
         when {
             e is GroupAddedEvent && e.group.clientId == ForumManager.CLIENT_ID ->
@@ -90,7 +99,7 @@ class ForumViewModel @Inject constructor(
 
             e is GroupRemovedEvent && e.group.clientId == ForumManager.CLIENT_ID -> {
                 removeItem(e.group.id)
-                if (selectedGroupItem.value?.id == e.group.id) _selectedGroupItem.value = null
+                if (_selectedGroupId.value == e.group.id) _selectedGroupId.value = null
             }
 
             e is ForumPostReceivedEvent -> {
@@ -126,18 +135,19 @@ class ForumViewModel @Inject constructor(
     }
 
     fun selectGroup(groupItem: GroupItem) {
-        _selectedGroupItem.value = groupItem
+        if (_selectedGroupId.value == groupItem.id) return
+        _selectedGroupId.value = groupItem.id
         threadViewModel.setGroupItem(groupItem, this::addOwnPost)
     }
 
-    fun isSelected(groupId: GroupId) = _selectedGroupItem.value?.id == groupId
+    fun isSelected(groupId: GroupId) = _selectedGroupId.value == groupId
 
     fun setFilterBy(filter: String) {
         _filterBy.value = filter
     }
 
     private fun addOwnPost(header: ForumPostHeader) {
-        selectedGroupItem.value?.id?.let { id -> updateItem(id) { it.updateOnPostReceived(header) } }
+        selectedGroupId.value?.let { id -> updateItem(id) { it.updateOnPostReceived(header) } }
     }
 
     private fun addItem(forumItem: ForumItem) = _fullForumList.add(forumItem)
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/PostsState.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/PostsState.kt
index 2996d0c2da48c7216329414365292fd7a4a092c6..67a4355bc158cd7e159178e033a1af820b41d871 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/PostsState.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/PostsState.kt
@@ -28,7 +28,7 @@ class Loaded(
     val messageTree: MessageTreeImpl<ThreadItem>,
     val scrollTo: MessageId? = null,
 ) : PostsState() {
-    val posts: MutableList<ThreadItem> = messageTree.depthFirstOrder()
+    val posts: List<ThreadItem> = messageTree.depthFirstOrder()
 
     @UiExecutor
     fun unreadBeforeIndex(index: Int): UnreadPostInfo {
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt
index b196a0232a6c6a6557aacc3a777e42bf5c05e0a7..4b62526064823cbe621aa0977e878089fefb69b1 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ThreadedConversationViewModel.kt
@@ -24,6 +24,7 @@ import kotlinx.coroutines.DelicateCoroutinesApi
 import kotlinx.coroutines.GlobalScope
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
+import mu.KotlinLogging
 import org.briarproject.bramble.api.crypto.CryptoExecutor
 import org.briarproject.bramble.api.db.TransactionManager
 import org.briarproject.bramble.api.event.Event
@@ -43,7 +44,6 @@ import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.threading.UiExecutor
 import org.briarproject.briar.desktop.viewmodel.EventListenerDbViewModel
 import org.briarproject.briar.desktop.viewmodel.asState
-import org.slf4j.LoggerFactory.getLogger
 import java.lang.Long.max
 import javax.inject.Inject
 
@@ -59,7 +59,7 @@ class ThreadedConversationViewModel @Inject constructor(
 ) : EventListenerDbViewModel(briarExecutors, lifecycleManager, db, eventBus) {
 
     companion object {
-        private val LOG = getLogger(ThreadedConversationViewModel::class.java)
+        private val LOG = KotlinLogging.logger {}
     }
 
     lateinit var groupItem: GroupItem