diff --git a/src/mainview/components/MessageWebView.qml b/src/mainview/components/MessageWebView.qml
index 5afac80cc9fd9a147c1f171afa5f8a193ca6aae7..4f7531fe6d207f8591e7896bb676ece36b4e57cc 100644
--- a/src/mainview/components/MessageWebView.qml
+++ b/src/mainview/components/MessageWebView.qml
@@ -252,6 +252,10 @@ Rectangle {
         function parseI18nData() {
             return MessagesAdapter.chatviewTranslatedStrings
         }
+
+        function loadMessages(n) {
+            return MessagesAdapter.loadMessages(n)
+        }
     }
 
     WebEngineView {
diff --git a/src/messagesadapter.cpp b/src/messagesadapter.cpp
index 4fd6ff8230f01b11d4f4152cdb4c0aeef60b578f..43f1be85bce5163b53a3c1c7e490b39e7df6f841 100644
--- a/src/messagesadapter.cpp
+++ b/src/messagesadapter.cpp
@@ -156,7 +156,7 @@ MessagesAdapter::connectConversationModel()
 
     newMessagesAvailableConnection_
         = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::newMessagesAvailable,
+                           &ConversationModel::newMessagesAvailable,
                            [this](const QString& accountId, const QString& conversationId) {
                                auto* convModel = lrcInstance_->accountModel()
                                                      .getAccountInfo(accountId)
@@ -164,7 +164,9 @@ MessagesAdapter::connectConversationModel()
                                auto optConv = convModel->getConversationForUid(conversationId);
                                if (!optConv)
                                    return;
-                               printHistory(*convModel, optConv->get().interactions);
+                               updateHistory(*convModel,
+                                             optConv->get().interactions,
+                                             optConv->get().allMessagesLoaded);
                                Utils::oneShotConnect(qmlObj_,
                                                      SIGNAL(messagesLoaded()),
                                                      this,
@@ -228,7 +230,7 @@ MessagesAdapter::slotMessagesCleared()
         return;
     if (convOpt->get().mode != lrc::api::conversation::Mode::NON_SWARM
         && !convOpt->get().allMessagesLoaded) {
-        convModel->loadConversationMessages(convOpt->get().uid, 0);
+        convModel->loadConversationMessages(convOpt->get().uid, 20);
     } else {
         printHistory(*convModel, convOpt->get().interactions);
         Utils::oneShotConnect(qmlObj_, SIGNAL(messagesLoaded()), this, SLOT(slotMessagesLoaded()));
@@ -556,6 +558,18 @@ MessagesAdapter::printHistory(lrc::api::ConversationModel& conversationModel,
     QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
 }
 
+void
+MessagesAdapter::updateHistory(lrc::api::ConversationModel& conversationModel,
+                               MessagesList interactions,
+                               bool allLoaded)
+{
+    auto interactionsStr = interactionsToJsonArrayObject(conversationModel, interactions).toUtf8();
+    QString s = QString::fromLatin1("updateHistory(%1, %2);")
+                    .arg(interactionsStr.constData())
+                    .arg(allLoaded);
+    QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
+}
+
 void
 MessagesAdapter::setSenderImage(const QString& sender, const QString& senderImage)
 {
@@ -717,3 +731,15 @@ MessagesAdapter::removeConversation(const QString& accountId,
     if (convUid == currentConvUid_)
         currentConvUid_.clear();
 }
+
+void
+MessagesAdapter::loadMessages(int n)
+{
+    auto* convModel = lrcInstance_->getCurrentConversationModel();
+    auto convOpt = convModel->getConversationForUid(currentConvUid_);
+    if (!convOpt)
+        return;
+    if (convOpt->get().mode != lrc::api::conversation::Mode::NON_SWARM
+        && !convOpt->get().allMessagesLoaded)
+        convModel->loadConversationMessages(convOpt->get().uid, n);
+}
diff --git a/src/messagesadapter.h b/src/messagesadapter.h
index a5cbb78a53b75c81d6ee5a1c8fb58c06110f6dc6..cd5f905f61ca0fa24576e4cef9fbbe9cd1eefaf9 100644
--- a/src/messagesadapter.h
+++ b/src/messagesadapter.h
@@ -67,6 +67,7 @@ protected:
     Q_INVOKABLE void refuseFile(const QString& arg);
     Q_INVOKABLE void pasteKeyDetected();
     Q_INVOKABLE void onComposing(bool isComposing);
+    Q_INVOKABLE void loadMessages(int n);
 
     // Manually update draft when hiding message web view (Back to welcome page).
     Q_INVOKABLE void updateDraft();
@@ -76,7 +77,10 @@ protected:
     void requestSendMessageContent();
     void setInvitation(bool show, const QString& contactUri = {}, const QString& contactId = {});
     void clear();
-    void printHistory(lrc::api::ConversationModel& conversationModel, MessagesList interactions);
+    void printHistory(ConversationModel& conversationModel, MessagesList interactions);
+    void updateHistory(ConversationModel& conversationModel,
+                       MessagesList interactions,
+                       bool allLoaded);
     void setSenderImage(const QString& sender, const QString& senderImage);
     void printNewInteraction(lrc::api::ConversationModel& conversationModel,
                              const QString& msgId,