diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp
index 20ab8c4f0e763e13d631b9e3a679ce92ff5b6674..4b638d3639259be9e4ebb463b16dcffd779c40f8 100644
--- a/src/conversationsadapter.cpp
+++ b/src/conversationsadapter.cpp
@@ -311,14 +311,30 @@ ConversationsAdapter::onSearchResultUpdated()
 }
 
 void
-ConversationsAdapter::updateConversation(const QString& convId)
+ConversationsAdapter::onConversationReady(const QString& convId)
 {
-    // a conversation request has been accepted or a contact has
-    // been added, so select the conversation and notify the UI to:
-    // - switch tabs to the conversation filter tab
-    // - clear search bar
-    Q_EMIT conversationReady(convId);
-    lrcInstance_->selectConversation(convId);
+    auto convModel = lrcInstance_->getCurrentConversationModel();
+    auto& convInfo = lrcInstance_->getConversationFromConvUid(convId);
+    auto selectedConvId = lrcInstance_->get_selectedConvUid();
+
+    // for one to one conversations including legacy mode, we can prevent
+    // undesired selection by filtering for a conversation peer match,
+    // and for all other swarm convs, we can match the conv's id
+    if (convInfo.isCoreDialog()) {
+        auto peers = convModel->peersForConversation(convId);
+        auto selectedPeers = convModel->peersForConversation(selectedConvId);
+        if (peers != selectedPeers)
+            return;
+    } else if (convId != selectedConvId)
+        return;
+
+    updateConversation(convId);
+}
+
+void
+ConversationsAdapter::onNeedsSyncingSet(const QString& convId)
+{
+    updateConversation(convId);
 }
 
 void
@@ -334,6 +350,17 @@ ConversationsAdapter::onBannedStatusChanged(const QString& uri, bool banned)
     lrcInstance_->set_selectedConvUid();
 }
 
+void
+ConversationsAdapter::updateConversation(const QString& convId)
+{
+    // a conversation request has been accepted or a contact has
+    // been added, so select the conversation and notify the UI to:
+    // - switch tabs to the conversation filter tab
+    // - clear search bar
+    Q_EMIT conversationReady(convId);
+    lrcInstance_->selectConversation(convId);
+}
+
 void
 ConversationsAdapter::updateConversationFilterData()
 {
@@ -463,13 +490,13 @@ ConversationsAdapter::connectConversationModel()
     QObject::connect(currentConversationModel,
                      &ConversationModel::conversationReady,
                      this,
-                     &ConversationsAdapter::updateConversation,
+                     &ConversationsAdapter::onConversationReady,
                      Qt::UniqueConnection);
 
     QObject::connect(currentConversationModel,
                      &ConversationModel::needsSyncingSet,
                      this,
-                     &ConversationsAdapter::updateConversation,
+                     &ConversationsAdapter::onNeedsSyncingSet,
                      Qt::UniqueConnection);
 
     QObject::connect(lrcInstance_->getCurrentContactModel(),
diff --git a/src/conversationsadapter.h b/src/conversationsadapter.h
index 57ed6b83aae1c055fce8098881092ea0dffd0aaa..60a066100023b1728aa83b8d198fb7bb26ce5d09 100644
--- a/src/conversationsadapter.h
+++ b/src/conversationsadapter.h
@@ -81,9 +81,11 @@ private Q_SLOTS:
     void onConversationCleared(const QString&);
     void onSearchStatusChanged(const QString&);
     void onSearchResultUpdated();
-    void updateConversation(const QString&);
+    void onConversationReady(const QString&);
+    void onNeedsSyncingSet(const QString&);
     void onBannedStatusChanged(const QString&, bool);
 
+    void updateConversation(const QString&);
     void updateConversationFilterData();
 
 private: