diff --git a/src/api/conversation.h b/src/api/conversation.h
index ebaa06ffb53d617b97210992423a080f1491c469..fad439b5d82c913f8d17573b04e14e9ef6966c5a 100644
--- a/src/api/conversation.h
+++ b/src/api/conversation.h
@@ -86,6 +86,7 @@ struct Info
     Mode mode = Mode::NON_SWARM;
     bool needsSyncing = false;
     bool isRequest = false;
+    bool readOnly = false;
 };
 
 } // namespace conversation
diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp
index bb97a27988d7b52cf2e3e366dcf4113f66c140ef..d1d03dc5e90ef11ec59bcb2484106e37f70e3138 100644
--- a/src/conversationmodel.cpp
+++ b/src/conversationmodel.cpp
@@ -2482,13 +2482,17 @@ ConversationModelPimpl::slotConversationMemberEvent(const QString& accountId,
     const VectorMapStringString& members
         = ConfigurationManager::instance().getConversationMembers(linked.owner.id, conversationId);
     VectorString uris;
-
+    VectorString membersRemaining;
     for (auto& member : members) {
         uris.append(member["uri"]);
+        if (member["role"] != "left")
+            membersRemaining.append(member["uri"]);
     }
     conversation.participants = uris;
+    conversation.readOnly = membersRemaining == VectorString(1, linked.owner.profileInfo.uri);
     invalidateModel();
-    emit linked.modelChanged();
+    Q_EMIT linked.modelChanged();
+    Q_EMIT linked.conversationUpdated(conversationId);
     Q_EMIT linked.dataChanged(indexOf(conversationId));
 }
 
@@ -2722,6 +2726,7 @@ ConversationModelPimpl::addSwarmConversation(const QString& convId)
     conversation.uid = convId;
     conversation.accountId = linked.owner.id;
     QString lastRead;
+    VectorString membersRemaining;
     for (auto& member : members) {
         // this check should be removed once all usage of participants replaced by
         // peersForConversation. We should have ourself in participants list
@@ -2733,7 +2738,10 @@ ConversationModelPimpl::addSwarmConversation(const QString& convId)
             lastRead = member["lastDisplayed"];
         }
         conversation.lastDisplayedMessageUid.emplace(member["uri"], member["lastDisplayed"]);
+        if (member["role"] != "left")
+            membersRemaining.append(member["uri"]);
     }
+    conversation.readOnly = membersRemaining == VectorString(1, accountURI);
     conversation.participants = participants;
     conversation.mode = mode;
     conversation.unreadMessages = ConfigurationManager::instance()