diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/GroupConversationScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/GroupConversationScreen.kt
index 642152e4520067fe6f2496712ffcaaaa56567f3f..11fafd1e389e7e15002aad6980d033ba1d24f0b1 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/GroupConversationScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/GroupConversationScreen.kt
@@ -68,8 +68,12 @@ fun GroupConversationScreen(
 ) {
     Scaffold(
         topBar = {
-            GroupConversationHeader(viewModel.groupItem, viewModel.forumSharingViewModel) {
-                viewModel.deleteGroup(viewModel.groupItem)
+            viewModel.groupItem.value?.let { groupItem ->
+                GroupConversationHeader(
+                    groupItem = groupItem,
+                    forumSharingViewModel = viewModel.forumSharingViewModel,
+                    onGroupDelete = viewModel::deleteGroup,
+                )
             }
         },
         content = { padding ->
@@ -84,7 +88,7 @@ fun GroupConversationScreen(
         bottomBar = {
             val onCloseReply = { viewModel.selectPost(null) }
             GroupInputComposable(viewModel.selectedPost.value, onCloseReply) { text ->
-                viewModel.createPost(viewModel.groupItem, text, viewModel.selectedPost.value?.id)
+                viewModel.createPost(text)
             }
         }
     )
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 08aa3bbea804179f769b625b394164cca261adea..b1561a4adca2e3009829109591f8be8ad904dbf7 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
@@ -64,8 +64,8 @@ class ThreadedConversationViewModel @Inject constructor(
         private val LOG = KotlinLogging.logger {}
     }
 
-    lateinit var groupItem: GroupItem
-        private set
+    private val _groupItem = mutableStateOf<GroupItem?>(null)
+    val groupItem = _groupItem.asState()
 
     private lateinit var onPostAdded: (header: ForumPostHeader) -> Unit
 
@@ -77,8 +77,8 @@ class ThreadedConversationViewModel @Inject constructor(
 
     @UiExecutor
     fun setGroupItem(groupItem: GroupItem, onPostAdded: (header: ForumPostHeader) -> Unit) {
-        this.groupItem = groupItem
         this.onPostAdded = onPostAdded
+        _groupItem.value = groupItem
         _selectedPost.value = null
         forumSharingViewModel.setGroupId(groupItem.id)
         loadPosts(groupItem.id)
@@ -87,7 +87,7 @@ class ThreadedConversationViewModel @Inject constructor(
     @UiExecutor
     override fun eventOccurred(e: Event) {
         if (e is ForumPostReceivedEvent) {
-            if (e.groupId == groupItem.id) {
+            if (e.groupId == _groupItem.value?.id) {
                 val item = ForumPostItem(e.header, e.text)
                 addItem(item, null)
             }
@@ -125,16 +125,18 @@ class ThreadedConversationViewModel @Inject constructor(
 
     @UiExecutor
     @OptIn(DelicateCoroutinesApi::class)
-    fun createPost(groupItem: GroupItem, text: String, parentId: MessageId?) = GlobalScope.launch {
+    fun createPost(text: String) = GlobalScope.launch {
+        val groupId = _groupItem.value?.id ?: return@launch
+        val parentId = _selectedPost.value?.id
         val author = runOnDbThreadWithTransaction<LocalAuthor>(false) { txn ->
             identityManager.getLocalAuthor(txn)
         }
         val count = runOnDbThreadWithTransaction<MessageTracker.GroupCount>(false) { txn ->
-            forumManager.getGroupCount(txn, groupItem.id)
+            forumManager.getGroupCount(txn, groupId)
         }
         val timestamp = max(count.latestMsgTime + 1, clock.currentTimeMillis())
         val post = withContext(cryptoDispatcher) {
-            forumManager.createLocalPost(groupItem.id, text, timestamp, parentId, author)
+            forumManager.createLocalPost(groupId, text, timestamp, parentId, author)
         }
         runOnDbThreadWithTransaction(false) { txn ->
             val header = forumManager.addLocalPost(txn, post)
@@ -172,22 +174,23 @@ class ThreadedConversationViewModel @Inject constructor(
             item.id
         } ?: emptyList()
 
-        if (readIds.isNotEmpty()) {
+        val groupId = _groupItem.value?.id
+        if (readIds.isNotEmpty() && groupId != null) {
             runOnDbThread {
                 readIds.forEach { id ->
-                    forumManager.setReadFlag(groupItem.id, id, true)
+                    forumManager.setReadFlag(groupId, id, true)
                 }
             }
             // we don't attach this to the transaction that actually changes the DB,
             // but that should be fine for this purpose of just decrementing a counter
-            eventBus.broadcast(ForumPostReadEvent(groupItem.id, readIds.size))
+            eventBus.broadcast(ForumPostReadEvent(groupId, readIds.size))
             // TODO replace immutable ThreadItems instead to avoid recomposing whole list
             val messageTree = (posts.value as? Loaded)?.messageTree ?: return
             _posts.value = Loaded(messageTree)
         }
     }
 
-    fun deleteGroup(groupItem: GroupItem) {
-        forumManager.removeForum((groupItem as ForumItem).forum)
+    fun deleteGroup() {
+        _groupItem.value?.let { forumManager.removeForum((it as ForumItem).forum) }
     }
 }
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt
index e50df04604937403a673baaed691270384671fb3..4e0a9967a791b985bf9614b7c19782d6c0696bd5 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt
@@ -75,7 +75,7 @@ class ForumSharingViewModel @Inject constructor(
         private val LOG = KotlinLogging.logger {}
     }
 
-    private lateinit var groupId: GroupId
+    private var _groupId: GroupId? = null
 
     private val _sharingStatus = mutableStateOf(emptyMap<ContactId, SharingStatus>())
     private val _shareableSelected = mutableStateOf(emptySet<ContactId>())
@@ -113,8 +113,8 @@ class ForumSharingViewModel @Inject constructor(
 
     @UiExecutor
     fun setGroupId(groupId: GroupId) {
-        if (this::groupId.isInitialized && groupId == this.groupId) return
-        this.groupId = groupId
+        if (_groupId == groupId) return
+        _groupId = groupId
         reload()
     }
 
@@ -140,17 +140,19 @@ class ForumSharingViewModel @Inject constructor(
 
     @UiExecutor
     fun shareForum() = runOnDbThreadWithTransaction(false) { txn ->
+        val groupId = _groupId ?: return@runOnDbThreadWithTransaction
         val message = _sharingMessage.value.ifEmpty { null }
         _shareableSelected.value.forEach { contactId ->
             forumSharingManager.sendInvitation(txn, groupId, contactId, message)
+            txn.attach { reload() }
         }
-        txn.attach { reload() }
     }
 
     @UiExecutor
     override fun eventOccurred(e: Event?) {
         super.eventOccurred(e)
 
+        val groupId = _groupId ?: return
         when {
             e is ForumInvitationResponseReceivedEvent && e.messageHeader.shareableId == groupId -> {
                 if (e.messageHeader.wasAccepted()) {
@@ -182,13 +184,14 @@ class ForumSharingViewModel @Inject constructor(
 
     override fun loadContactsWithinTransaction(txn: Transaction) {
         super.loadContactsWithinTransaction(txn)
-        if (this::groupId.isInitialized) loadSharingStatus(txn)
+        if (_groupId != null) loadSharingStatus(txn)
     }
 
     private fun loadSharingStatus(): Unit =
         runOnDbThreadWithTransaction(true, this::loadSharingStatus)
 
     private fun loadSharingStatus(txn: Transaction) {
+        val groupId = _groupId ?: return
         val map = contactManager.getContacts(txn).associate { contact ->
             contact.id to forumSharingManager.getSharingStatus(txn, groupId, contact)
         }