diff --git a/src/accountadapter.cpp b/src/accountadapter.cpp
index fff2dc6cadebc918fdc1cdc9729159c0da4ceb09..adb138900b0977c4e2c5a379369c3583da5e57a5 100644
--- a/src/accountadapter.cpp
+++ b/src/accountadapter.cpp
@@ -386,7 +386,9 @@ AccountAdapter::connectAccount(const QString &accountId)
                                [this, accountId](const QString &contactUri) {
                                    auto &accInfo = LRCInstance::accountModel().getAccountInfo(
                                        accountId);
-                                   auto conversation = LRCInstance::getCurrentConversation();
+                                   auto* convModel = LRCInstance::getCurrentConversationModel();
+                                   const auto conversation = convModel->getConversationForUID(
+                                       LRCInstance::getCurrentConvUid());
                                    if (conversation.uid.isEmpty()) {
                                        return;
                                    }
diff --git a/src/avadapter.cpp b/src/avadapter.cpp
index 406e2085654940867730f418e55f84d0ff95edf1..b7a25644946f7bc6b69fb1527c73182c1e7a34e4 100644
--- a/src/avadapter.cpp
+++ b/src/avadapter.cpp
@@ -37,7 +37,8 @@ AvAdapter::initQmlObject()
 QVariantMap
 AvAdapter::populateVideoDeviceContextMenuItem()
 {
-    auto conversation = LRCInstance::getCurrentConversation();
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
     auto call = LRCInstance::getCallInfoForConversation(conversation);
     if (!call) {
         return QVariantMap();
@@ -129,4 +130,4 @@ AvAdapter::shareScreenArea(int screenNumber, int x, int y, int width, int height
                                       rect.y() + y,
                                       width < 128 ? 128 : width,
                                       height < 128 ? 128 : height);
-}
\ No newline at end of file
+}
diff --git a/src/calladapter.cpp b/src/calladapter.cpp
index a7980fdff8ab1afc7d3089e134bbe933ac87ab32..efc74102d9d4fa29c575d19f81edfda98df0e4da 100644
--- a/src/calladapter.cpp
+++ b/src/calladapter.cpp
@@ -62,25 +62,26 @@ CallAdapter::slotAccountChanged()
 void
 CallAdapter::placeAudioOnlyCall()
 {
-    auto convInfo = LRCInstance::getCurrentConversation();
-    if (!convInfo.uid.isEmpty()) {
-        LRCInstance::getCurrentConversationModel()->placeAudioOnlyCall(convInfo.uid);
+    const auto convUid = LRCInstance::getCurrentConvUid();
+    if (!convUid.isEmpty()) {
+        LRCInstance::getCurrentConversationModel()->placeAudioOnlyCall(convUid);
     }
 }
 
 void
 CallAdapter::placeCall()
 {
-    auto convInfo = LRCInstance::getCurrentConversation();
-    if (!convInfo.uid.isEmpty()) {
-        LRCInstance::getCurrentConversationModel()->placeCall(convInfo.uid);
+    const auto convUid = LRCInstance::getCurrentConvUid();
+    if (!convUid.isEmpty()) {
+        LRCInstance::getCurrentConversationModel()->placeCall(convUid);
     }
 }
 
 void
 CallAdapter::hangUpACall(const QString &accountId, const QString &convUid)
 {
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid);
     if (!convInfo.uid.isEmpty()) {
         LRCInstance::getAccountInfo(accountId).callModel->hangUp(convInfo.callId);
     }
@@ -89,7 +90,8 @@ CallAdapter::hangUpACall(const QString &accountId, const QString &convUid)
 void
 CallAdapter::refuseACall(const QString &accountId, const QString &convUid)
 {
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid);
     if (!convInfo.uid.isEmpty()) {
         LRCInstance::getAccountInfo(accountId).callModel->refuse(convInfo.callId);
     }
@@ -99,7 +101,8 @@ void
 CallAdapter::acceptACall(const QString &accountId, const QString &convUid)
 {
     emit incomingCallNeedToSetupMainView(accountId, convUid);
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid);
     if (!convInfo.uid.isEmpty()) {
         LRCInstance::getAccountInfo(accountId).callModel->accept(convInfo.callId);
         auto &accInfo = LRCInstance::getAccountInfo(convInfo.accountId);
@@ -110,7 +113,7 @@ CallAdapter::acceptACall(const QString &accountId, const QString &convUid)
 void
 CallAdapter::slotShowIncomingCallView(const QString &accountId, const conversation::Info &convInfo)
 {
-    auto callModel = LRCInstance::getCurrentCallModel();
+    auto* callModel = LRCInstance::getCurrentCallModel();
 
     if (!callModel->hasCall(convInfo.callId)) {
         /*
@@ -190,7 +193,8 @@ CallAdapter::updateCall(const QString &convUid, const QString &accountId, bool f
     accountId_ = accountId.isEmpty() ? accountId_ : accountId;
     convUid_ = convUid.isEmpty() ? convUid_ : convUid;
 
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
+    auto *convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid_);
     if (convInfo.uid.isEmpty()) {
         return;
     }
@@ -220,7 +224,8 @@ bool
 CallAdapter::shouldShowPreview(bool force)
 {
     bool shouldShowPreview{false};
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid_);
     if (convInfo.uid.isEmpty()) {
         return shouldShowPreview;
     }
@@ -236,7 +241,8 @@ QVariantList
 CallAdapter::getConferencesInfos()
 {
     QVariantList map;
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid_);
     if (convInfo.uid.isEmpty())
         return map;
     auto callId = convInfo.confId.isEmpty()? convInfo.callId : convInfo.confId;
@@ -287,7 +293,7 @@ CallAdapter::connectCallModel(const QString &accountId)
             auto &accInfo = LRCInstance::accountModel().getAccountInfo(accountId);
             auto &callModel = accInfo.callModel;
             auto call = callModel->getCall(confId);
-            auto convInfo = LRCInstance::getConversationFromCallId(confId);
+            const auto convInfo = LRCInstance::getConversationFromCallId(confId);
             if (!convInfo.uid.isEmpty()) {
                 // Convert to QML
                 QVariantList map;
@@ -324,12 +330,12 @@ CallAdapter::connectCallModel(const QString &accountId)
         [this, accountId](const QString &callId) {
             auto &accInfo = LRCInstance::accountModel().getAccountInfo(accountId);
             auto &callModel = accInfo.callModel;
-            auto call = callModel->getCall(callId);
+            const auto call = callModel->getCall(callId);
 
             /*
              * Change status label text.
              */
-            auto convInfo = LRCInstance::getConversationFromCallId(callId);
+            const auto convInfo = LRCInstance::getConversationFromCallId(callId);
             if (!convInfo.uid.isEmpty()) {
                 emit callStatusChanged(lrc::api::call::to_string(call.status),
                                        accountId,
@@ -383,7 +389,7 @@ CallAdapter::connectCallModel(const QString &accountId)
             }
             case lrc::api::call::Status::CONNECTED:
             case lrc::api::call::Status::IN_PROGRESS: {
-                auto convInfo = LRCInstance::getConversationFromCallId(callId, accountId);
+                const auto convInfo = LRCInstance::getConversationFromCallId(callId, accountId);
                 if (!convInfo.uid.isEmpty() && convInfo.uid == LRCInstance::getCurrentConvUid()) {
                     accInfo.conversationModel->selectConversation(convInfo.uid);
                 }
@@ -439,7 +445,7 @@ CallAdapter::updateCallOverlay(const lrc::api::conversation::Info &convInfo)
 void
 CallAdapter::hangupCall(const QString& uri)
 {
-    auto convInfo = LRCInstance::getConversationFromPeerUri(uri, accountId_);
+    const auto convInfo = LRCInstance::getConversationFromPeerUri(uri, accountId_);
     if (!convInfo.uid.isEmpty()) {
         auto callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
         if (callModel->hasCall(convInfo.callId)) {
@@ -466,17 +472,20 @@ CallAdapter::hangupCall(const QString& uri)
 void
 CallAdapter::maximizeParticipant(const QString& uri, bool isActive)
 {
-    auto callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
-    auto confId = LRCInstance::getCurrentConversation().confId;
+    auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
+    const auto confId = conversation.confId;
+
     QString callId;
     if (LRCInstance::getCurrentAccountInfo().profileInfo.uri != uri) {
-        auto convInfo = LRCInstance::getConversationFromPeerUri(uri, accountId_);
+        const auto convInfo = LRCInstance::getConversationFromPeerUri(uri, accountId_);
         if (!convInfo.uid.isEmpty()) {
             callId = convInfo.callId;
         }
     }
     try {
-        auto call = callModel->getCall(confId);
+        const auto call = callModel->getCall(confId);
         switch (call.layout) {
             case lrc::api::call::Layout::GRID:
                 callModel->setActiveParticipant(confId, callId);
@@ -498,8 +507,10 @@ CallAdapter::maximizeParticipant(const QString& uri, bool isActive)
 void
 CallAdapter::minimizeParticipant()
 {
-    auto callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
-    auto confId = LRCInstance::getCurrentConversation().confId;
+    auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
+    const auto confId = conversation.confId;
     try {
         auto call = callModel->getCall(confId);
         switch (call.layout) {
@@ -518,9 +529,10 @@ CallAdapter::minimizeParticipant()
 void
 CallAdapter::hangUpThisCall()
 {
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid_);
     if (!convInfo.uid.isEmpty()) {
-        auto callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
+        auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
         if (!convInfo.confId.isEmpty() && callModel->hasCall(convInfo.confId)) {
             callModel->hangUp(convInfo.confId);
         } else if (callModel->hasCall(convInfo.callId)) {
@@ -533,7 +545,8 @@ bool
 CallAdapter::isRecordingThisCall()
 {
     auto &accInfo = LRCInstance::accountModel().getAccountInfo(accountId_);
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
+    auto &convModel = accInfo.conversationModel;
+    const auto convInfo = convModel->getConversationForUID(convUid_);
     return accInfo.callModel->isRecording(convInfo.confId)
     || accInfo.callModel->isRecording(convInfo.callId);
 }
@@ -541,9 +554,10 @@ CallAdapter::isRecordingThisCall()
 bool
 CallAdapter::isCurrentMaster() const
 {
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid_);
     if (!convInfo.uid.isEmpty()) {
-        auto callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
+        auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
         try {
             if (!convInfo.confId.isEmpty() && callModel->hasCall(convInfo.confId)) {
                 return true;
@@ -559,9 +573,10 @@ CallAdapter::isCurrentMaster() const
 int
 CallAdapter::getCurrentLayoutType() const
 {
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid_);
     if (!convInfo.uid.isEmpty()) {
-        auto callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
+        auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
         try {
             auto call = callModel->getCall(convInfo.confId);
             return Utils::toUnderlyingValue(call.layout);
@@ -573,11 +588,11 @@ CallAdapter::getCurrentLayoutType() const
 void
 CallAdapter::holdThisCallToggle()
 {
-    auto callId = LRCInstance::getCallIdForConversationUid(convUid_, accountId_);
+    const auto callId = LRCInstance::getCallIdForConversationUid(convUid_, accountId_);
     if (callId.isEmpty() || !LRCInstance::getCurrentCallModel()->hasCall(callId)) {
         return;
     }
-    auto callModel = LRCInstance::getCurrentCallModel();
+    auto* callModel = LRCInstance::getCurrentCallModel();
     if (callModel->hasCall(callId)) {
         callModel->togglePause(callId);
     }
@@ -587,11 +602,11 @@ CallAdapter::holdThisCallToggle()
 void
 CallAdapter::muteThisCallToggle()
 {
-    auto callId = LRCInstance::getCallIdForConversationUid(convUid_, accountId_);
+    const auto callId = LRCInstance::getCallIdForConversationUid(convUid_, accountId_);
     if (callId.isEmpty() || !LRCInstance::getCurrentCallModel()->hasCall(callId)) {
         return;
     }
-    auto callModel = LRCInstance::getCurrentCallModel();
+    auto* callModel = LRCInstance::getCurrentCallModel();
     if (callModel->hasCall(callId)) {
         callModel->toggleMedia(callId, lrc::api::NewCallModel::Media::AUDIO);
     }
@@ -600,11 +615,11 @@ CallAdapter::muteThisCallToggle()
 void
 CallAdapter::recordThisCallToggle()
 {
-    auto callId = LRCInstance::getCallIdForConversationUid(convUid_, accountId_);
+    const auto callId = LRCInstance::getCallIdForConversationUid(convUid_, accountId_);
     if (callId.isEmpty() || !LRCInstance::getCurrentCallModel()->hasCall(callId)) {
         return;
     }
-    auto callModel = LRCInstance::getCurrentCallModel();
+    auto* callModel = LRCInstance::getCurrentCallModel();
     if (callModel->hasCall(callId)) {
         callModel->toggleAudioRecord(callId);
     }
@@ -613,11 +628,11 @@ CallAdapter::recordThisCallToggle()
 void
 CallAdapter::videoPauseThisCallToggle()
 {
-    auto callId = LRCInstance::getCallIdForConversationUid(convUid_, accountId_);
+    const auto callId = LRCInstance::getCallIdForConversationUid(convUid_, accountId_);
     if (callId.isEmpty() || !LRCInstance::getCurrentCallModel()->hasCall(callId)) {
         return;
     }
-    auto callModel = LRCInstance::getCurrentCallModel();
+    auto* callModel = LRCInstance::getCurrentCallModel();
     if (callModel->hasCall(callId)) {
         callModel->toggleMedia(callId, lrc::api::NewCallModel::Media::VIDEO);
     }
@@ -627,14 +642,14 @@ CallAdapter::videoPauseThisCallToggle()
 void
 CallAdapter::setTime(const QString &accountId, const QString &convUid)
 {
-    auto callId = LRCInstance::getCallIdForConversationUid(convUid, accountId);
+    const auto callId = LRCInstance::getCallIdForConversationUid(convUid, accountId);
     if (callId.isEmpty() || !LRCInstance::getCurrentCallModel()->hasCall(callId)) {
         return;
     }
-    auto callInfo = LRCInstance::getCurrentCallModel()->getCall(callId);
+    const auto callInfo = LRCInstance::getCurrentCallModel()->getCall(callId);
     if (callInfo.status == lrc::api::call::Status::IN_PROGRESS
         || callInfo.status == lrc::api::call::Status::PAUSED) {
         auto timeString = LRCInstance::getCurrentCallModel()->getFormattedCallDuration(callId);
         emit updateTimeText(timeString);
     }
-}
\ No newline at end of file
+}
diff --git a/src/contactadapter.cpp b/src/contactadapter.cpp
index fb837aa4b6afddae493c8e2ffca5702eb87287cc..e08a6dee842eabb69b8ba3ee489760f4683f088e 100644
--- a/src/contactadapter.cpp
+++ b/src/contactadapter.cpp
@@ -91,8 +91,9 @@ void
 ContactAdapter::contactSelected(int index)
 {
     auto contactIndex = selectableProxyModel_->index(index, 0);
-    auto callModel = LRCInstance::getCurrentCallModel();
-    auto conversation = LRCInstance::getCurrentConversation();
+    auto* callModel = LRCInstance::getCurrentCallModel();
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
 
     if (contactIndex.isValid()) {
         switch (listModeltype_) {
@@ -100,15 +101,15 @@ ContactAdapter::contactSelected(int index)
             /*
              * Conference.
              */
-            auto sectionName = contactIndex.data(SmartListModel::Role::SectionName).value<QString>();
+            const auto sectionName = contactIndex.data(SmartListModel::Role::SectionName).value<QString>();
             if (!sectionName.isEmpty()) {
                 smartListModel_->toggleSection(sectionName);
                 return;
             }
 
-            auto convUid = contactIndex.data(SmartListModel::Role::UID).value<QString>();
-            auto accId = contactIndex.data(SmartListModel::Role::AccountId).value<QString>();
-            auto callId = LRCInstance::getCallIdForConversationUid(convUid, accId);
+            const auto convUid = contactIndex.data(SmartListModel::Role::UID).value<QString>();
+            const auto accId = contactIndex.data(SmartListModel::Role::AccountId).value<QString>();
+            const auto callId = LRCInstance::getCallIdForConversationUid(convUid, accId);
 
             if (!callId.isEmpty()) {
                 if (conversation.uid.isEmpty()) {
@@ -119,7 +120,7 @@ ContactAdapter::contactSelected(int index)
 
                 callModel->joinCalls(thisCallId, callId);
             } else {
-                auto contactUri = contactIndex.data(SmartListModel::Role::URI).value<QString>();
+                const auto contactUri = contactIndex.data(SmartListModel::Role::URI).value<QString>();
                 auto call = LRCInstance::getCallInfoForConversation(conversation);
                 if (!call) {
                     return;
@@ -131,12 +132,12 @@ ContactAdapter::contactSelected(int index)
             /*
              * SIP Transfer.
              */
-            auto contactUri = contactIndex.data(SmartListModel::Role::URI).value<QString>();
+            const auto contactUri = contactIndex.data(SmartListModel::Role::URI).value<QString>();
 
             if (conversation.uid.isEmpty()) {
                 return;
             }
-            auto callId = conversation.confId.isEmpty() ? conversation.callId : conversation.confId;
+            const auto callId = conversation.confId.isEmpty() ? conversation.callId : conversation.confId;
 
             QString destCallId;
 
@@ -144,7 +145,7 @@ ContactAdapter::contactSelected(int index)
                 /*
                  * Check if the call exist - (check non-finished calls).
                  */
-                auto callInfo = callModel->getCallFromURI(contactUri, true);
+                const auto callInfo = callModel->getCallFromURI(contactUri, true);
                 destCallId = callInfo.id;
             } catch (std::exception &e) {
                 qDebug().noquote() << e.what();
diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp
index e27fc59e41c515308337f10a0de0f8228cf387f9..04abc04766b12cfdd9f9fb3db1e41aa12c400bfd 100644
--- a/src/conversationsadapter.cpp
+++ b/src/conversationsadapter.cpp
@@ -36,8 +36,7 @@ ConversationsAdapter::initQmlObject()
 {
     conversationSmartListModel_ = new SmartListModel(LRCInstance::getCurrAccId(), this);
 
-    QMetaObject::invokeMethod(qmlObj_,
-                              "setModel",
+    QMetaObject::invokeMethod(qmlObj_, "setModel",
                               Q_ARG(QVariant, QVariant::fromValue(conversationSmartListModel_)));
 
     connect(&LRCInstance::behaviorController(),
@@ -71,30 +70,25 @@ ConversationsAdapter::selectConversation(const QString &accountId,
                                          const QString &convUid,
                                          bool preventSendingSignal)
 {
-    selectConversation(LRCInstance::getConversationFromConvUid(convUid, accountId),
-                       preventSendingSignal);
+    auto &accInfo = LRCInstance::getAccountInfo(accountId);
+    const auto convInfo = accInfo.conversationModel->getConversationForUID(convUid);
+
+    selectConversation(convInfo, preventSendingSignal);
 }
 
 void
-ConversationsAdapter::selectConversation(int index)
+ConversationsAdapter::selectConversation(const QString &convUid)
 {
-    auto convModel = LRCInstance::getCurrentConversationModel();
-
+    auto* convModel = LRCInstance::getCurrentConversationModel();
     if (convModel == nullptr) {
         return;
     }
 
-    const auto item = convModel->filteredConversation(index);
-
-    if (selectConversation(item, false)) {
-        auto convUid = conversationSmartListModel_
-                           ->data(conversationSmartListModel_->index(index, 0),
-                                  static_cast<int>(SmartListModel::Role::UID))
-                           .toString();
-        auto &conversation = LRCInstance::getConversationFromConvUid(convUid);
-        /*
-         * If it is calling, show callview (can use showChatView signal, since it will be determined on qml).
-         */
+    const auto &conversation = convModel->getConversationForUID(convUid);
+
+    if (selectConversation(conversation, false)) {
+
+        // If it is calling, show callview (can use showChatView signal, since it will be determined on qml).
         if (!conversation.uid.isEmpty()
             && LRCInstance::getCurrentCallModel()->hasCall(conversation.callId)) {
             emit showChatView(LRCInstance::getCurrAccId(), conversation.uid);
@@ -106,11 +100,9 @@ bool
 ConversationsAdapter::selectConversation(const lrc::api::conversation::Info &item,
                                          bool preventSendingSignal)
 {
-    /*
-     * accInfo.conversationModel->selectConversation(item.uid) only emit ui
-     * behavior control signals, but sometimes we do not want that,
-     * preventSendingSignal boolean can help us to determine.
-     */
+    // accInfo.conversationModel->selectConversation(item.uid) only emit ui
+    // behavior control signals, but sometimes we do not want that,
+    // preventSendingSignal boolean can help us to determine.
     if (LRCInstance::getCurrentConvUid() == item.uid) {
         return false;
     } else if (item.participants.size() > 0) {
@@ -143,9 +135,7 @@ ConversationsAdapter::deselectConversation()
 void
 ConversationsAdapter::accountChangedSetUp(const QString &accountId)
 {
-    /*
-     * Should be called when current account is changed.
-     */
+    // Should be called when current account is changed.
     auto &accountInfo = LRCInstance::accountModel().getAccountInfo(accountId);
     currentTypeFilter_ = accountInfo.profileInfo.type;
     LRCInstance::getCurrentConversationModel()->setFilter(accountInfo.profileInfo.type);
@@ -157,9 +147,7 @@ ConversationsAdapter::accountChangedSetUp(const QString &accountId)
 void
 ConversationsAdapter::updateConversationsFilterWidget()
 {
-    /*
-     * Update status of "Conversations" and "Invitations".
-     */
+    // Update status of "Conversations" and "Invitations".
     auto invites = LRCInstance::getCurrentAccountInfo().contactModel->pendingRequestCount();
     if (invites == 0 && currentTypeFilter_ == lrc::api::profile::Type::PENDING) {
         currentTypeFilter_ = lrc::api::profile::Type::RING;
@@ -171,10 +159,8 @@ ConversationsAdapter::updateConversationsFilterWidget()
 void
 ConversationsAdapter::setConversationFilter(const QString &type)
 {
-    /*
-     * Set conversation filter according to type,
-     * type needs to be recognizable by lrc::api::profile::to_type.
-     */
+    // Set conversation filter according to type,
+    // type needs to be recognizable by lrc::api::profile::to_type.
     if (type.isEmpty()) {
         if (LRCInstance::getCurrentAccountInfo().profileInfo.type == lrc::api::profile::Type::RING)
             setConversationFilter(lrc::api::profile::Type::RING);
@@ -198,10 +184,8 @@ ConversationsAdapter::setConversationFilter(lrc::api::profile::Type filter)
 bool
 ConversationsAdapter::connectConversationModel()
 {
-    /*
-     * Signal connections
-     */
-    auto currentConversationModel = LRCInstance::getCurrentAccountInfo().conversationModel.get();
+    // Signal connections
+    auto currentConversationModel = LRCInstance::getCurrentConversationModel();
 
     QObject::disconnect(modelSortedConnection_);
     QObject::disconnect(modelUpdatedConnection_);
@@ -211,81 +195,98 @@ ConversationsAdapter::connectConversationModel()
     QObject::disconnect(conversationClearedConnection);
     QObject::disconnect(newInteractionConnection_);
     QObject::disconnect(interactionRemovedConnection_);
-
-    modelSortedConnection_ = QObject::connect(
-        currentConversationModel, &lrc::api::ConversationModel::modelSorted, [this]() {
-            updateConversationsFilterWidget();
-            QMetaObject::invokeMethod(qmlObj_, "updateConversationSmartListView");
-            auto convUid = LRCInstance::getCurrentConversation().uid;
-            auto convModel = LRCInstance::getCurrentConversationModel();
-            auto &conversation = LRCInstance::getConversationFromConvUid(convUid);
-            if (conversation.uid.isEmpty()) {
-                return;
-            }
-            auto contactURI = conversation.participants[0];
-            if (contactURI.isEmpty()
-                || convModel->owner.contactModel->getContact(contactURI).profileInfo.type
-                       == lrc::api::profile::Type::TEMPORARY) {
-                return;
-            }
-            QMetaObject::invokeMethod(qmlObj_, "modelSorted", Q_ARG(QVariant, contactURI));
-        });
-
-    modelUpdatedConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::conversationUpdated,
-                           [this](const QString &convUid) {
-                               Q_UNUSED(convUid);
-                               updateConversationsFilterWidget();
-                               QMetaObject::invokeMethod(qmlObj_, "updateConversationSmartListView");
-                           });
-
-    filterChangedConnection_ = QObject::connect(
-        currentConversationModel, &lrc::api::ConversationModel::filterChanged, [this]() {
-            QMetaObject::invokeMethod(qmlObj_,
-                                      "updateSmartList",
-                                      Q_ARG(QVariant, LRCInstance::getCurrAccId()));
-            updateConversationsFilterWidget();
-            QMetaObject::invokeMethod(qmlObj_, "updateConversationSmartListView");
-        });
-
-    newConversationConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::newConversation,
-                           [this](const QString &convUid) {
-                               QMetaObject::invokeMethod(qmlObj_,
-                                                         "updateSmartList",
-                                                         Q_ARG(QVariant,
-                                                               LRCInstance::getCurrAccId()));
-                               updateConversationForNewContact(convUid);
-                           });
-
-    conversationRemovedConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::conversationRemoved,
-                           [this]() { backToWelcomePage(); });
-
-    conversationClearedConnection
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::conversationCleared,
-                           [this](const QString &convUid) {
-                               /*
-                                * If currently selected,
-                                * switch to welcome screen (deselecting current smartlist item ).
-                                */
-                               if (convUid != LRCInstance::getCurrentConvUid()) {
-                                   return;
-                               }
-                               backToWelcomePage();
-                           });
-
-    newInteractionConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::newInteraction,
-                           [this] {
-                               updateConversationsFilterWidget();
-                               QMetaObject::invokeMethod(qmlObj_, "updateConversationSmartListView");
-                           });
+    QObject::disconnect(searchStatusChangedConnection_);
+    QObject::disconnect(searchResultUpdatedConnection_);
+
+    modelSortedConnection_ = QObject::connect(currentConversationModel,
+                                              &lrc::api::ConversationModel::modelSorted,
+                                              [this]() {
+        conversationSmartListModel_->fillConversationsList();
+        updateConversationsFilterWidget();
+        QMetaObject::invokeMethod(qmlObj_, "updateConversationSmartListView");
+        auto* convModel = LRCInstance::getCurrentConversationModel();
+        const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
+
+        if (conversation.uid.isEmpty() || conversation.participants.isEmpty()) {
+            return;
+        }
+        const auto contactURI = conversation.participants[0];
+        if (contactURI.isEmpty()
+            || convModel->owner.contactModel->getContact(contactURI).profileInfo.type
+                   == lrc::api::profile::Type::TEMPORARY) {
+            return;
+        }
+        QMetaObject::invokeMethod(qmlObj_, "modelSorted", Q_ARG(QVariant, contactURI));
+    });
+
+    modelUpdatedConnection_ = QObject::connect(currentConversationModel,
+                                               &lrc::api::ConversationModel::conversationUpdated,
+                                               [this](const QString &convUid) {
+        conversationSmartListModel_->updateConversation(convUid);
+        updateConversationsFilterWidget();
+        QMetaObject::invokeMethod(qmlObj_, "updateConversationSmartListView");
+    });
+
+    filterChangedConnection_ = QObject::connect(currentConversationModel,
+                                                &lrc::api::ConversationModel::filterChanged,
+                                                [this]() {
+        conversationSmartListModel_->fillConversationsList();
+        QMetaObject::invokeMethod(qmlObj_,
+                                  "updateSmartList",
+                                  Q_ARG(QVariant, LRCInstance::getCurrAccId()));
+        updateConversationsFilterWidget();
+        QMetaObject::invokeMethod(qmlObj_, "updateConversationSmartListView");
+    });
+
+    newConversationConnection_ = QObject::connect(currentConversationModel,
+                                                  &lrc::api::ConversationModel::newConversation,
+                                                  [this](const QString &convUid) {
+        conversationSmartListModel_->fillConversationsList();
+        QMetaObject::invokeMethod(qmlObj_,
+                                  "updateSmartList",
+                                    Q_ARG(QVariant, LRCInstance::getCurrAccId()));
+        updateConversationForNewContact(convUid);
+    });
+
+    conversationRemovedConnection_ = QObject::connect(currentConversationModel,
+                                                      &lrc::api::ConversationModel::conversationRemoved,
+                                                      [this]() {
+        conversationSmartListModel_->fillConversationsList();
+        backToWelcomePage();
+    });
+
+    conversationClearedConnection = QObject::connect(currentConversationModel,
+                                                     &lrc::api::ConversationModel::conversationCleared,
+                                                     [this](const QString &convUid) {
+        // If currently selected, switch to welcome screen (deselecting current smartlist item ).
+        if (convUid != LRCInstance::getCurrentConvUid()) {
+            return;
+        }
+        backToWelcomePage();
+    });
+
+    newInteractionConnection_ = QObject::connect(currentConversationModel,
+                                                 &lrc::api::ConversationModel::newInteraction,
+                                                 [this] {
+        conversationSmartListModel_->fillConversationsList();
+        updateConversationsFilterWidget();
+        QMetaObject::invokeMethod(qmlObj_, "updateConversationSmartListView");
+    });
+
+    searchStatusChangedConnection_ = QObject::connect(currentConversationModel,
+                                                      &lrc::api::ConversationModel::searchStatusChanged,
+                                                      [this](const QString &status) {
+        emit showSearchStatus(status);
+    });
+
+    searchResultUpdatedConnection_ = QObject::connect(currentConversationModel,
+                                                      &lrc::api::ConversationModel::searchResultUpdated,
+                                                      [this]() {
+        conversationSmartListModel_->fillConversationsList();
+        QMetaObject::invokeMethod(qmlObj_, "updateSmartList",
+                                  Q_ARG(QVariant, LRCInstance::getCurrAccId()));
+        QMetaObject::invokeMethod(qmlObj_, "updateConversationSmartListView");
+    });
 
     currentConversationModel->setFilter("");
     return true;
@@ -294,15 +295,15 @@ ConversationsAdapter::connectConversationModel()
 void
 ConversationsAdapter::updateConversationForNewContact(const QString &convUid)
 {
-    auto convModel = LRCInstance::getCurrentConversationModel();
+    auto* convModel = LRCInstance::getCurrentConversationModel();
     if (convModel == nullptr) {
         return;
     }
-    auto selectedUid = LRCInstance::getCurrentConvUid();
-    auto &conversation = LRCInstance::getConversationFromConvUid(convUid, {}, true);
-    if (!conversation.uid.isEmpty()) {
+    const auto selectedUid = LRCInstance::getCurrentConvUid();
+    const auto conversation = convModel->getConversationForUID(convUid);
+    if (!conversation.uid.isEmpty() && !conversation.participants.isEmpty()) {
         try {
-            auto contact = convModel->owner.contactModel->getContact(conversation.participants[0]);
+            const auto contact = convModel->owner.contactModel->getContact(conversation.participants[0]);
             if (!contact.profileInfo.uri.isEmpty() && contact.profileInfo.uri == selectedUid) {
                 LRCInstance::setSelectedConvId(convUid);
                 convModel->selectConversation(convUid);
@@ -311,4 +312,4 @@ ConversationsAdapter::updateConversationForNewContact(const QString &convUid)
             return;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/conversationsadapter.h b/src/conversationsadapter.h
index 9fbcac45910544ce7eab02a76f4f377867216a3c..e4c2aa6a8d4f0ea1a8aa234ebbc0f1dd85524f09 100644
--- a/src/conversationsadapter.h
+++ b/src/conversationsadapter.h
@@ -37,7 +37,7 @@ public:
     Q_INVOKABLE void selectConversation(const QString &accountId,
                                         const QString &convUid,
                                         bool preventSendingSignal = true);
-    Q_INVOKABLE void selectConversation(int index);
+    Q_INVOKABLE void selectConversation(const QString &uid);
     Q_INVOKABLE void deselectConversation();
     Q_INVOKABLE void accountChangedSetUp(const QString &accountId);
     Q_INVOKABLE void updateConversationsFilterWidget();
@@ -46,6 +46,7 @@ public:
 signals:
     void showChatView(const QString &accountId, const QString &convUid);
     void showConversationTabs(bool visible);
+    void showSearchStatus(const QString &status);
 
 public slots:
     void slotAccountChanged();
@@ -75,4 +76,6 @@ private:
     QMetaObject::Connection selectedCallChanged_;
     QMetaObject::Connection smartlistSelectionConnection_;
     QMetaObject::Connection interactionRemovedConnection_;
+    QMetaObject::Connection searchStatusChangedConnection_;
+    QMetaObject::Connection searchResultUpdatedConnection_;
 };
diff --git a/src/lrcinstance.h b/src/lrcinstance.h
index a6594d9266d54c14f83f0f31e5f3bd4b183b280e..cc28bad837ac3a4df8e56c9f4a0c8ab6f1cbd3b6 100644
--- a/src/lrcinstance.h
+++ b/src/lrcinstance.h
@@ -156,7 +156,8 @@ public:
     static QString
     getCallIdForConversationUid(const QString &convUid, const QString &accountId)
     {
-        auto convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
+        auto &accInfo = LRCInstance::getAccountInfo(accountId);
+        auto convInfo = accInfo.conversationModel->getConversationForUID(convUid);
         if (convInfo.uid.isEmpty()) {
             return {};
         }
@@ -233,16 +234,6 @@ public:
             filtered);
     }
     static const conversation::Info &
-    getConversationFromConvUid(const QString &convUid,
-                               const QString &accountId = {},
-                               bool filtered = false)
-    {
-        return getConversation(
-            !accountId.isEmpty() ? accountId : getCurrAccId(),
-            [&](const conversation::Info &conv) -> bool { return convUid == conv.uid; },
-            filtered);
-    }
-    static const conversation::Info &
     getConversationFromPeerUri(const QString &peerUri,
                                const QString &accountId = {},
                                bool filtered = false)
@@ -252,11 +243,6 @@ public:
             [&](const conversation::Info &conv) -> bool { return peerUri == conv.participants[0]; },
             filtered);
     }
-    static const conversation::Info &
-    getCurrentConversation()
-    {
-        return getConversationFromConvUid(getCurrentConvUid());
-    }
 
     static ConversationModel *
     getCurrentConversationModel()
diff --git a/src/mainview/components/ConversationSmartListView.qml b/src/mainview/components/ConversationSmartListView.qml
index 0513f6fd4ee3f4d461685d2427be45609b8be42b..ee787f78047debb5654099f4d075506a149f2703 100644
--- a/src/mainview/components/ConversationSmartListView.qml
+++ b/src/mainview/components/ConversationSmartListView.qml
@@ -25,7 +25,7 @@ ListView {
     id: conversationSmartListView
 
     signal needToAccessMessageWebView(string currentUserDisplayName, string currentUserAlias, string currentUID, bool callStackViewShouldShow, bool isAudioOnly, string callStateStr)
-    signal needToSelectItems(int index)
+    signal needToSelectItems(string conversationUid)
     signal needToDeselectItems
     signal needToBackToWelcomePage
     signal needToGrabFocus
diff --git a/src/mainview/components/ConversationSmartListViewItemDelegate.qml b/src/mainview/components/ConversationSmartListViewItemDelegate.qml
index 8ce018eef4228f96a26329f5f520ddd633c979ce..7b564a855b4419f8b502dd77f35ceab9dcb9cf52 100644
--- a/src/mainview/components/ConversationSmartListViewItemDelegate.qml
+++ b/src/mainview/components/ConversationSmartListViewItemDelegate.qml
@@ -84,13 +84,15 @@ ItemDelegate {
         anchors.left: conversationSmartListUserImage.right
         anchors.leftMargin: 16
         anchors.top: parent.top
-        anchors.topMargin: 16
+        anchors.topMargin: conversationSmartListUserLastInteractionMessage.text !== "" ?
+                               16 : parent.height/2-conversationSmartListUserName.height/2
         anchors.right: parent.right
         anchors.rightMargin: 10
 
         Text {
             id: conversationSmartListUserName
-            Layout.alignment: Qt.AlignLeft
+            Layout.alignment: conversationSmartListUserLastInteractionMessage.text !== "" ?
+                                  Qt.AlignLeft : Qt.AlignLeft | Qt.AlignVCenter
 
             TextMetrics {
                 id: textMetricsConversationSmartListUserName
@@ -197,7 +199,7 @@ ItemDelegate {
                 smartListContextMenu.openMenu()
             } else if (mouse.button === Qt.LeftButton) {
                 conversationSmartListView.currentIndex = index
-                conversationSmartListView.needToSelectItems(index)
+                conversationSmartListView.needToSelectItems(UID)
                 conversationSmartListView.needToGrabFocus()
             }
         }
diff --git a/src/mainview/components/MessageWebViewHeader.qml b/src/mainview/components/MessageWebViewHeader.qml
index 4f2445fd555ee7d68b0db651e6519a05c3e331cf..8509f9a2a651f65e7c2e18b981797b6a65a14a13 100644
--- a/src/mainview/components/MessageWebViewHeader.qml
+++ b/src/mainview/components/MessageWebViewHeader.qml
@@ -98,7 +98,7 @@ Rectangle {
                     Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
                     Layout.preferredWidth: userNameOrIdRect.width
                     Layout.preferredHeight: textMetricsuserAliasLabel.boundingRect.height
-                    Layout.topMargin: userUserNameLabel.text == "" ? 0 : 10
+                    Layout.topMargin: userUserNameLabel.text === "" ? 0 : 10
 
                     font.pointSize: JamiTheme.menuFontSize
 
@@ -119,7 +119,7 @@ Rectangle {
 
                 Label {
                     id: userUserNameLabel
-                    visible: (text != "")
+                    visible: (text !== "")
                     Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
                     Layout.preferredWidth: userNameOrIdRect.width
                     Layout.preferredHeight: textMetricsuserUserNameLabel.boundingRect.height
diff --git a/src/mainview/components/RecordBox.qml b/src/mainview/components/RecordBox.qml
index 109132711f574e5d75ff3f65678b371a1e3f4773..a7e94e53044a76a645ede6315af28e6c246d4b79 100644
--- a/src/mainview/components/RecordBox.qml
+++ b/src/mainview/components/RecordBox.qml
@@ -136,13 +136,13 @@ Rectangle {
     }
 
     function stopRecording() {
-        if (pathRecorder !=  "") {
+        if (pathRecorder !== "") {
             ClientWrapper.avmodel.stopLocalRecorder(pathRecorder)
         }
     }
 
     function sendRecord() {
-        if (pathRecorder != "") {
+        if (pathRecorder !== "") {
             MessagesAdapter.sendFile(pathRecorder)
         }
     }
diff --git a/src/mainview/components/SidePanel.qml b/src/mainview/components/SidePanel.qml
index 0500a793119e45c6f0db57c1d4d62355c1373976..c37bcb3f7909e69a114e0735c3ef43979af0f31c 100644
--- a/src/mainview/components/SidePanel.qml
+++ b/src/mainview/components/SidePanel.qml
@@ -152,13 +152,69 @@ Rectangle {
         height: tabBarVisible ? 64 : 0
     }
 
+    Rectangle {
+        id: searchStatusRect
 
-    ConversationSmartListView {
-        id: conversationSmartListView
+        visible: lblSearchStatus.text !== ""
 
         anchors.top: tabBarVisible ? sidePanelTabBar.bottom : contactSearchBar.bottom
         anchors.topMargin: tabBarVisible ? 0 : 10
         width: parent.width
+        height: 72
+
+        color: "transparent"
+
+        Image {
+            id: searchIcon
+            anchors.left: searchStatusRect.left
+            anchors.leftMargin: 24
+            anchors.verticalCenter: searchStatusRect.verticalCenter
+            width: 24
+            height: 24
+
+            fillMode: Image.PreserveAspectFit
+            mipmap: true
+            source: "qrc:/images/icons/ic_baseline-search-24px.svg"
+        }
+
+        Label {
+            id: lblSearchStatus
+
+            anchors.verticalCenter: searchStatusRect.verticalCenter
+            anchors.left: searchIcon.right
+            anchors.leftMargin: 24
+            width: searchStatusRect.width - searchIcon.width - 24*2 - 8
+            text: ""
+            wrapMode: Text.WordWrap
+            font.pointSize: JamiTheme.menuFontSize
+        }
+
+        MouseArea {
+            id: mouseAreaSearchRect
+
+            anchors.fill: parent
+            hoverEnabled: true
+
+            onReleased: {
+                searchStatusRect.color = JamiTheme.releaseColor
+            }
+
+            onEntered: {
+                searchStatusRect.color = JamiTheme.hoverColor
+            }
+
+            onExited: {
+                searchStatusRect.color = JamiTheme.backgroundColor
+            }
+        }
+    }
+
+    ConversationSmartListView {
+        id: conversationSmartListView
+
+        anchors.top: searchStatusRect.visible ? searchStatusRect.bottom : (tabBarVisible ? sidePanelTabBar.bottom : contactSearchBar.bottom)
+        anchors.topMargin: (tabBarVisible || searchStatusRect.visible) ? 0 : 10
+        width: parent.width
         height: tabBarVisible ? sidePanelRect.height - sidePanelTabBar.height - contactSearchBar.height - 20 :
                                 sidePanelRect.height - contactSearchBar.height - 20
 
@@ -175,10 +231,14 @@ Rectangle {
                 updatePendingRequestCount()
                 updateTotalUnreadMessagesCount()
             }
+
+            function onShowSearchStatus(status) {
+                lblSearchStatus.text = status
+            }
         }
 
         onNeedToSelectItems: {
-            ConversationsAdapter.selectConversation(index)
+            ConversationsAdapter.selectConversation(conversationUid)
         }
 
         onNeedToBackToWelcomePage: {
diff --git a/src/messagesadapter.cpp b/src/messagesadapter.cpp
index 20311bd56c8558dfa0e1676450709ef80649a61d..056286e54fd721e41a496b26d1719fbbba2f28e9 100644
--- a/src/messagesadapter.cpp
+++ b/src/messagesadapter.cpp
@@ -57,8 +57,13 @@ MessagesAdapter::slotAccountChanged()
 void
 MessagesAdapter::setupChatView(const QString &uid)
 {
-    auto &convInfo = LRCInstance::getConversationFromConvUid(uid);
-    if (convInfo.uid.isEmpty()) {
+
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    if (convModel == nullptr) {
+        return;
+    }
+    const auto &convInfo = convModel->getConversationForUID(uid);
+    if (convInfo.uid.isEmpty() || convInfo.participants.isEmpty()) {
         return;
     }
 
@@ -111,36 +116,28 @@ MessagesAdapter::setupChatView(const QString &uid)
 void
 MessagesAdapter::connectConversationModel()
 {
-    auto currentConversationModel = LRCInstance::getCurrentAccountInfo().conversationModel.get();
+    auto currentConversationModel = LRCInstance::getCurrentConversationModel();
 
     QObject::disconnect(newInteractionConnection_);
     QObject::disconnect(interactionRemovedConnection_);
     QObject::disconnect(interactionStatusUpdatedConnection_);
 
-    newInteractionConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::newInteraction,
-                           [this](const QString &convUid,
-                                  uint64_t interactionId,
-                                  const lrc::api::interaction::Info &interaction) {
-                               auto accountId = LRCInstance::getCurrAccId();
-                               newInteraction(accountId, convUid, interactionId, interaction);
-                           });
-
-    interactionStatusUpdatedConnection_ = QObject::connect(
-        currentConversationModel,
-        &lrc::api::ConversationModel::interactionStatusUpdated,
-        [this](const QString &convUid,
-               uint64_t interactionId,
-               const lrc::api::interaction::Info &interaction) {
-            if (convUid != LRCInstance::getCurrentConvUid()) {
-                return;
-            }
-            auto &currentAccountInfo = LRCInstance::getCurrentAccountInfo();
-            auto currentConversationModel = currentAccountInfo.conversationModel.get();
-            currentConversationModel->clearUnreadInteractions(convUid);
-            updateInteraction(*currentConversationModel, interactionId, interaction);
-        });
+    newInteractionConnection_ = QObject::connect(currentConversationModel,
+                                                 &lrc::api::ConversationModel::newInteraction,
+                                                 [this](const QString &convUid, uint64_t interactionId,
+                                                        const lrc::api::interaction::Info &interaction) {
+        auto accountId = LRCInstance::getCurrAccId();
+        newInteraction(accountId, convUid, interactionId, interaction);
+    });
+
+    interactionStatusUpdatedConnection_ = QObject::connect(currentConversationModel,
+                                                           &lrc::api::ConversationModel::interactionStatusUpdated,
+                                                           [this](const QString &convUid, uint64_t interactionId,
+                                                                  const lrc::api::interaction::Info &interaction) {
+        auto currentConversationModel = LRCInstance::getCurrentConversationModel();
+        currentConversationModel->clearUnreadInteractions(convUid);
+        updateInteraction(*currentConversationModel, interactionId, interaction);
+    });
 
     interactionRemovedConnection_
         = QObject::connect(currentConversationModel,
@@ -156,16 +153,16 @@ MessagesAdapter::connectConversationModel()
 void
 MessagesAdapter::sendContactRequest()
 {
-    auto convInfo = LRCInstance::getCurrentConversation();
-    if (!convInfo.uid.isEmpty()) {
-        LRCInstance::getCurrentConversationModel()->makePermanent(convInfo.uid);
+    const auto convUid = LRCInstance::getCurrentConvUid();
+    if (!convUid.isEmpty()) {
+        LRCInstance::getCurrentConversationModel()->makePermanent(convUid);
     }
 }
 
 void
-MessagesAdapter::accountChangedSetUp(const QString &accoountId)
+MessagesAdapter::accountChangedSetUp(const QString &accountId)
 {
-    Q_UNUSED(accoountId)
+    Q_UNUSED(accountId)
 
     connectConversationModel();
 }
@@ -173,8 +170,8 @@ MessagesAdapter::accountChangedSetUp(const QString &accoountId)
 void
 MessagesAdapter::updateConversationForAddedContact()
 {
-    auto conversation = LRCInstance::getCurrentConversation();
-    auto convModel = LRCInstance::getCurrentConversationModel();
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
 
     clear();
     setConversationProfileData(conversation);
@@ -211,8 +208,8 @@ MessagesAdapter::slotUpdateDraft(const QString &content)
 void
 MessagesAdapter::slotMessagesCleared()
 {
-    auto &convInfo = LRCInstance::getConversationFromConvUid(LRCInstance::getCurrentConvUid());
-    auto convModel = LRCInstance::getCurrentConversationModel();
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
 
     printHistory(*convModel, convInfo.interactions);
 
@@ -231,7 +228,7 @@ void
 MessagesAdapter::sendMessage(const QString &message)
 {
     try {
-        auto convUid = LRCInstance::getCurrentConvUid();
+        const auto convUid = LRCInstance::getCurrentConvUid();
         LRCInstance::getCurrentConversationModel()->sendMessage(convUid, message);
     } catch (...) {
         qDebug() << "Exception during sendMessage:" << message;
@@ -373,7 +370,7 @@ MessagesAdapter::refuseFile(const QString &arg)
 {
     try {
         auto interactionUid = arg.toLongLong();
-        auto convUid = LRCInstance::getCurrentConvUid();
+        const auto convUid = LRCInstance::getCurrentConvUid();
         LRCInstance::getCurrentConversationModel()->cancelTransfer(convUid, interactionUid);
     } catch (...) {
         qDebug() << "JS bridging - exception during refuseFile:" << arg;
@@ -436,10 +433,15 @@ MessagesAdapter::onComposing(bool isComposing)
 void
 MessagesAdapter::setConversationProfileData(const lrc::api::conversation::Info &convInfo)
 {
-    auto convModel = LRCInstance::getCurrentConversationModel();
+    auto* convModel = LRCInstance::getCurrentConversationModel();
     auto accInfo = &LRCInstance::getCurrentAccountInfo();
-    auto contactUri = convInfo.participants.front();
+    const auto conv = convModel->getConversationForUID(convInfo.uid);
+
+    if (conv.participants.isEmpty()) {
+        return;
+    }
 
+    auto contactUri = conv.participants.front();
     if (contactUri.isEmpty()) {
         return;
     }
@@ -473,7 +475,7 @@ MessagesAdapter::newInteraction(const QString &accountId,
     try {
         auto &accountInfo = LRCInstance::getAccountInfo(accountId);
         auto &convModel = accountInfo.conversationModel;
-        auto &conversation = LRCInstance::getConversationFromConvUid(convUid, accountId);
+        const auto conversation = convModel->getConversationForUID(convUid);
 
         if (conversation.uid.isEmpty()) {
             return;
@@ -646,7 +648,7 @@ MessagesAdapter::contactIsComposing(const QString &uid, const QString &contactUr
 void
 MessagesAdapter::acceptInvitation()
 {
-    auto convUid = LRCInstance::getCurrentConvUid();
+    const auto convUid = LRCInstance::getCurrentConvUid();
     LRCInstance::getCurrentConversationModel()->makePermanent(convUid);
 }
 
diff --git a/src/messagesadapter.h b/src/messagesadapter.h
index 5323a13611c5221809031ac97e486c39b2ab2c08..ed5601ab5e206b276384b6ec660c82a3f0cc1912 100644
--- a/src/messagesadapter.h
+++ b/src/messagesadapter.h
@@ -35,7 +35,7 @@ public:
     Q_INVOKABLE void setupChatView(const QString &uid);
     Q_INVOKABLE void connectConversationModel();
     Q_INVOKABLE void sendContactRequest();
-    Q_INVOKABLE void accountChangedSetUp(const QString &accoountId);
+    Q_INVOKABLE void accountChangedSetUp(const QString &accountId);
     Q_INVOKABLE void updateConversationForAddedContact();
 
     /*
@@ -109,4 +109,4 @@ private:
     QMetaObject::Connection newInteractionConnection_;
     QMetaObject::Connection interactionStatusUpdatedConnection_;
     QMetaObject::Connection interactionRemovedConnection_;
-};
\ No newline at end of file
+};
diff --git a/src/qrimageprovider.h b/src/qrimageprovider.h
index cc8837eb063f9d8ee8dfee6d6ffe3880e321cd21..e8822c668e8e2579df4aa3fb16e6e2e071aac4da 100644
--- a/src/qrimageprovider.h
+++ b/src/qrimageprovider.h
@@ -53,7 +53,9 @@ public:
             /*
              * For contact_xxx, xxx is "" initially
              */
-            auto convInfo = LRCInstance::getConversationFromConvUid(list[1]);
+
+            auto convModel = LRCInstance::getCurrentConversationModel();
+            auto convInfo = convModel->getConversationForUID(list[1]);
             auto contact = LRCInstance::getCurrentAccountInfo().contactModel->getContact(
                 convInfo.participants.at(0));
             return QPair(QrType::Contact, contact.profileInfo.uri);
@@ -90,4 +92,4 @@ public:
         else
             return Utils::setupQRCode(uri, 0);
     }
-};
\ No newline at end of file
+};
diff --git a/src/smartlistmodel.cpp b/src/smartlistmodel.cpp
index 8fd0d5cbe609b66e7ed2896edca54fadfec7ada9..d10d8cec1a9d5da2009e758304c47481f1321899 100644
--- a/src/smartlistmodel.cpp
+++ b/src/smartlistmodel.cpp
@@ -65,7 +65,8 @@ SmartListModel::rowCount(const QModelIndex &parent) const
             }
             return rowCount;
         }
-        return accInfo.conversationModel->allFilteredConversations().size();
+        return accInfo.conversationModel->allFilteredConversations().size()
+                + accInfo.conversationModel->getAllSearchResults().size();
     }
     return 0;
 }
@@ -130,11 +131,11 @@ SmartListModel::data(const QModelIndex &index, int role) const
             if (role == Role::AccountId) {
                 return QVariant(itemAccId);
             }
-            item = LRCInstance::getConversationFromConvUid(itemConvUid, itemAccId);
             auto &itemAccountInfo = LRCInstance::accountModel().getAccountInfo(itemAccId);
+            item = itemAccountInfo.conversationModel->getConversationForUID(itemConvUid);
             return getConversationItemData(item, itemAccountInfo, role);
         } else if (listModelType_ == Type::CONVERSATION) {
-            item = convModel->filteredConversation(index.row());
+            item = conversations_.at(index.row());
             return getConversationItemData(item, accountInfo, role);
         }
     } catch (const std::exception &e) {
@@ -179,6 +180,35 @@ SmartListModel::setConferenceableFilter(const QString &filter)
     endResetModel();
 }
 
+void
+SmartListModel::fillConversationsList()
+{
+    beginResetModel();
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    conversations_.clear();
+
+    for (auto convSearch : convModel->getAllSearchResults()) {
+        conversations_.emplace_back(convSearch);
+    }
+
+    for (auto convFilt : convModel->allFilteredConversations()) {
+        conversations_.emplace_back(convFilt);
+    }
+    endResetModel();
+}
+
+void
+SmartListModel::updateConversation(const QString &convUid)
+{
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    for (lrc::api::conversation::Info &conversation : conversations_) {
+        if (conversation.uid == convUid) {
+            conversation = convModel->getConversationForUID(convUid);
+            return;
+        }
+    }
+}
+
 void
 SmartListModel::toggleSection(const QString &section)
 {
@@ -194,7 +224,7 @@ SmartListModel::toggleSection(const QString &section)
 int
 SmartListModel::currentUidSmartListModelIndex()
 {
-    auto convUid = LRCInstance::getCurrentConvUid();
+    const auto convUid = LRCInstance::getCurrentConvUid();
     for (int i = 0; i < rowCount(); i++) {
         if (convUid == data(index(i, 0), Role::UID))
             return i;
@@ -278,17 +308,19 @@ SmartListModel::getConversationItemData(const conversation::Info &item,
     case Role::UID:
         return QVariant(item.uid);
     case Role::InCall: {
-        auto &convInfo = LRCInstance::getConversationFromConvUid(item.uid);
+        auto* convModel = LRCInstance::getCurrentConversationModel();
+        const auto convInfo = convModel->getConversationForUID(item.uid);
         if (!convInfo.uid.isEmpty()) {
-            auto callModel = LRCInstance::getCurrentCallModel();
+            auto* callModel = LRCInstance::getCurrentCallModel();
             return QVariant(callModel->hasCall(convInfo.callId));
         }
         return QVariant(false);
     }
     case Role::IsAudioOnly: {
-        auto &convInfo = LRCInstance::getConversationFromConvUid(item.uid);
+        auto* convModel = LRCInstance::getCurrentConversationModel();
+        const auto convInfo = convModel->getConversationForUID(item.uid);
         if (!convInfo.uid.isEmpty()) {
-            auto call = LRCInstance::getCallInfoForConversation(convInfo);
+            auto* call = LRCInstance::getCallInfoForConversation(convInfo);
             if (call) {
                 return QVariant(call->isAudioOnly);
             }
@@ -296,10 +328,11 @@ SmartListModel::getConversationItemData(const conversation::Info &item,
         return QVariant();
     }
     case Role::CallStackViewShouldShow: {
-        auto &convInfo = LRCInstance::getConversationFromConvUid(item.uid);
+        auto* convModel = LRCInstance::getCurrentConversationModel();
+        const auto convInfo = convModel->getConversationForUID(item.uid);
         if (!convInfo.uid.isEmpty()) {
-            auto callModel = LRCInstance::getCurrentCallModel();
-            auto call = callModel->getCall(convInfo.callId);
+            auto* callModel = LRCInstance::getCurrentCallModel();
+            const auto call = callModel->getCall(convInfo.callId);
             return QVariant(callModel->hasCall(convInfo.callId)
                             && ((!call.isOutgoing
                                  && (call.status == lrc::api::call::Status::IN_PROGRESS
@@ -309,9 +342,10 @@ SmartListModel::getConversationItemData(const conversation::Info &item,
         return QVariant(false);
     }
     case Role::CallStateStr: {
-        auto &convInfo = LRCInstance::getConversationFromConvUid(item.uid);
+        auto* convModel = LRCInstance::getCurrentConversationModel();
+        const auto convInfo = convModel->getConversationForUID(item.uid);
         if (!convInfo.uid.isEmpty()) {
-            auto call = LRCInstance::getCallInfoForConversation(convInfo);
+            auto* call = LRCInstance::getCallInfoForConversation(convInfo);
             if (call) {
                 auto statusString = call::to_string(call->status);
                 return QVariant(statusString);
@@ -323,7 +357,7 @@ SmartListModel::getConversationItemData(const conversation::Info &item,
         return QVariant(QString());
     case Role::Draft: {
         if (!item.uid.isEmpty()) {
-            auto draft = LRCInstance::getContentDraft(item.uid, accountInfo.id);
+            const auto draft = LRCInstance::getContentDraft(item.uid, accountInfo.id);
             if (!draft.isEmpty()) {
                 /*
                  * Pencil Emoji
diff --git a/src/smartlistmodel.h b/src/smartlistmodel.h
index 8ae7dca276337aab69de4ba80e731f004e662b2a..bdf35924166019121ccb79413e34733a2145b725 100644
--- a/src/smartlistmodel.h
+++ b/src/smartlistmodel.h
@@ -82,6 +82,8 @@ public:
     Q_INVOKABLE void setConferenceableFilter(const QString &filter = {});
     Q_INVOKABLE void toggleSection(const QString &section);
     Q_INVOKABLE int currentUidSmartListModelIndex();
+    Q_INVOKABLE void fillConversationsList();
+    Q_INVOKABLE void updateConversation(const QString &conv);
 
 private:
     QString accountId_;
@@ -96,4 +98,5 @@ private:
     Type listModelType_;
     QMap<QString, bool> sectionState_;
     QMap<ConferenceableItem, ConferenceableValue> conferenceables_;
-};
\ No newline at end of file
+    ConversationModel::ConversationQueue conversations_;
+};
diff --git a/src/utils.cpp b/src/utils.cpp
index 1556f9da6cf301c92c67621c64193c28e8668ec6..f66e7062bdbd4a0c13d3610dbe06d0d18c89d2b4 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -616,7 +616,7 @@ Utils::isInteractionGenerated(const lrc::api::interaction::Type &type)
 bool
 Utils::isContactValid(const QString &contactUid, const lrc::api::ConversationModel &model)
 {
-    auto contact = model.owner.contactModel->getContact(contactUid);
+    const auto contact = model.owner.contactModel->getContact(contactUid);
     return (contact.profileInfo.type == lrc::api::profile::Type::PENDING
             || contact.profileInfo.type == lrc::api::profile::Type::TEMPORARY
             || contact.profileInfo.type == lrc::api::profile::Type::RING
@@ -638,7 +638,8 @@ Utils::conversationPhoto(const QString &convUid,
                          const lrc::api::account::Info &accountInfo,
                          bool filtered)
 {
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid, accountInfo.id, filtered);
+    auto* convModel = LRCInstance::getCurrentConversationModel();
+    const auto convInfo = convModel->getConversationForUID(convUid);
     if (!convInfo.uid.isEmpty()) {
         return GlobalInstances::pixmapManipulator()
             .decorationRole(convInfo, accountInfo)
@@ -934,17 +935,15 @@ Utils::humanFileSize(qint64 fileSize)
 const QString
 UtilsAdapter::getBestName(const QString &accountId, const QString &uid)
 {
-    auto convModel = LRCInstance::getAccountInfo(accountId).conversationModel.get();
-    return Utils::bestNameForConversation(LRCInstance::getConversationFromConvUid(uid, accountId),
-                                          *convModel);
+    auto* convModel = LRCInstance::getAccountInfo(accountId).conversationModel.get();
+    return Utils::bestNameForConversation(convModel->getConversationForUID(uid), *convModel);
 }
 
 const QString
 UtilsAdapter::getBestId(const QString &accountId, const QString &uid)
 {
-    auto convModel = LRCInstance::getAccountInfo(accountId).conversationModel.get();
-    return Utils::bestIdForConversation(LRCInstance::getConversationFromConvUid(uid, accountId),
-                                        *convModel);
+    auto* convModel = LRCInstance::getAccountInfo(accountId).conversationModel.get();
+    return Utils::bestIdForConversation(convModel->getConversationForUID(uid), *convModel);
 }
 
 int
@@ -952,11 +951,11 @@ UtilsAdapter::getTotalUnreadMessages()
 {
     int totalUnreadMessages{0};
     if (LRCInstance::getCurrentAccountInfo().profileInfo.type != lrc::api::profile::Type::SIP) {
-        auto convModel = LRCInstance::getCurrentConversationModel();
+        auto* convModel = LRCInstance::getCurrentConversationModel();
         auto ringConversations = convModel->getFilteredConversations(lrc::api::profile::Type::RING);
         std::for_each(ringConversations.begin(),
                       ringConversations.end(),
-                      [&totalUnreadMessages, convModel](const auto &conversation) {
+                      [&totalUnreadMessages](const auto &conversation) {
                           totalUnreadMessages += conversation.unreadMessages;
                       });
     }
@@ -1009,8 +1008,8 @@ UtilsAdapter::getAccountListSize()
 void
 UtilsAdapter::setCurrentCall(const QString &accountId, const QString &convUid)
 {
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
     auto &accInfo = LRCInstance::getAccountInfo(accountId);
+    const auto convInfo = accInfo.conversationModel->getConversationForUID(convUid);
     accInfo.callModel->setCurrentCall(convInfo.callId);
 }
 
@@ -1037,7 +1036,9 @@ UtilsAdapter::hasVideoCall()
 const QString
 UtilsAdapter::getCallId(const QString &accountId, const QString &convUid)
 {
-    auto convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
+    auto &accInfo = LRCInstance::getAccountInfo(accountId);
+    const auto convInfo = accInfo.conversationModel->getConversationForUID(convUid);
+
     if (convInfo.uid.isEmpty()) {
         return "";
     }