diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt
index 2dc64b2fa33991551fb3da1e92ae44816377276b..58a2e587b5912d5389f96f247d2d53702a4e1192 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumItem.kt
@@ -42,6 +42,7 @@ data class ForumItem(
     override val id: GroupId = forum.id
     override val name: String = forum.name
     override val creator: String? = null
+    override val isDissolved: Boolean = false
 
     fun updateOnPostReceived(header: PostHeader) =
         copy(
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 cb5a83397dbbc997d985a86bdf5f8e6a84d4eade..38b2ad8dc7701ce174cb6599a1c45c9e351de6a3 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
@@ -28,17 +28,24 @@ import org.briarproject.briar.desktop.utils.UiUtils.getContactDisplayName
 import kotlin.math.max
 
 data class PrivateGroupItem(
-    val privateGroup: PrivateGroup,
-    val creatorInfo: AuthorInfo,
+    private val privateGroup: PrivateGroup,
+    private val creatorInfo: AuthorInfo,
+    override val isDissolved: Boolean,
     override val msgCount: Int,
     override val unread: Int,
     override val timestamp: Long,
 ) : ThreadedGroupItem {
 
-    constructor(privateGroup: PrivateGroup, creatorInfo: AuthorInfo, groupCount: MessageTracker.GroupCount) :
+    constructor(
+        privateGroup: PrivateGroup,
+        creatorInfo: AuthorInfo,
+        isDissolved: Boolean,
+        groupCount: MessageTracker.GroupCount,
+    ) :
         this(
             privateGroup,
             creatorInfo,
+            isDissolved = isDissolved,
             msgCount = groupCount.msgCount,
             unread = groupCount.unreadCount,
             timestamp = groupCount.latestMsgTime
@@ -57,4 +64,7 @@ data class PrivateGroupItem(
 
     fun updateOnMessagesRead(num: Int) =
         copy(unread = unread - num)
+
+    fun updateOnDissolve() =
+        copy(isDissolved = true)
 }
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 7b215505db83316bbfe19ec8869ce0902102c2b0..548c09e63b100b705b5625f82d50cd132433314d 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,6 +40,7 @@ import org.briarproject.briar.api.identity.AuthorManager
 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.GroupDissolvedEvent
 import org.briarproject.briar.api.privategroup.event.GroupMessageAddedEvent
 import org.briarproject.briar.desktop.privategroup.conversation.PrivateGroupConversationViewModel
 import org.briarproject.briar.desktop.threadedgroup.ThreadedGroupListViewModel
@@ -82,6 +83,10 @@ class PrivateGroupListViewModel
                 if (e.clientId != clientId) return
                 updateItem(e.groupId) { it.updateOnMessagesRead(e.numMarkedRead) }
             }
+
+            is GroupDissolvedEvent -> {
+                updateItem(e.groupId) { it.updateOnDissolve() }
+            }
         }
     }
 
@@ -90,6 +95,7 @@ class PrivateGroupListViewModel
         return PrivateGroupItem(
             privateGroup = privateGroup,
             creatorInfo = authorManager.getAuthorInfo(txn, privateGroup.creator.id),
+            isDissolved = privateGroupManager.isDissolved(txn, id),
             groupCount = privateGroupManager.getGroupCount(txn, id),
         )
     }
@@ -113,6 +119,7 @@ class PrivateGroupListViewModel
         privateGroupManager.getPrivateGroups(txn).map { privateGroup ->
             PrivateGroupItem(
                 privateGroup = privateGroup,
+                isDissolved = privateGroupManager.isDissolved(txn, privateGroup.id),
                 creatorInfo = authorManager.getAuthorInfo(txn, privateGroup.creator.id),
                 groupCount = privateGroupManager.getGroupCount(txn, privateGroup.id),
             )
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 0ea2f4f32013d11d8bc47a4d817c1e175293b3c6..9b166b0a06aa339ccf06fba6c1e25d7ccd6b674c 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
@@ -44,6 +44,7 @@ object PrivateGroupStrings : ThreadedGroupStrings(
     lastMessage = { timestamp ->
         i18nF("access.group.last_post_timestamp", timestamp)
     },
+    groupDissolved = i18n("group.card.dissolved"),
     groupNameMaxLength = MAX_GROUP_NAME_LENGTH,
     sharedWith = { total, online ->
         i18nF("group.sharing.status.with", total, online)
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt
index 2ed41af40c802f157b3c31734dcbe2c278e40148..bf3da60bfcf66c7713f1fe09072e703bbf74351f 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItem.kt
@@ -24,6 +24,7 @@ interface ThreadedGroupItem {
     val id: GroupId
     val name: String
     val creator: String?
+    val isDissolved: Boolean
     val msgCount: Int
     val unread: Int
     val timestamp: Long
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt
index afe98b0ef3bc5e3dcd41e245df877e40ee7b4e0b..9b726370d934065295521ef68b721cb950d0df19 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupItemView.kt
@@ -38,6 +38,7 @@ import androidx.compose.ui.Alignment.Companion.Start
 import androidx.compose.ui.Alignment.Companion.Top
 import androidx.compose.ui.Alignment.Companion.TopEnd
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.alpha
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.semantics.text
 import androidx.compose.ui.text.style.TextOverflow
@@ -56,6 +57,7 @@ import java.time.Instant
 fun main() = preview(
     "name" to "This is a test forum! This is a test forum! This is a test forum! This is a test forum!",
     "creator" to "Bobby",
+    "isDissolved" to false,
     "msgCount" to 42,
     "unread" to 23,
     "timestamp" to Instant.now().toEpochMilli(),
@@ -64,6 +66,7 @@ fun main() = preview(
         override val id: GroupId = GroupId(getRandomIdPersistent())
         override val name: String = getStringParameter("name")
         override val creator: String = getStringParameter("creator")
+        override val isDissolved: Boolean = getBooleanParameter("isDissolved")
         override val msgCount: Int = getIntParameter("msgCount")
         override val unread: Int = getIntParameter("unread")
         override val timestamp: Long = getLongParameter("timestamp")
@@ -84,7 +87,7 @@ fun ThreadedGroupItemView(
         .height(IntrinsicSize.Min)
         .semantics {
             text = getDescription(strings, threadedGroupItem)
-        },
+        }.alpha(if (threadedGroupItem.isDissolved) 0.5f else 1f),
 ) {
     Box(Modifier.align(Top).padding(vertical = 8.dp)) {
         ThreadedGroupCircle(threadedGroupItem)
@@ -129,13 +132,20 @@ private fun ThreadedGroupItemViewInfo(strings: ThreadedGroupStrings, threadedGro
         horizontalArrangement = SpaceBetween,
         modifier = Modifier.fillMaxWidth()
     ) {
-        Text(
-            text = strings.messageCount(threadedGroupItem.msgCount),
-            style = MaterialTheme.typography.caption
-        )
-        if (threadedGroupItem.msgCount > 0) {
+        if (!threadedGroupItem.isDissolved) {
+            Text(
+                text = strings.messageCount(threadedGroupItem.msgCount),
+                style = MaterialTheme.typography.caption
+            )
+            if (threadedGroupItem.msgCount > 0) {
+                Text(
+                    text = getFormattedTimestamp(threadedGroupItem.timestamp),
+                    style = MaterialTheme.typography.caption
+                )
+            }
+        } else {
             Text(
-                text = getFormattedTimestamp(threadedGroupItem.timestamp),
+                text = strings.groupDissolved,
                 style = MaterialTheme.typography.caption
             )
         }
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt
index c320af81f153f73fcab70d81b2d601947aed48ef..05079c443e7946ba6c4acda94bbb86e2f086a685 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupList.kt
@@ -60,6 +60,7 @@ fun main() = preview {
                 override val name: String =
                     "This is a test forum! This is a test forum! This is a test forum! This is a test forum!"
                 override val creator: String? = null
+                override val isDissolved: Boolean = false
                 override val msgCount: Int = 42
                 override val unread: Int = 23
                 override val timestamp: Long = (Instant.now().minusSeconds(300)).toEpochMilli()
@@ -68,6 +69,7 @@ fun main() = preview {
                 override val id: GroupId = GroupId(getRandomId())
                 override val name: String = "Newly added group"
                 override val creator: String = "Alicia"
+                override val isDissolved: Boolean = false
                 override val msgCount: Int = 0
                 override val unread: Int = 0
                 override val timestamp: Long = (Instant.now()).toEpochMilli()
@@ -75,7 +77,8 @@ fun main() = preview {
             object : ThreadedGroupItem {
                 override val id: GroupId = GroupId(getRandomId())
                 override val name: String = "Old forum"
-                override val creator: String? = null
+                override val creator: String = "Bernard"
+                override val isDissolved: Boolean = true
                 override val msgCount: Int = 123
                 override val unread: Int = 5
                 override val timestamp: Long = (Instant.now().minusSeconds(1200)).toEpochMilli()
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt
index 32476e5a2f7704d42834742a1812a3eb8dbfd261..ce8bb7b8b91840d8f04b700320a6eb674cb14f67 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupStrings.kt
@@ -30,6 +30,7 @@ abstract class ThreadedGroupStrings(
     val messageCount: (Int) -> String,
     val unreadCount: (Int) -> String,
     val lastMessage: (String) -> String,
+    val groupDissolved: String = "",
     val groupNameMaxLength: Int,
     val sharedWith: (total: Int, online: Int) -> String,
     val unreadJumpToPrevious: String,
diff --git a/briar-desktop/src/main/resources/strings/BriarDesktop.properties b/briar-desktop/src/main/resources/strings/BriarDesktop.properties
index 327cf981bbdef395e682b82504017b7868d42e0b..7efbf66b3d8daea7550d1ccea950d8f6f46a8b7b 100644
--- a/briar-desktop/src/main/resources/strings/BriarDesktop.properties
+++ b/briar-desktop/src/main/resources/strings/BriarDesktop.properties
@@ -185,6 +185,7 @@ group.card.no_posts=No messages
 group.card.posts={0, plural, one {{0} post} other {{0} messages}}
 group.card.created=Created by {0}
 group.card.messages={0, plural, one {{0} message} other {{0} messages}}
+group.card.dissolved=This group has been dissolved
 group.sharing.status.with=Shared with {0} ({1} online)
 group.message.hint=New Message
 group.message.reply.hint=New Reply