From 977d17586d856a2aa809c987640c39b0ca6135a3 Mon Sep 17 00:00:00 2001
From: ialokim <ialokim@mailbox.org>
Date: Tue, 14 Mar 2023 22:53:41 +0100
Subject: [PATCH] rename package for common forum and privatgroup logic to
 threadedgroup

also rename forums to forum
---
 .../conversation/ConversationViewModel.kt     |  2 +-
 .../desktop/{forums => forum}/ForumItem.kt    |  6 +--
 .../{forums => forum}/ForumListViewModel.kt   |  8 ++--
 .../{forums => forum}/ForumPostReadEvent.kt   |  4 +-
 .../desktop/{forums => forum}/ForumScreen.kt  |  8 ++--
 .../desktop/{forums => forum}/ForumStrings.kt |  6 +--
 .../ForumConversationViewModel.kt             |  8 ++--
 .../conversation/ForumDropdownMenu.kt         |  8 ++--
 .../conversation/ForumPostItem.kt             |  4 +-
 .../sharing/ForumInvitationSentEvent.kt       |  2 +-
 .../ForumSharingActionDrawerContent.kt        |  4 +-
 .../ForumSharingStatusDrawerContent.kt        |  4 +-
 .../sharing/ForumSharingViewModel.kt          |  2 +-
 .../desktop/privategroup/PrivateGroupItem.kt  |  4 +-
 .../privategroup/PrivateGroupListViewModel.kt |  4 +-
 .../privategroup/PrivateGroupScreen.kt        |  4 +-
 .../privategroup/PrivateGroupStrings.kt       |  4 +-
 .../PrivateGroupConversationViewModel.kt      |  4 +-
 .../conversation/PrivateGroupMessageItem.kt   |  2 +-
 .../AddThreadedGroupDialog.kt}                | 21 ++++++----
 .../ThreadedGroupCircle.kt}                   |  6 +--
 .../ThreadedGroupItem.kt}                     |  4 +-
 .../ThreadedGroupItemView.kt}                 | 34 +++++++--------
 .../ThreadedGroupList.kt}                     | 26 ++++++------
 .../ThreadedGroupListViewModel.kt}            | 14 +++----
 .../ThreadedGroupScreen.kt}                   | 28 ++++++-------
 .../ThreadedGroupStrings.kt}                  |  4 +-
 .../conversation/ThreadItem.kt                |  2 +-
 .../conversation/ThreadItemView.kt            |  4 +-
 .../ThreadedConversationViewModel.kt          | 24 +++++------
 .../ThreadedGroupConversationContent.kt}      | 10 ++---
 .../ThreadedGroupConversationInput.kt}        |  8 ++--
 .../ThreadedGroupConversationScreen.kt}       | 42 +++++++++----------
 .../ThreadedGroupConversationScreenState.kt}  |  8 ++--
 .../ThreadedGroupDropdownMenu.kt}             |  6 +--
 .../conversation/UnreadFabs.kt                |  6 +--
 .../briar/desktop/ui/MainScreen.kt            |  2 +-
 .../briar/desktop/ui/MessageCounterImpl.kt    |  2 +-
 .../desktop/viewmodel/ViewModelModule.kt      |  4 +-
 39 files changed, 174 insertions(+), 169 deletions(-)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/ForumItem.kt (92%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/ForumListViewModel.kt (91%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/ForumPostReadEvent.kt (91%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/ForumScreen.kt (84%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/ForumStrings.kt (94%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/conversation/ForumConversationViewModel.kt (94%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/conversation/ForumDropdownMenu.kt (89%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/conversation/ForumPostItem.kt (89%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/sharing/ForumInvitationSentEvent.kt (94%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/sharing/ForumSharingActionDrawerContent.kt (98%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/sharing/ForumSharingStatusDrawerContent.kt (97%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{forums => forum}/sharing/ForumSharingViewModel.kt (99%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/AddGroupDialog.kt => threadedgroup/AddThreadedGroupDialog.kt} (93%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/GroupCircle.kt => threadedgroup/ThreadedGroupCircle.kt} (93%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/GroupItem.kt => threadedgroup/ThreadedGroupItem.kt} (91%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/GroupItemView.kt => threadedgroup/ThreadedGroupItemView.kt} (81%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/GroupList.kt => threadedgroup/ThreadedGroupList.kt} (90%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/GroupListViewModel.kt => threadedgroup/ThreadedGroupListViewModel.kt} (90%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/GroupScreen.kt => threadedgroup/ThreadedGroupScreen.kt} (77%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/GroupStrings.kt => threadedgroup/ThreadedGroupStrings.kt} (94%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group => threadedgroup}/conversation/ThreadItem.kt (97%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group => threadedgroup}/conversation/ThreadItemView.kt (98%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group => threadedgroup}/conversation/ThreadedConversationViewModel.kt (85%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/conversation/ThreadedConversationScreen.kt => threadedgroup/conversation/ThreadedGroupConversationContent.kt} (93%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/conversation/ThreadedConversationInput.kt => threadedgroup/conversation/ThreadedGroupConversationInput.kt} (96%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/conversation/GroupConversationScreen.kt => threadedgroup/conversation/ThreadedGroupConversationScreen.kt} (85%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/conversation/ThreadedConversationScreenState.kt => threadedgroup/conversation/ThreadedGroupConversationScreenState.kt} (90%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group/conversation/GroupDropdownMenu.kt => threadedgroup/conversation/ThreadedGroupDropdownMenu.kt} (82%)
 rename briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/{group => threadedgroup}/conversation/UnreadFabs.kt (95%)

diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
index 17e1975506..607730b4bb 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
@@ -64,7 +64,7 @@ import org.briarproject.briar.desktop.contact.ContactItem
 import org.briarproject.briar.desktop.contact.loadContactItem
 import org.briarproject.briar.desktop.conversation.ConversationRequestItem.RequestType.FORUM
 import org.briarproject.briar.desktop.conversation.ConversationRequestItem.RequestType.INTRODUCTION
-import org.briarproject.briar.desktop.forums.sharing.ForumInvitationSentEvent
+import org.briarproject.briar.desktop.forum.sharing.ForumInvitationSentEvent
 import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.utils.KLoggerUtils.e
 import org.briarproject.briar.desktop.utils.KLoggerUtils.i
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt
similarity index 92%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumItem.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt
index 22c555b23f..40c5c5e8f8 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumItem.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt
@@ -16,13 +16,13 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums
+package org.briarproject.briar.desktop.forum
 
 import org.briarproject.bramble.api.sync.GroupId
 import org.briarproject.briar.api.client.MessageTracker
 import org.briarproject.briar.api.client.PostHeader
 import org.briarproject.briar.api.forum.Forum
-import org.briarproject.briar.desktop.group.GroupItem
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupItem
 import kotlin.math.max
 
 data class ForumItem(
@@ -30,7 +30,7 @@ data class ForumItem(
     override val msgCount: Int,
     override val unread: Int,
     override val timestamp: Long,
-) : GroupItem {
+) : ThreadedGroupItem {
 
     constructor(forum: Forum, groupCount: MessageTracker.GroupCount) : this(
         forum = forum,
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumListViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumListViewModel.kt
similarity index 91%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumListViewModel.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumListViewModel.kt
index 84d6b9b491..6dbdad4dbb 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumListViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumListViewModel.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums
+package org.briarproject.briar.desktop.forum
 
 import androidx.compose.runtime.mutableStateListOf
 import mu.KotlinLogging
@@ -30,8 +30,8 @@ import org.briarproject.bramble.api.sync.GroupId
 import org.briarproject.briar.api.client.PostHeader
 import org.briarproject.briar.api.forum.ForumManager
 import org.briarproject.briar.api.forum.event.ForumPostReceivedEvent
-import org.briarproject.briar.desktop.forums.conversation.ForumConversationViewModel
-import org.briarproject.briar.desktop.group.GroupListViewModel
+import org.briarproject.briar.desktop.forum.conversation.ForumConversationViewModel
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupListViewModel
 import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.utils.removeFirst
 import org.briarproject.briar.desktop.utils.replaceFirst
@@ -45,7 +45,7 @@ class ForumListViewModel
     lifecycleManager: LifecycleManager,
     db: TransactionManager,
     eventBus: EventBus,
-) : GroupListViewModel<ForumItem>(threadViewModel, briarExecutors, lifecycleManager, db, eventBus) {
+) : ThreadedGroupListViewModel<ForumItem>(threadViewModel, briarExecutors, lifecycleManager, db, eventBus) {
 
     companion object {
         private val LOG = KotlinLogging.logger {}
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumPostReadEvent.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumPostReadEvent.kt
similarity index 91%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumPostReadEvent.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumPostReadEvent.kt
index 7d2656143f..f0da6e2e9c 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumPostReadEvent.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumPostReadEvent.kt
@@ -1,6 +1,6 @@
 /*
  * Briar Desktop
- * Copyright (C) 2021-2022 The Briar Project
+ * Copyright (C) 2021-2023 The Briar Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums
+package org.briarproject.briar.desktop.forum
 
 import org.briarproject.bramble.api.event.Event
 import org.briarproject.bramble.api.sync.GroupId
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/forum/ForumScreen.kt
similarity index 84%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumScreen.kt
index ffb232f1c0..803705e23d 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumScreen.kt
@@ -16,17 +16,17 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums
+package org.briarproject.briar.desktop.forum
 
 import androidx.compose.runtime.Composable
-import org.briarproject.briar.desktop.forums.conversation.ForumDropdownMenu
-import org.briarproject.briar.desktop.group.GroupScreen
+import org.briarproject.briar.desktop.forum.conversation.ForumDropdownMenu
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupScreen
 import org.briarproject.briar.desktop.viewmodel.viewModel
 
 @Composable
 fun ForumScreen(
     viewModel: ForumListViewModel = viewModel(),
-) = GroupScreen(
+) = ThreadedGroupScreen(
     strings = ForumStrings,
     viewModel = viewModel,
     dropdownMenu = { forumSharingViewModel, expanded, onClose, onLeaveForumClick ->
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumStrings.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumStrings.kt
similarity index 94%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumStrings.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumStrings.kt
index f18ba114f9..4812d32eef 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/ForumStrings.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumStrings.kt
@@ -16,16 +16,16 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums
+package org.briarproject.briar.desktop.forum
 
 import org.briarproject.briar.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH
 import org.briarproject.briar.api.forum.ForumConstants.MAX_FORUM_POST_TEXT_LENGTH
-import org.briarproject.briar.desktop.group.GroupStrings
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupStrings
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18nF
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18nP
 
-object ForumStrings : GroupStrings(
+object ForumStrings : ThreadedGroupStrings(
     listTitle = i18n("forum.search.title"),
     listDescription = i18n("access.forums.list"),
     addGroupTitle = i18n("forum.add.title"),
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/conversation/ForumConversationViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumConversationViewModel.kt
similarity index 94%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/conversation/ForumConversationViewModel.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumConversationViewModel.kt
index 2ceb8eef0e..75570a87a2 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/conversation/ForumConversationViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumConversationViewModel.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums.conversation
+package org.briarproject.briar.desktop.forum.conversation
 
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.DelicateCoroutinesApi
@@ -38,9 +38,9 @@ import org.briarproject.bramble.api.system.Clock
 import org.briarproject.briar.api.client.MessageTracker
 import org.briarproject.briar.api.forum.ForumManager
 import org.briarproject.briar.api.forum.event.ForumPostReceivedEvent
-import org.briarproject.briar.desktop.forums.ForumItem
-import org.briarproject.briar.desktop.forums.sharing.ForumSharingViewModel
-import org.briarproject.briar.desktop.group.conversation.ThreadedConversationViewModel
+import org.briarproject.briar.desktop.forum.ForumItem
+import org.briarproject.briar.desktop.forum.sharing.ForumSharingViewModel
+import org.briarproject.briar.desktop.threadedgroup.conversation.ThreadedConversationViewModel
 import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.threading.UiExecutor
 import java.lang.Long.max
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/conversation/ForumDropdownMenu.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumDropdownMenu.kt
similarity index 89%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/conversation/ForumDropdownMenu.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumDropdownMenu.kt
index ae00c4015b..d4195d362f 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/conversation/ForumDropdownMenu.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumDropdownMenu.kt
@@ -16,16 +16,16 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums.conversation
+package org.briarproject.briar.desktop.forum.conversation
 
 import androidx.compose.material.DropdownMenu
 import androidx.compose.material.DropdownMenuItem
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
-import org.briarproject.briar.desktop.forums.sharing.ForumSharingActionDrawerContent
-import org.briarproject.briar.desktop.forums.sharing.ForumSharingStatusDrawerContent
-import org.briarproject.briar.desktop.forums.sharing.ForumSharingViewModel
+import org.briarproject.briar.desktop.forum.sharing.ForumSharingActionDrawerContent
+import org.briarproject.briar.desktop.forum.sharing.ForumSharingStatusDrawerContent
+import org.briarproject.briar.desktop.forum.sharing.ForumSharingViewModel
 import org.briarproject.briar.desktop.ui.getInfoDrawerHandler
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n
 
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/conversation/ForumPostItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumPostItem.kt
similarity index 89%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/conversation/ForumPostItem.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumPostItem.kt
index f9a5b8f2ce..009d842ed9 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/conversation/ForumPostItem.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumPostItem.kt
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums.conversation
+package org.briarproject.briar.desktop.forum.conversation
 
 import org.briarproject.briar.api.forum.ForumPostHeader
-import org.briarproject.briar.desktop.group.conversation.ThreadItem
+import org.briarproject.briar.desktop.threadedgroup.conversation.ThreadItem
 import javax.annotation.concurrent.NotThreadSafe
 
 @NotThreadSafe
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumInvitationSentEvent.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumInvitationSentEvent.kt
similarity index 94%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumInvitationSentEvent.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumInvitationSentEvent.kt
index 016dfd976f..1d090fb951 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumInvitationSentEvent.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumInvitationSentEvent.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums.sharing
+package org.briarproject.briar.desktop.forum.sharing
 
 import org.briarproject.bramble.api.contact.ContactId
 import org.briarproject.bramble.api.event.Event
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingActionDrawerContent.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumSharingActionDrawerContent.kt
similarity index 98%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingActionDrawerContent.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumSharingActionDrawerContent.kt
index f4924ed795..d85a38c1a9 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingActionDrawerContent.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumSharingActionDrawerContent.kt
@@ -1,6 +1,6 @@
 /*
  * Briar Desktop
- * Copyright (C) 2021-2022 The Briar Project
+ * Copyright (C) 2021-2023 The Briar Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums.sharing
+package org.briarproject.briar.desktop.forum.sharing
 
 import androidx.compose.foundation.layout.Arrangement.spacedBy
 import androidx.compose.foundation.layout.Box
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingStatusDrawerContent.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumSharingStatusDrawerContent.kt
similarity index 97%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingStatusDrawerContent.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumSharingStatusDrawerContent.kt
index c3c47e99b1..b289ffa916 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingStatusDrawerContent.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumSharingStatusDrawerContent.kt
@@ -1,6 +1,6 @@
 /*
  * Briar Desktop
- * Copyright (C) 2021-2022 The Briar Project
+ * Copyright (C) 2021-2023 The Briar Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums.sharing
+package org.briarproject.briar.desktop.forum.sharing
 
 import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy
 import androidx.compose.foundation.layout.Box
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/forum/sharing/ForumSharingViewModel.kt
similarity index 99%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forums/sharing/ForumSharingViewModel.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/sharing/ForumSharingViewModel.kt
index 03dc7a57be..cf041bf781 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/forum/sharing/ForumSharingViewModel.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.forums.sharing
+package org.briarproject.briar.desktop.forum.sharing
 
 import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.mutableStateOf
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupItem.kt
index 2f50b43eb7..fce9fc24ab 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupItem.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupItem.kt
@@ -22,7 +22,7 @@ import org.briarproject.bramble.api.sync.GroupId
 import org.briarproject.briar.api.client.MessageTracker
 import org.briarproject.briar.api.client.PostHeader
 import org.briarproject.briar.api.privategroup.PrivateGroup
-import org.briarproject.briar.desktop.group.GroupItem
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupItem
 import kotlin.math.max
 
 data class PrivateGroupItem(
@@ -30,7 +30,7 @@ data class PrivateGroupItem(
     override val msgCount: Int,
     override val unread: Int,
     override val timestamp: Long,
-) : GroupItem {
+) : ThreadedGroupItem {
 
     constructor(privateGroup: PrivateGroup, groupCount: MessageTracker.GroupCount) :
         this(
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupListViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupListViewModel.kt
index 410294a95a..5997082470 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupListViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupListViewModel.kt
@@ -40,8 +40,8 @@ import org.briarproject.briar.api.privategroup.GroupMessageFactory
 import org.briarproject.briar.api.privategroup.PrivateGroupFactory
 import org.briarproject.briar.api.privategroup.PrivateGroupManager
 import org.briarproject.briar.api.privategroup.event.GroupMessageAddedEvent
-import org.briarproject.briar.desktop.group.GroupListViewModel
 import org.briarproject.briar.desktop.privategroup.conversation.PrivateGroupConversationViewModel
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupListViewModel
 import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.utils.removeFirst
 import org.briarproject.briar.desktop.utils.replaceFirst
@@ -60,7 +60,7 @@ class PrivateGroupListViewModel
     lifecycleManager: LifecycleManager,
     db: TransactionManager,
     eventBus: EventBus,
-) : GroupListViewModel<PrivateGroupItem>(threadViewModel, briarExecutors, lifecycleManager, db, eventBus) {
+) : ThreadedGroupListViewModel<PrivateGroupItem>(threadViewModel, briarExecutors, lifecycleManager, db, eventBus) {
 
     override val clientId: ClientId = PrivateGroupManager.CLIENT_ID
 
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupScreen.kt
index 568a7b7736..286b65482b 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupScreen.kt
@@ -19,13 +19,13 @@
 package org.briarproject.briar.desktop.privategroup
 
 import androidx.compose.runtime.Composable
-import org.briarproject.briar.desktop.group.GroupScreen
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupScreen
 import org.briarproject.briar.desktop.viewmodel.viewModel
 
 @Composable
 fun PrivateGroupScreen(
     viewModel: PrivateGroupListViewModel = viewModel(),
-) = GroupScreen(
+) = ThreadedGroupScreen(
     strings = PrivateGroupStrings,
     viewModel = viewModel,
     dropdownMenu = { forumSharingViewModel, expanded, onClose, onLeaveForumClick ->
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupStrings.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupStrings.kt
index 8ecc2adc07..0988825d78 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupStrings.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupStrings.kt
@@ -20,12 +20,12 @@ package org.briarproject.briar.desktop.privategroup
 
 import org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH
 import org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_POST_TEXT_LENGTH
-import org.briarproject.briar.desktop.group.GroupStrings
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupStrings
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18nF
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18nP
 
-object PrivateGroupStrings : GroupStrings(
+object PrivateGroupStrings : ThreadedGroupStrings(
     listTitle = i18n("group.search.title"),
     listDescription = i18n("access.group.list"),
     addGroupTitle = i18n("group.add.title"),
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/conversation/PrivateGroupConversationViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/conversation/PrivateGroupConversationViewModel.kt
index 396f05c875..593bac83d4 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/conversation/PrivateGroupConversationViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/conversation/PrivateGroupConversationViewModel.kt
@@ -39,8 +39,8 @@ import org.briarproject.briar.api.client.MessageTracker
 import org.briarproject.briar.api.privategroup.GroupMessageFactory
 import org.briarproject.briar.api.privategroup.JoinMessageHeader
 import org.briarproject.briar.api.privategroup.PrivateGroupManager
-import org.briarproject.briar.desktop.forums.sharing.ForumSharingViewModel
-import org.briarproject.briar.desktop.group.conversation.ThreadedConversationViewModel
+import org.briarproject.briar.desktop.forum.sharing.ForumSharingViewModel
+import org.briarproject.briar.desktop.threadedgroup.conversation.ThreadedConversationViewModel
 import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.threading.UiExecutor
 import java.lang.Long.max
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/conversation/PrivateGroupMessageItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/conversation/PrivateGroupMessageItem.kt
index efc450c460..546ff08f34 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/conversation/PrivateGroupMessageItem.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/conversation/PrivateGroupMessageItem.kt
@@ -19,7 +19,7 @@
 package org.briarproject.briar.desktop.privategroup.conversation
 
 import org.briarproject.briar.api.privategroup.GroupMessageHeader
-import org.briarproject.briar.desktop.group.conversation.ThreadItem
+import org.briarproject.briar.desktop.threadedgroup.conversation.ThreadItem
 import javax.annotation.concurrent.NotThreadSafe
 
 @NotThreadSafe
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/AddGroupDialog.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/AddThreadedGroupDialog.kt
similarity index 93%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/AddGroupDialog.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/AddThreadedGroupDialog.kt
index 7e8ec71b2d..f8cd80afc2 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/AddGroupDialog.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/AddThreadedGroupDialog.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group
+package org.briarproject.briar.desktop.threadedgroup
 
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Row
@@ -50,7 +50,7 @@ import androidx.compose.ui.window.Dialog
 import androidx.compose.ui.window.WindowPosition
 import androidx.compose.ui.window.rememberDialogState
 import org.briarproject.bramble.util.StringUtils.utf8IsTooLong
-import org.briarproject.briar.desktop.forums.ForumStrings
+import org.briarproject.briar.desktop.forum.ForumStrings
 import org.briarproject.briar.desktop.privategroup.PrivateGroupStrings
 import org.briarproject.briar.desktop.utils.AccessibilityUtils.description
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n
@@ -61,7 +61,7 @@ fun main() = preview(
     "visible" to true,
     "forums" to true
 ) {
-    AddGroupDialog(
+    AddThreadedGroupDialog(
         strings = if (getBooleanParameter("forums")) ForumStrings else PrivateGroupStrings,
         visible = getBooleanParameter("visible"),
         onCreate = {},
@@ -70,8 +70,8 @@ fun main() = preview(
 }
 
 @Composable
-fun AddGroupDialog(
-    strings: GroupStrings,
+fun AddThreadedGroupDialog(
+    strings: ThreadedGroupStrings,
     visible: Boolean,
     onCreate: (String) -> Unit,
     onCancelButtonClicked: () -> Unit,
@@ -110,7 +110,7 @@ fun AddGroupDialog(
                         }
                     },
                     content = {
-                        AddGroupContent(name.value, onNameChanged, strings.addGroupHint, onCreate)
+                        AddThreadedGroupContent(name.value, onNameChanged, strings.addGroupHint, onCreate)
                     },
                     bottomBar = {
                         OkCancelBottomBar(
@@ -133,7 +133,12 @@ private fun isValidGroupName(name: String, maxLength: Int) =
     name.isNotBlank() && !utf8IsTooLong(name, maxLength)
 
 @Composable
-fun AddGroupContent(name: String, onNameChanged: (String) -> Unit, description: String, onCreate: (String) -> Unit) {
+private fun AddThreadedGroupContent(
+    name: String,
+    onNameChanged: (String) -> Unit,
+    description: String,
+    onCreate: (String) -> Unit,
+) {
     val focusRequester = remember { FocusRequester() }
     OutlinedTextField(
         value = name,
@@ -156,7 +161,7 @@ fun AddGroupContent(name: String, onNameChanged: (String) -> Unit, description:
 }
 
 @Composable
-fun OkCancelBottomBar(
+private fun OkCancelBottomBar(
     okButtonLabel: String,
     okButtonEnabled: Boolean = true,
     onOkButtonClicked: () -> Unit,
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupCircle.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupCircle.kt
similarity index 93%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupCircle.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupCircle.kt
index 599dd6770f..3c0f3ad0c4 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupCircle.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupCircle.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group
+package org.briarproject.briar.desktop.threadedgroup
 
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
@@ -39,7 +39,7 @@ import org.briarproject.briar.desktop.theme.outline
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.locale
 
 @Composable
-fun GroupCircle(item: GroupItem, modifier: Modifier = Modifier) {
+fun ThreadedGroupCircle(item: ThreadedGroupItem, modifier: Modifier = Modifier) {
     Box(
         contentAlignment = Center,
         modifier = modifier
@@ -63,7 +63,7 @@ fun GroupCircle(item: GroupItem, modifier: Modifier = Modifier) {
     }
 }
 
-fun GroupId.getBackgroundColor(): Color {
+private fun GroupId.getBackgroundColor(): Color {
     return Color(
         red = bytes.getByte(0) * 3 / 4 + 96,
         green = bytes.getByte(1) * 3 / 4 + 96,
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt
similarity index 91%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupItem.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt
index 588cc76afe..2ec955692a 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupItem.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt
@@ -16,11 +16,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group
+package org.briarproject.briar.desktop.threadedgroup
 
 import org.briarproject.bramble.api.sync.GroupId
 
-interface GroupItem {
+interface ThreadedGroupItem {
     val id: GroupId
     val name: String
     val msgCount: Int
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupItemView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt
similarity index 81%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupItemView.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt
index fff90eb904..d4fdc7cba4 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupItemView.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group
+package org.briarproject.briar.desktop.threadedgroup
 
 import androidx.compose.foundation.layout.Arrangement.SpaceBetween
 import androidx.compose.foundation.layout.Arrangement.spacedBy
@@ -43,7 +43,7 @@ import androidx.compose.ui.semantics.text
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
 import org.briarproject.bramble.api.sync.GroupId
-import org.briarproject.briar.desktop.forums.ForumStrings
+import org.briarproject.briar.desktop.forum.ForumStrings
 import org.briarproject.briar.desktop.ui.NumberBadge
 import org.briarproject.briar.desktop.utils.PreviewUtils.preview
 import org.briarproject.briar.desktop.utils.TimeUtils.getFormattedTimestamp
@@ -58,20 +58,20 @@ fun main() = preview(
     "unread" to 23,
     "timestamp" to Instant.now().toEpochMilli(),
 ) {
-    val item = object : GroupItem {
+    val item = object : ThreadedGroupItem {
         override val id: GroupId = GroupId(getRandomIdPersistent())
         override val name: String = getStringParameter("name")
         override val msgCount: Int = getIntParameter("msgCount")
         override val unread: Int = getIntParameter("unread")
         override val timestamp: Long = getLongParameter("timestamp")
     }
-    GroupItemView(ForumStrings, item)
+    ThreadedGroupItemView(ForumStrings, item)
 }
 
 @Composable
-fun GroupItemView(
-    strings: GroupStrings,
-    groupItem: GroupItem,
+fun ThreadedGroupItemView(
+    strings: ThreadedGroupStrings,
+    threadedGroupItem: ThreadedGroupItem,
     modifier: Modifier = Modifier,
 ) = Row(
     horizontalArrangement = spacedBy(12.dp),
@@ -80,20 +80,20 @@ fun GroupItemView(
         // allows content to be bottom-aligned
         .height(IntrinsicSize.Min)
         .semantics {
-            text = getDescription(strings, groupItem)
+            text = getDescription(strings, threadedGroupItem)
         },
 ) {
     Box(Modifier.align(Top).padding(vertical = 8.dp)) {
-        GroupCircle(groupItem)
+        ThreadedGroupCircle(threadedGroupItem)
         NumberBadge(
-            num = groupItem.unread,
+            num = threadedGroupItem.unread,
             modifier = Modifier.align(TopEnd).offset(6.dp, (-6).dp)
         )
     }
-    GroupItemViewInfo(strings, groupItem)
+    ThreadedGroupItemViewInfo(strings, threadedGroupItem)
 }
 
-private fun getDescription(strings: GroupStrings, item: GroupItem) = buildBlankAnnotatedString {
+private fun getDescription(strings: ThreadedGroupStrings, item: ThreadedGroupItem) = buildBlankAnnotatedString {
     append(item.name)
     if (item.unread > 0) appendCommaSeparated(strings.unreadCount(item.unread))
     appendCommaSeparated(strings.messageCount(item.msgCount))
@@ -101,12 +101,12 @@ private fun getDescription(strings: GroupStrings, item: GroupItem) = buildBlankA
 }
 
 @Composable
-private fun GroupItemViewInfo(strings: GroupStrings, groupItem: GroupItem) = Column(
+private fun ThreadedGroupItemViewInfo(strings: ThreadedGroupStrings, threadedGroupItem: ThreadedGroupItem) = Column(
     horizontalAlignment = Start,
 ) {
     Spacer(Modifier.weight(1f, fill = true))
     Text(
-        text = groupItem.name,
+        text = threadedGroupItem.name,
         style = MaterialTheme.typography.body1,
         maxLines = 3,
         overflow = TextOverflow.Ellipsis,
@@ -117,12 +117,12 @@ private fun GroupItemViewInfo(strings: GroupStrings, groupItem: GroupItem) = Col
         modifier = Modifier.fillMaxWidth()
     ) {
         Text(
-            text = strings.messageCount(groupItem.msgCount),
+            text = strings.messageCount(threadedGroupItem.msgCount),
             style = MaterialTheme.typography.caption
         )
-        if (groupItem.msgCount > 0) {
+        if (threadedGroupItem.msgCount > 0) {
             Text(
-                text = getFormattedTimestamp(groupItem.timestamp),
+                text = getFormattedTimestamp(threadedGroupItem.timestamp),
                 style = MaterialTheme.typography.caption
             )
         }
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupList.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt
similarity index 90%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupList.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt
index bd76669381..2da3f31ce4 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupList.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group
+package org.briarproject.briar.desktop.threadedgroup
 
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Column
@@ -41,7 +41,7 @@ import androidx.compose.ui.semantics.contentDescription
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.dp
 import org.briarproject.bramble.api.sync.GroupId
-import org.briarproject.briar.desktop.forums.ForumStrings
+import org.briarproject.briar.desktop.forum.ForumStrings
 import org.briarproject.briar.desktop.theme.surfaceVariant
 import org.briarproject.briar.desktop.ui.Constants.COLUMN_WIDTH
 import org.briarproject.briar.desktop.ui.Constants.HEADER_SIZE
@@ -55,7 +55,7 @@ import java.time.Instant
 fun main() = preview {
     val list = remember {
         listOf(
-            object : GroupItem {
+            object : ThreadedGroupItem {
                 override val id: GroupId = GroupId(getRandomId())
                 override val name: String =
                     "This is a test forum! This is a test forum! This is a test forum! This is a test forum!"
@@ -63,14 +63,14 @@ fun main() = preview {
                 override val unread: Int = 23
                 override val timestamp: Long = (Instant.now().minusSeconds(300)).toEpochMilli()
             },
-            object : GroupItem {
+            object : ThreadedGroupItem {
                 override val id: GroupId = GroupId(getRandomId())
                 override val name: String = "Newly added forum"
                 override val msgCount: Int = 0
                 override val unread: Int = 0
                 override val timestamp: Long = (Instant.now()).toEpochMilli()
             },
-            object : GroupItem {
+            object : ThreadedGroupItem {
                 override val id: GroupId = GroupId(getRandomId())
                 override val name: String = "Old forum"
                 override val msgCount: Int = 123
@@ -80,7 +80,7 @@ fun main() = preview {
         )
     }
 
-    val (selected, setSelected) = remember { mutableStateOf<GroupItem?>(null) }
+    val (selected, setSelected) = remember { mutableStateOf<ThreadedGroupItem?>(null) }
     val (filterBy, setFilterBy) = remember { mutableStateOf("") }
 
     val filteredList = remember(filterBy) {
@@ -89,7 +89,7 @@ fun main() = preview {
         }.sortedByDescending { it.timestamp }
     }
 
-    GroupList(
+    ThreadedGroupList(
         strings = ForumStrings,
         list = filteredList,
         isSelected = { selected?.id == it },
@@ -101,13 +101,13 @@ fun main() = preview {
 }
 
 @Composable
-fun GroupList(
-    strings: GroupStrings,
-    list: List<GroupItem>,
+fun ThreadedGroupList(
+    strings: ThreadedGroupStrings,
+    list: List<ThreadedGroupItem>,
     isSelected: (GroupId) -> Boolean,
     filterBy: String,
     onFilterSet: (String) -> Unit,
-    onGroupItemSelected: (GroupItem) -> Unit,
+    onGroupItemSelected: (ThreadedGroupItem) -> Unit,
     onAddButtonClicked: () -> Unit,
 ) = Column(
     modifier = Modifier.fillMaxHeight().width(COLUMN_WIDTH).background(MaterialTheme.colors.surfaceVariant),
@@ -143,9 +143,9 @@ fun GroupList(
                     // let divider start at horizontal position of text
                     dividerOffsetFromStart = (16 + 36 + 12).dp,
                 ) {
-                    GroupItemView(
+                    ThreadedGroupItemView(
                         strings = strings,
-                        groupItem = item,
+                        threadedGroupItem = item,
                         modifier = Modifier
                             .heightIn(min = HEADER_SIZE)
                             .fillMaxWidth()
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupListViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupListViewModel.kt
similarity index 90%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupListViewModel.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupListViewModel.kt
index 906a7c8ad7..e404bee0fe 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupListViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupListViewModel.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group
+package org.briarproject.briar.desktop.threadedgroup
 
 import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.mutableStateOf
@@ -32,13 +32,13 @@ import org.briarproject.bramble.api.sync.GroupId
 import org.briarproject.bramble.api.sync.event.GroupAddedEvent
 import org.briarproject.bramble.api.sync.event.GroupRemovedEvent
 import org.briarproject.briar.api.client.PostHeader
-import org.briarproject.briar.desktop.group.conversation.ThreadedConversationViewModel
+import org.briarproject.briar.desktop.threadedgroup.conversation.ThreadedConversationViewModel
 import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.utils.clearAndAddAll
 import org.briarproject.briar.desktop.viewmodel.EventListenerDbViewModel
 import org.briarproject.briar.desktop.viewmodel.asState
 
-abstract class GroupListViewModel<T : GroupItem>(
+abstract class ThreadedGroupListViewModel<T : ThreadedGroupItem>(
     val threadViewModel: ThreadedConversationViewModel,
     briarExecutors: BriarExecutors,
     lifecycleManager: LifecycleManager,
@@ -127,10 +127,10 @@ abstract class GroupListViewModel<T : GroupItem>(
 
     protected abstract fun addOwnMessage(header: PostHeader)
 
-    fun selectGroup(groupItem: GroupItem) {
-        if (_selectedGroupId.value == groupItem.id) return
-        _selectedGroupId.value = groupItem.id
-        threadViewModel.setGroupItem(groupItem, this::addOwnMessage)
+    fun selectGroup(threadedGroupItem: ThreadedGroupItem) {
+        if (_selectedGroupId.value == threadedGroupItem.id) return
+        _selectedGroupId.value = threadedGroupItem.id
+        threadViewModel.setGroupItem(threadedGroupItem, this::addOwnMessage)
     }
 
     fun isSelected(groupId: GroupId) = _selectedGroupId.value == groupId
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupScreen.kt
similarity index 77%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupScreen.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupScreen.kt
index 53c37dc6dd..2c5676181e 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupScreen.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group
+package org.briarproject.briar.desktop.threadedgroup
 
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
@@ -32,20 +32,20 @@ import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 import org.briarproject.briar.desktop.conversation.Explainer
-import org.briarproject.briar.desktop.group.conversation.GroupConversationScreen
-import org.briarproject.briar.desktop.group.conversation.GroupDropdownMenu
+import org.briarproject.briar.desktop.threadedgroup.conversation.ThreadedGroupConversationScreen
+import org.briarproject.briar.desktop.threadedgroup.conversation.ThreadedGroupDropdownMenu
 import org.briarproject.briar.desktop.ui.ColoredIconButton
 import org.briarproject.briar.desktop.ui.VerticalDivider
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n
 
 @Composable
-fun <T : GroupItem> GroupScreen(
-    strings: GroupStrings,
-    viewModel: GroupListViewModel<T>,
-    dropdownMenu: GroupDropdownMenu,
+fun <T : ThreadedGroupItem> ThreadedGroupScreen(
+    strings: ThreadedGroupStrings,
+    viewModel: ThreadedGroupListViewModel<T>,
+    dropdownMenu: ThreadedGroupDropdownMenu,
 ) {
     var addDialogVisible by remember { mutableStateOf(false) }
-    AddGroupDialog(
+    AddThreadedGroupDialog(
         strings = strings,
         visible = addDialogVisible,
         onCreate = { name ->
@@ -56,10 +56,10 @@ fun <T : GroupItem> GroupScreen(
     )
 
     if (viewModel.noGroupsYet.value) {
-        NoGroupsYet(strings) { addDialogVisible = true }
+        NoThreadedGroupsYet(strings) { addDialogVisible = true }
     } else {
         Row(modifier = Modifier.fillMaxWidth()) {
-            GroupList(
+            ThreadedGroupList(
                 strings = strings,
                 list = viewModel.list.value,
                 isSelected = viewModel::isSelected,
@@ -71,9 +71,9 @@ fun <T : GroupItem> GroupScreen(
             VerticalDivider()
             Column(modifier = Modifier.weight(1f).fillMaxHeight()) {
                 if (viewModel.selectedGroupId.value == null) {
-                    NoGroupSelected(strings)
+                    NoThreadedGroupSelected(strings)
                 } else {
-                    GroupConversationScreen(strings, viewModel.threadViewModel, dropdownMenu)
+                    ThreadedGroupConversationScreen(strings, viewModel.threadViewModel, dropdownMenu)
                 }
             }
         }
@@ -81,7 +81,7 @@ fun <T : GroupItem> GroupScreen(
 }
 
 @Composable
-fun NoGroupsYet(strings: GroupStrings, onAdd: () -> Unit) = Explainer(
+private fun NoThreadedGroupsYet(strings: ThreadedGroupStrings, onAdd: () -> Unit) = Explainer(
     headline = i18n("welcome.title"),
     text = strings.noGroupsYet,
 ) {
@@ -94,7 +94,7 @@ fun NoGroupsYet(strings: GroupStrings, onAdd: () -> Unit) = Explainer(
 }
 
 @Composable
-fun NoGroupSelected(strings: GroupStrings) = Explainer(
+private fun NoThreadedGroupSelected(strings: ThreadedGroupStrings) = Explainer(
     headline = strings.noGroupSelectedTitle,
     text = strings.noGroupSelectedText,
 )
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupStrings.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt
similarity index 94%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupStrings.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt
index 1f10a44825..f1cec8e35d 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/GroupStrings.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group
+package org.briarproject.briar.desktop.threadedgroup
 
-abstract class GroupStrings(
+abstract class ThreadedGroupStrings(
     val listTitle: String,
     val listDescription: String,
     val addGroupTitle: String,
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadItem.kt
similarity index 97%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadItem.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadItem.kt
index 7ad139c531..8456139768 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadItem.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadItem.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group.conversation
+package org.briarproject.briar.desktop.threadedgroup.conversation
 
 import org.briarproject.bramble.api.identity.Author
 import org.briarproject.bramble.api.sync.MessageId
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadItemView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadItemView.kt
similarity index 98%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadItemView.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadItemView.kt
index ac4e489a5c..64cc1ec225 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadItemView.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadItemView.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group.conversation
+package org.briarproject.briar.desktop.threadedgroup.conversation
 
 import androidx.compose.animation.AnimatedVisibility
 import androidx.compose.foundation.ExperimentalFoundationApi
@@ -53,7 +53,7 @@ import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
 import org.briarproject.briar.api.identity.AuthorInfo.Status.OURSELVES
 import org.briarproject.briar.desktop.contact.ProfileCircle
-import org.briarproject.briar.desktop.forums.conversation.ForumPostItem
+import org.briarproject.briar.desktop.forum.conversation.ForumPostItem
 import org.briarproject.briar.desktop.theme.Blue500
 import org.briarproject.briar.desktop.theme.divider
 import org.briarproject.briar.desktop.ui.Constants.COLUMN_WIDTH
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedConversationViewModel.kt
similarity index 85%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationViewModel.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedConversationViewModel.kt
index f96815a40c..b14b6456b4 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedConversationViewModel.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group.conversation
+package org.briarproject.briar.desktop.threadedgroup.conversation
 
 import androidx.compose.runtime.mutableStateOf
 import kotlinx.coroutines.Job
@@ -29,9 +29,9 @@ import org.briarproject.bramble.api.sync.GroupId
 import org.briarproject.bramble.api.sync.MessageId
 import org.briarproject.briar.api.client.PostHeader
 import org.briarproject.briar.client.MessageTreeImpl
-import org.briarproject.briar.desktop.forums.ForumPostReadEvent
-import org.briarproject.briar.desktop.forums.sharing.ForumSharingViewModel
-import org.briarproject.briar.desktop.group.GroupItem
+import org.briarproject.briar.desktop.forum.ForumPostReadEvent
+import org.briarproject.briar.desktop.forum.sharing.ForumSharingViewModel
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupItem
 import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.threading.UiExecutor
 import org.briarproject.briar.desktop.viewmodel.EventListenerDbViewModel
@@ -45,24 +45,24 @@ abstract class ThreadedConversationViewModel(
     private val eventBus: EventBus,
 ) : EventListenerDbViewModel(briarExecutors, lifecycleManager, db, eventBus) {
 
-    private val _groupItem = mutableStateOf<GroupItem?>(null)
-    val groupItem = _groupItem.asState()
+    private val _threadedGroupItem = mutableStateOf<ThreadedGroupItem?>(null)
+    val groupItem = _threadedGroupItem.asState()
 
     protected lateinit var onThreadItemLocallyAdded: (header: PostHeader) -> Unit
 
-    private val _state = mutableStateOf<ThreadedConversationScreenState>(Loading)
+    private val _state = mutableStateOf<ThreadedGroupConversationScreenState>(Loading)
     val state = _state.asState()
 
     private val _selectedThreadItem = mutableStateOf<ThreadItem?>(null)
     val selectedThreadItem = _selectedThreadItem.asState()
 
     @UiExecutor
-    fun setGroupItem(groupItem: GroupItem, onThreadItemLocallyAdded: (header: PostHeader) -> Unit) {
+    fun setGroupItem(threadedGroupItem: ThreadedGroupItem, onThreadItemLocallyAdded: (header: PostHeader) -> Unit) {
         this.onThreadItemLocallyAdded = onThreadItemLocallyAdded
-        _groupItem.value = groupItem
+        _threadedGroupItem.value = threadedGroupItem
         _selectedThreadItem.value = null
-        forumSharingViewModel.setGroupId(groupItem.id)
-        loadThreadItems(groupItem.id)
+        forumSharingViewModel.setGroupId(threadedGroupItem.id)
+        loadThreadItems(threadedGroupItem.id)
     }
 
     override fun onInit() {
@@ -119,7 +119,7 @@ abstract class ThreadedConversationViewModel(
             item.id
         } ?: emptyList()
 
-        val groupId = _groupItem.value?.id
+        val groupId = _threadedGroupItem.value?.id
         if (readIds.isNotEmpty() && groupId != null) {
             runOnDbThread {
                 readIds.forEach { id ->
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationContent.kt
similarity index 93%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationScreen.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationContent.kt
index d1fc5090fa..5b2998eeaa 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationContent.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group.conversation
+package org.briarproject.briar.desktop.threadedgroup.conversation
 
 import androidx.compose.foundation.VerticalScrollbar
 import androidx.compose.foundation.layout.Box
@@ -36,14 +36,14 @@ import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.delay
 import org.briarproject.bramble.api.sync.MessageId
 import org.briarproject.briar.desktop.conversation.reallyVisibleItemsInfo
-import org.briarproject.briar.desktop.group.GroupStrings
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupStrings
 import org.briarproject.briar.desktop.ui.Loader
 import org.briarproject.briar.desktop.ui.isWindowFocused
 
 @Composable
-fun ThreadedConversationScreen(
-    strings: GroupStrings,
-    state: ThreadedConversationScreenState,
+fun ThreadedGroupConversationContent(
+    strings: ThreadedGroupStrings,
+    state: ThreadedGroupConversationScreenState,
     selectedThreadItem: ThreadItem?,
     onThreadItemSelected: (ThreadItem) -> Unit,
     onThreadItemsVisible: (List<MessageId>) -> Unit,
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationInput.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationInput.kt
similarity index 96%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationInput.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationInput.kt
index 91b1b2d2cd..89b77665cb 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationInput.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationInput.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group.conversation
+package org.briarproject.briar.desktop.threadedgroup.conversation
 
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
@@ -45,17 +45,17 @@ import androidx.compose.ui.input.pointer.PointerIconDefaults
 import androidx.compose.ui.input.pointer.pointerHoverIcon
 import androidx.compose.ui.unit.dp
 import org.briarproject.bramble.util.StringUtils.utf8IsTooLong
-import org.briarproject.briar.desktop.group.GroupStrings
 import org.briarproject.briar.desktop.theme.divider
 import org.briarproject.briar.desktop.theme.sendButton
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupStrings
 import org.briarproject.briar.desktop.ui.HorizontalDivider
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n
 import org.briarproject.briar.desktop.utils.StringUtils.takeUtf8
 
 @Composable
 @OptIn(ExperimentalComposeUiApi::class)
-fun ThreadedConversationInput(
-    strings: GroupStrings,
+fun ThreadedGroupConversationInput(
+    strings: ThreadedGroupStrings,
     selectedThreadItem: ThreadItem?,
     onReplyClosed: () -> Unit,
     onSend: (String) -> Unit,
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/GroupConversationScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationScreen.kt
similarity index 85%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/GroupConversationScreen.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationScreen.kt
index 6e19d0db82..6f5422be11 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/GroupConversationScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationScreen.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group.conversation
+package org.briarproject.briar.desktop.threadedgroup.conversation
 
 import androidx.compose.foundation.layout.Arrangement.SpaceBetween
 import androidx.compose.foundation.layout.Arrangement.spacedBy
@@ -51,26 +51,26 @@ import androidx.compose.ui.text.style.TextOverflow.Companion.Ellipsis
 import androidx.compose.ui.unit.dp
 import org.briarproject.briar.desktop.contact.ContactDropDown.State.CLOSED
 import org.briarproject.briar.desktop.contact.ContactDropDown.State.MAIN
-import org.briarproject.briar.desktop.forums.sharing.ForumSharingViewModel
-import org.briarproject.briar.desktop.group.GroupCircle
-import org.briarproject.briar.desktop.group.GroupItem
-import org.briarproject.briar.desktop.group.GroupStrings
+import org.briarproject.briar.desktop.forum.sharing.ForumSharingViewModel
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupCircle
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupItem
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupStrings
 import org.briarproject.briar.desktop.ui.Constants.HEADER_SIZE
 import org.briarproject.briar.desktop.ui.HorizontalDivider
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n
 
 @Composable
-fun GroupConversationScreen(
-    strings: GroupStrings,
+fun ThreadedGroupConversationScreen(
+    strings: ThreadedGroupStrings,
     viewModel: ThreadedConversationViewModel,
-    dropdownMenu: GroupDropdownMenu,
+    dropdownMenu: ThreadedGroupDropdownMenu,
 ) {
     Scaffold(
         topBar = {
             viewModel.groupItem.value?.let { groupItem ->
-                GroupConversationHeader(
+                ThreadedGroupConversationHeader(
                     strings = strings,
-                    groupItem = groupItem,
+                    threadedGroupItem = groupItem,
                     forumSharingViewModel = viewModel.forumSharingViewModel,
                     onGroupDelete = viewModel::deleteGroup,
                     dropdownMenu = dropdownMenu,
@@ -78,7 +78,7 @@ fun GroupConversationScreen(
             }
         },
         content = { padding ->
-            ThreadedConversationScreen(
+            ThreadedGroupConversationContent(
                 strings = strings,
                 state = viewModel.state.value,
                 selectedThreadItem = viewModel.selectedThreadItem.value,
@@ -89,7 +89,7 @@ fun GroupConversationScreen(
         },
         bottomBar = {
             val onCloseReply = { viewModel.selectThreadItem(null) }
-            ThreadedConversationInput(strings, viewModel.selectedThreadItem.value, onCloseReply) { text ->
+            ThreadedGroupConversationInput(strings, viewModel.selectedThreadItem.value, onCloseReply) { text ->
                 viewModel.createThreadItem(text)
             }
         }
@@ -97,12 +97,12 @@ fun GroupConversationScreen(
 }
 
 @Composable
-private fun GroupConversationHeader(
-    strings: GroupStrings,
-    groupItem: GroupItem,
+private fun ThreadedGroupConversationHeader(
+    strings: ThreadedGroupStrings,
+    threadedGroupItem: ThreadedGroupItem,
     forumSharingViewModel: ForumSharingViewModel,
     onGroupDelete: () -> Unit,
-    dropdownMenu: GroupDropdownMenu,
+    dropdownMenu: ThreadedGroupDropdownMenu,
 ) {
     val deleteGroupDialogVisible = remember { mutableStateOf(false) }
     val menuState = remember { mutableStateOf(CLOSED) }
@@ -120,11 +120,11 @@ private fun GroupConversationHeader(
                 horizontalArrangement = spacedBy(12.dp),
                 verticalAlignment = CenterVertically
             ) {
-                GroupCircle(groupItem)
+                ThreadedGroupCircle(threadedGroupItem)
                 Column {
                     Text(
                         modifier = Modifier,
-                        text = groupItem.name,
+                        text = threadedGroupItem.name,
                         maxLines = 2,
                         overflow = Ellipsis,
                         style = MaterialTheme.typography.h2,
@@ -151,7 +151,7 @@ private fun GroupConversationHeader(
         HorizontalDivider(modifier = Modifier.align(BottomCenter))
     }
     if (deleteGroupDialogVisible.value) {
-        DeleteGroupDialog(
+        DeleteThreadedGroupDialog(
             strings = strings,
             close = { deleteGroupDialogVisible.value = false },
             onDelete = onGroupDelete,
@@ -161,8 +161,8 @@ private fun GroupConversationHeader(
 
 @Composable
 @OptIn(ExperimentalMaterialApi::class)
-private fun DeleteGroupDialog(
-    strings: GroupStrings,
+private fun DeleteThreadedGroupDialog(
+    strings: ThreadedGroupStrings,
     close: () -> Unit,
     onDelete: () -> Unit = {},
 ) {
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationScreenState.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationScreenState.kt
similarity index 90%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationScreenState.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationScreenState.kt
index 1f2f870a7b..26da505ae6 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/ThreadedConversationScreenState.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupConversationScreenState.kt
@@ -16,18 +16,18 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group.conversation
+package org.briarproject.briar.desktop.threadedgroup.conversation
 
 import org.briarproject.bramble.api.sync.MessageId
 import org.briarproject.briar.client.MessageTreeImpl
 import org.briarproject.briar.desktop.threading.UiExecutor
 
-sealed class ThreadedConversationScreenState
-object Loading : ThreadedConversationScreenState()
+sealed class ThreadedGroupConversationScreenState
+object Loading : ThreadedGroupConversationScreenState()
 class Loaded(
     val messageTree: MessageTreeImpl<ThreadItem>,
     val scrollTo: MessageId? = null,
-) : ThreadedConversationScreenState() {
+) : ThreadedGroupConversationScreenState() {
     val posts: List<ThreadItem> = messageTree.depthFirstOrder()
 
     @UiExecutor
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/GroupDropdownMenu.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupDropdownMenu.kt
similarity index 82%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/GroupDropdownMenu.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupDropdownMenu.kt
index 9f18452773..0e567fc9f5 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/GroupDropdownMenu.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/ThreadedGroupDropdownMenu.kt
@@ -16,12 +16,12 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group.conversation
+package org.briarproject.briar.desktop.threadedgroup.conversation
 
 import androidx.compose.runtime.Composable
-import org.briarproject.briar.desktop.forums.sharing.ForumSharingViewModel
+import org.briarproject.briar.desktop.forum.sharing.ForumSharingViewModel
 
-typealias GroupDropdownMenu = @Composable (
+typealias ThreadedGroupDropdownMenu = @Composable (
     forumSharingViewModel: ForumSharingViewModel,
     expanded: Boolean,
     onClose: () -> Unit,
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/UnreadFabs.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/UnreadFabs.kt
similarity index 95%
rename from briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/UnreadFabs.kt
rename to briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/UnreadFabs.kt
index b3e1dc3710..0f006388eb 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/group/conversation/UnreadFabs.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/conversation/UnreadFabs.kt
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package org.briarproject.briar.desktop.group.conversation
+package org.briarproject.briar.desktop.threadedgroup.conversation
 
 import androidx.compose.animation.AnimatedVisibility
 import androidx.compose.foundation.layout.Box
@@ -38,13 +38,13 @@ import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 import org.briarproject.briar.desktop.conversation.firstReallyVisibleItemIndex
 import org.briarproject.briar.desktop.conversation.lastReallyVisibleItemIndex
-import org.briarproject.briar.desktop.group.GroupStrings
 import org.briarproject.briar.desktop.theme.ChevronDown
 import org.briarproject.briar.desktop.theme.ChevronUp
+import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupStrings
 import org.briarproject.briar.desktop.ui.NumberBadge
 
 @Composable
-fun BoxScope.UnreadFabs(strings: GroupStrings, scrollState: LazyListState, postsState: Loaded) {
+fun BoxScope.UnreadFabs(strings: ThreadedGroupStrings, scrollState: LazyListState, postsState: Loaded) {
     val coroutineScope = rememberCoroutineScope()
 
     // remember first really visible item index based on scroll offset
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt
index bd2ca81b88..b1b37c56c4 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt
@@ -28,7 +28,7 @@ import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.runtime.staticCompositionLocalOf
 import org.briarproject.briar.desktop.conversation.PrivateMessageScreen
-import org.briarproject.briar.desktop.forums.ForumScreen
+import org.briarproject.briar.desktop.forum.ForumScreen
 import org.briarproject.briar.desktop.mailbox.MailboxScreen
 import org.briarproject.briar.desktop.navigation.BriarSidebar
 import org.briarproject.briar.desktop.navigation.SidebarViewModel
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MessageCounterImpl.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MessageCounterImpl.kt
index fb38662041..876ec358b2 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MessageCounterImpl.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MessageCounterImpl.kt
@@ -33,7 +33,7 @@ import org.briarproject.briar.api.conversation.event.ConversationMessageReceived
 import org.briarproject.briar.api.forum.ForumManager
 import org.briarproject.briar.api.forum.event.ForumPostReceivedEvent
 import org.briarproject.briar.desktop.conversation.ConversationMessagesReadEvent
-import org.briarproject.briar.desktop.forums.ForumPostReadEvent
+import org.briarproject.briar.desktop.forum.ForumPostReadEvent
 import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.threading.UiExecutor
 import org.briarproject.briar.desktop.ui.MessageCounterDataType.Forum
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/viewmodel/ViewModelModule.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/viewmodel/ViewModelModule.kt
index f3f1c99d07..244409ecf8 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/viewmodel/ViewModelModule.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/viewmodel/ViewModelModule.kt
@@ -25,8 +25,8 @@ import dagger.multibindings.IntoMap
 import org.briarproject.briar.desktop.contact.ContactListViewModel
 import org.briarproject.briar.desktop.contact.add.remote.AddContactViewModel
 import org.briarproject.briar.desktop.conversation.ConversationViewModel
-import org.briarproject.briar.desktop.forums.ForumListViewModel
-import org.briarproject.briar.desktop.forums.sharing.ForumSharingViewModel
+import org.briarproject.briar.desktop.forum.ForumListViewModel
+import org.briarproject.briar.desktop.forum.sharing.ForumSharingViewModel
 import org.briarproject.briar.desktop.introduction.IntroductionViewModel
 import org.briarproject.briar.desktop.login.StartupViewModel
 import org.briarproject.briar.desktop.mailbox.MailboxViewModel
-- 
GitLab