diff --git a/src/libclient/conversationmodel.cpp b/src/libclient/conversationmodel.cpp
index 2a3fab0ff7604f0b89f4b4d4c89558dc8a25b396..e897830df26a0550c3fc48ce2fd82ea82f7ad414 100644
--- a/src/libclient/conversationmodel.cpp
+++ b/src/libclient/conversationmodel.cpp
@@ -2312,9 +2312,11 @@ ConversationModelPimpl::slotConversationLoaded(uint32_t requestId,
 
     try {
         auto& conversation = getConversationForUid(conversationId).get();
-        QString oldLast; // Used to detect loading loops just in case.
-        if (conversation.interactions->size() != 0)
+        QString oldLast, oldBegin; // Used to detect loading loops just in case.
+        if (conversation.interactions->size() != 0) {
+            oldBegin = conversation.interactions->begin()->first;
             oldLast = conversation.interactions->rbegin()->first;
+        }
         for (const auto& message : messages) {
             if (message["type"].isEmpty()) {
                 continue;
@@ -2362,21 +2364,19 @@ ConversationModelPimpl::slotConversationLoaded(uint32_t requestId,
             }
         }
 
-        for (int j = conversation.interactions->size() - 1; j >= 0; j--) {
-            if (conversation.interactions->atIndex(j).second.type != interaction::Type::MERGE) {
-                conversation.lastMessageUid = conversation.interactions->atIndex(j).first;
-                break;
-            }
-        }
+        conversation.lastMessageUid = conversation.interactions->lastMessageUid();
         if (conversation.lastMessageUid.isEmpty() && !conversation.allMessagesLoaded
             && messages.size() != 0) {
             if (conversation.interactions->size() > 0) {
-                QString newLast;
-                if (conversation.interactions->size() > 0)
+                QString newLast, newBegin;
+                if (conversation.interactions->size() > 0) {
+                    newBegin = conversation.interactions->begin()->first;
                     newLast = conversation.interactions->rbegin()->first;
-                if (newLast == oldLast && !newLast.isEmpty()) { // [[unlikely]] in c++20
-                    qCritical() << "Loading loop detected for " << conversationId << "(" << newLast
-                                << ")";
+                }
+                if (newLast == oldLast && !newLast.isEmpty() && newBegin == oldBegin
+                    && !newBegin.isEmpty()) { // [[unlikely]] in c++20
+                    qCritical() << "Loading loop detected for " << conversationId << "(" << newBegin
+                                << " ; " << newLast << ")";
                     return;
                 }
             }
@@ -2473,7 +2473,7 @@ ConversationModelPimpl::slotMessageReceived(const QString& accountId,
             invalidateModel();
             return;
         }
-        conversation.lastMessageUid = msgId;
+        conversation.lastMessageUid = conversation.interactions->lastMessageUid();
         invalidateModel();
         if (!interaction::isOutgoing(msg)) {
             Q_EMIT behaviorController.newUnreadInteraction(linked.owner.id,
diff --git a/src/libclient/messagelistmodel.cpp b/src/libclient/messagelistmodel.cpp
index 8e3f0b1cba0806950f4ca05081294cdfb9647eee..339ec2895cf9bc92f2e475d4c4cb0f2acdddd37d 100644
--- a/src/libclient/messagelistmodel.cpp
+++ b/src/libclient/messagelistmodel.cpp
@@ -541,4 +541,16 @@ MessageListModel::emitDataChanged(const QString& msgId, VectorInt roles)
     Q_EMIT dataChanged(modelIndex, modelIndex, roles);
 }
 
+QString
+MessageListModel::lastMessageUid() const
+{
+    for (auto it = interactions_.rbegin(); it != interactions_.rend(); ++it) {
+        auto lastType = it->second.type;
+        if (lastType != interaction::Type::MERGE and !it->second.body.isEmpty()) {
+            return it->first;
+        }
+    }
+    return {};
+}
+
 } // namespace lrc
diff --git a/src/libclient/messagelistmodel.h b/src/libclient/messagelistmodel.h
index 2613276b73d4e5efe37b0012e45ce5851e5a140b..b3d494ac75e7de2fd3b2558138106707fd783eb8 100644
--- a/src/libclient/messagelistmodel.h
+++ b/src/libclient/messagelistmodel.h
@@ -130,6 +130,8 @@ public:
 
     Q_SIGNAL void timestampUpdate();
 
+    QString lastMessageUid() const;
+
 protected:
     using Role = MessageList::Role;