diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp
index 9db145d0013895d25b5995ecc9b3e3fe6b45bbd0..8a1877f87b860d69fdbdeae6d1f3f8986f9ed67d 100644
--- a/src/conversationsadapter.cpp
+++ b/src/conversationsadapter.cpp
@@ -331,14 +331,14 @@ ConversationsAdapter::onSearchResultUpdated()
 }
 
 void
-ConversationsAdapter::onConversationReady(const QString& convId)
+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
-    lrcInstance_->selectConversation(convId);
     Q_EMIT conversationReady(convId);
+    lrcInstance_->selectConversation(convId);
 }
 
 void
@@ -426,51 +426,57 @@ ConversationsAdapter::connectConversationModel()
     auto currentConversationModel = lrcInstance_->getCurrentConversationModel();
 
     QObject::connect(currentConversationModel,
-                     &lrc::api::ConversationModel::modelChanged,
+                     &ConversationModel::modelChanged,
                      this,
                      &ConversationsAdapter::onModelChanged,
                      Qt::UniqueConnection);
 
     QObject::connect(lrcInstance_->getCurrentAccountInfo().contactModel.get(),
-                     &lrc::api::ContactModel::profileUpdated,
+                     &ContactModel::profileUpdated,
                      this,
                      &ConversationsAdapter::onProfileUpdated,
                      Qt::UniqueConnection);
 
     QObject::connect(currentConversationModel,
-                     &lrc::api::ConversationModel::conversationUpdated,
+                     &ConversationModel::conversationUpdated,
                      this,
                      &ConversationsAdapter::onConversationUpdated,
                      Qt::UniqueConnection);
 
     QObject::connect(currentConversationModel,
-                     &lrc::api::ConversationModel::filterChanged,
+                     &ConversationModel::filterChanged,
                      this,
                      &ConversationsAdapter::onFilterChanged,
                      Qt::UniqueConnection);
 
     QObject::connect(currentConversationModel,
-                     &lrc::api::ConversationModel::conversationCleared,
+                     &ConversationModel::conversationCleared,
                      this,
                      &ConversationsAdapter::onConversationCleared,
                      Qt::UniqueConnection);
 
     QObject::connect(currentConversationModel,
-                     &lrc::api::ConversationModel::searchStatusChanged,
+                     &ConversationModel::searchStatusChanged,
                      this,
                      &ConversationsAdapter::onSearchStatusChanged,
                      Qt::UniqueConnection);
 
     QObject::connect(currentConversationModel,
-                     &lrc::api::ConversationModel::searchResultUpdated,
+                     &ConversationModel::searchResultUpdated,
                      this,
                      &ConversationsAdapter::onSearchResultUpdated,
                      Qt::UniqueConnection);
 
     QObject::connect(currentConversationModel,
-                     &lrc::api::ConversationModel::conversationReady,
+                     &ConversationModel::conversationReady,
+                     this,
+                     &ConversationsAdapter::updateConversation,
+                     Qt::UniqueConnection);
+
+    QObject::connect(currentConversationModel,
+                     &ConversationModel::needsSyncingSet,
                      this,
-                     &ConversationsAdapter::onConversationReady,
+                     &ConversationsAdapter::updateConversation,
                      Qt::UniqueConnection);
 
     convSrcModel_.reset(new ConversationListModel(lrcInstance_));
diff --git a/src/conversationsadapter.h b/src/conversationsadapter.h
index 7b49a346c440a8238f1793c8fbecf9ab8682390a..052a19129d1883a6d8f599132615e1370dbdc793 100644
--- a/src/conversationsadapter.h
+++ b/src/conversationsadapter.h
@@ -82,7 +82,7 @@ private Q_SLOTS:
     void onConversationCleared(const QString&);
     void onSearchStatusChanged(const QString&);
     void onSearchResultUpdated();
-    void onConversationReady(const QString&);
+    void updateConversation(const QString&);
 
     void updateConversationFilterData();
 
diff --git a/src/messagesadapter.cpp b/src/messagesadapter.cpp
index ee1f15d0e3dc83520440946f7d39a28d61eb4fce..618384d533af2aa47a67022f854737a00ae58115 100644
--- a/src/messagesadapter.cpp
+++ b/src/messagesadapter.cpp
@@ -119,85 +119,111 @@ MessagesAdapter::setupChatView(const QString& convUid)
 }
 
 void
-MessagesAdapter::connectConversationModel()
+MessagesAdapter::onNewInteraction(const QString& convUid,
+                                  const QString& interactionId,
+                                  const lrc::api::interaction::Info& interaction)
+{
+    auto accountId = lrcInstance_->getCurrentAccountId();
+    newInteraction(accountId, convUid, interactionId, interaction);
+}
+
+void
+MessagesAdapter::onInteractionStatusUpdated(const QString& convUid,
+                                            const QString& interactionId,
+                                            const lrc::api::interaction::Info& interaction)
 {
     auto currentConversationModel = lrcInstance_->getCurrentConversationModel();
+    currentConversationModel->clearUnreadInteractions(convUid);
+    updateInteraction(*currentConversationModel, interactionId, interaction);
+}
+
+void
+MessagesAdapter::onInteractionRemoved(const QString& convUid, const QString& interactionId)
+{
+    Q_UNUSED(convUid);
+    removeInteraction(interactionId);
+}
 
-    QObject::disconnect(newInteractionConnection_);
-    QObject::disconnect(interactionRemovedConnection_);
-    QObject::disconnect(interactionStatusUpdatedConnection_);
-    QObject::disconnect(conversationUpdatedConnection_);
-    QObject::disconnect(composingConnection_);
+void
+MessagesAdapter::onNewMessagesAvailable(const QString& accountId, const QString& conversationId)
+{
+    auto* convModel = lrcInstance_->accountModel().getAccountInfo(accountId).conversationModel.get();
+    auto optConv = convModel->getConversationForUid(conversationId);
+    if (!optConv)
+        return;
+    updateHistory(*convModel, optConv->get().interactions, optConv->get().allMessagesLoaded);
+    Utils::oneShotConnect(qmlObj_, SIGNAL(messagesLoaded()), this, SLOT(slotMessagesLoaded()));
+}
 
-    newInteractionConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::newInteraction,
-                           [this](const QString& convUid,
-                                  const QString& interactionId,
-                                  const lrc::api::interaction::Info& interaction) {
-                               auto accountId = lrcInstance_->getCurrentAccountId();
-                               newInteraction(accountId, convUid, interactionId, interaction);
-                           });
-
-    interactionStatusUpdatedConnection_ = QObject::connect(
-        currentConversationModel,
-        &lrc::api::ConversationModel::interactionStatusUpdated,
-        [this](const QString& convUid,
-               const QString& interactionId,
-               const lrc::api::interaction::Info& interaction) {
-            auto currentConversationModel = lrcInstance_->getCurrentConversationModel();
-            currentConversationModel->clearUnreadInteractions(convUid);
-            updateInteraction(*currentConversationModel, interactionId, interaction);
-        });
-
-    interactionRemovedConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::interactionRemoved,
-                           [this](const QString& convUid, const QString& interactionId) {
-                               Q_UNUSED(convUid);
-                               removeInteraction(interactionId);
-                           });
-
-    newMessagesAvailableConnection_
-        = QObject::connect(currentConversationModel,
-                           &ConversationModel::newMessagesAvailable,
-                           [this](const QString& accountId, const QString& conversationId) {
-                               auto* convModel = lrcInstance_->accountModel()
-                                                     .getAccountInfo(accountId)
-                                                     .conversationModel.get();
-                               auto optConv = convModel->getConversationForUid(conversationId);
-                               if (!optConv)
-                                   return;
-                               updateHistory(*convModel,
-                                             optConv->get().interactions,
-                                             optConv->get().allMessagesLoaded);
-                               Utils::oneShotConnect(qmlObj_,
-                                                     SIGNAL(messagesLoaded()),
-                                                     this,
-                                                     SLOT(slotMessagesLoaded()));
-                           });
-
-    conversationUpdatedConnection_
-        = QObject::connect(currentConversationModel,
-                           &ConversationModel::conversationReady,
-                           [this](const QString& conversationId) {
-                               if (conversationId != lrcInstance_->get_selectedConvUid())
-                                   return;
-                               auto* convModel = lrcInstance_->getCurrentConversationModel();
-                               if (auto optConv = convModel->getConversationForUid(conversationId))
-                                   setConversationProfileData(optConv->get());
-                           });
-    composingConnection_
-        = connect(currentConversationModel,
-            &ConversationModel::composingStatusChanged,
-            [this](const QString& convUid, const QString& contactUri, bool isComposing) {
-                if (convUid != lrcInstance_->get_selectedConvUid())
-                    return;
-                if (!settingsManager_->getValue(Settings::Key::EnableTypingIndicator).toBool()) {
-                    return;
-                }
-                contactIsComposing(contactUri, isComposing);
-            });
+void
+MessagesAdapter::updateConversation(const QString& conversationId)
+{
+    if (conversationId != lrcInstance_->get_selectedConvUid())
+        return;
+    auto* convModel = lrcInstance_->getCurrentConversationModel();
+    if (auto optConv = convModel->getConversationForUid(conversationId))
+        setConversationProfileData(optConv->get());
+}
+
+void
+MessagesAdapter::onComposingStatusChanged(const QString& convId,
+                                          const QString& contactUri,
+                                          bool isComposing)
+{
+    if (convId != lrcInstance_->get_selectedConvUid())
+        return;
+    if (!settingsManager_->getValue(Settings::Key::EnableTypingIndicator).toBool()) {
+        return;
+    }
+    contactIsComposing(contactUri, isComposing);
+}
+
+void
+MessagesAdapter::connectConversationModel()
+{
+    auto currentConversationModel = lrcInstance_->getCurrentConversationModel();
+
+    QObject::connect(currentConversationModel,
+                     &ConversationModel::newInteraction,
+                     this,
+                     &MessagesAdapter::onNewInteraction,
+                     Qt::UniqueConnection);
+
+    QObject::connect(currentConversationModel,
+                     &ConversationModel::interactionStatusUpdated,
+                     this,
+                     &MessagesAdapter::onInteractionStatusUpdated,
+                     Qt::UniqueConnection);
+
+    QObject::connect(currentConversationModel,
+                     &ConversationModel::interactionRemoved,
+                     this,
+                     &MessagesAdapter::onInteractionRemoved,
+                     Qt::UniqueConnection);
+
+    QObject::connect(currentConversationModel,
+                     &ConversationModel::newMessagesAvailable,
+                     this,
+                     &MessagesAdapter::onNewMessagesAvailable,
+                     Qt::UniqueConnection);
+
+    QObject::connect(currentConversationModel,
+                     &ConversationModel::conversationReady,
+                     this,
+                     &MessagesAdapter::updateConversation,
+                     Qt::UniqueConnection);
+
+    QObject::connect(currentConversationModel,
+                     &ConversationModel::needsSyncingSet,
+                     this,
+                     &MessagesAdapter::updateConversation,
+                     Qt::UniqueConnection);
+
+    QObject::connect(currentConversationModel,
+                     &ConversationModel::composingStatusChanged,
+                     this,
+                     &MessagesAdapter::onComposingStatusChanged,
+                     Qt::UniqueConnection);
 }
 
 void
@@ -581,8 +607,9 @@ MessagesAdapter::clearChatView()
 void
 MessagesAdapter::setDisplayLinks()
 {
-    QString s = QString::fromLatin1("setDisplayLinks(%1);")
-                    .arg(settingsManager_->getValue(Settings::Key::DisplayHyperlinkPreviews).toBool());
+    QString s
+        = QString::fromLatin1("setDisplayLinks(%1);")
+              .arg(settingsManager_->getValue(Settings::Key::DisplayHyperlinkPreviews).toBool());
     QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
 }
 
diff --git a/src/messagesadapter.h b/src/messagesadapter.h
index ffb0c4e2191b0cde7298c16aa7b482361831bcdf..62ea73a6e8a2ba611f042d9732581236eceef12e 100644
--- a/src/messagesadapter.h
+++ b/src/messagesadapter.h
@@ -50,7 +50,7 @@ protected:
     Q_INVOKABLE void clearConversationHistory(const QString& accountId, const QString& convUid);
 
     // JS Q_INVOKABLE.
-    Q_INVOKABLE void acceptInvitation(const QString& convUid = "");
+    Q_INVOKABLE void acceptInvitation(const QString& convId = {});
     Q_INVOKABLE void refuseInvitation(const QString& convUid = "");
     Q_INVOKABLE void blockConversation(const QString& convUid = "");
     Q_INVOKABLE void setNewMessagesContent(const QString& path);
@@ -102,11 +102,21 @@ Q_SIGNALS:
     void contactBanned();
     void newInteraction(int type);
 
-public Q_SLOTS:
+private Q_SLOTS:
     void slotSendMessageContentSaved(const QString& content);
     void slotUpdateDraft(const QString& content);
     void slotMessagesCleared();
     void slotMessagesLoaded();
+    void onNewInteraction(const QString& convUid,
+                          const QString& interactionId,
+                          const interaction::Info& interaction);
+    void onInteractionStatusUpdated(const QString& convUid,
+                                    const QString& interactionId,
+                                    const interaction::Info& interaction);
+    void onInteractionRemoved(const QString& convUid, const QString& interactionId);
+    void onNewMessagesAvailable(const QString& accountId, const QString& conversationId);
+    void updateConversation(const QString& conversationId);
+    void onComposingStatusChanged(const QString& uid, const QString& contactUri, bool isComposing);
 
 private:
     void setConversationProfileData(const lrc::api::conversation::Info& convInfo);
@@ -120,13 +130,5 @@ private:
 
     const QVariantMap chatviewTranslatedStrings_ {lrc::api::chatview::getTranslatedStrings()};
 
-    // Interaction connections.
-    QMetaObject::Connection newInteractionConnection_;
-    QMetaObject::Connection interactionStatusUpdatedConnection_;
-    QMetaObject::Connection interactionRemovedConnection_;
-    QMetaObject::Connection newMessagesAvailableConnection_;
-    QMetaObject::Connection conversationUpdatedConnection_;
-    QMetaObject::Connection composingConnection_;
-
     AppSettingsManager* settingsManager_;
 };