diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp
index bcd2f51e0c1b5befed6d5c8949c05303aa1a3c32..22812c3effc39dbb5a36992ad577f3cc75cd9c65 100644
--- a/src/jamidht/conversation.cpp
+++ b/src/jamidht/conversation.cpp
@@ -1088,7 +1088,10 @@ Conversation::Impl::addToHistory(const std::vector<std::map<std::string, std::st
                             cache = static_cast<int32_t>(libjami::Account::MessageStates::DISPLAYED);
                         }
                     } else if (cache <= static_cast<int32_t>(libjami::Account::MessageStates::SENDING)) { // SENDING or UNKNOWN
-                        if (messagesStatus_[member.uri]["fetched"] == sharedCommit->id) {
+                        // cache can be upgraded to displayed or sent
+                        if (messagesStatus_[member.uri]["read"] == sharedCommit->id) {
+                            cache = static_cast<int32_t>(libjami::Account::MessageStates::DISPLAYED);
+                        } else if (messagesStatus_[member.uri]["fetched"] == sharedCommit->id) {
                             cache = static_cast<int32_t>(libjami::Account::MessageStates::SENT);
                         }
                     }
diff --git a/test/unitTest/conversation/conversationFetchSent.cpp b/test/unitTest/conversation/conversationFetchSent.cpp
index e7c6eac6e568574d1557c60face54119a47590d4..d9a2b29dfadb26643c7e0d04da47bcd00798aa2c 100644
--- a/test/unitTest/conversation/conversationFetchSent.cpp
+++ b/test/unitTest/conversation/conversationFetchSent.cpp
@@ -84,10 +84,12 @@ public:
 private:
     void testSyncFetch();
     void testSyncAfterDisconnection();
+    void testDisplayedOnLoad();
 
     CPPUNIT_TEST_SUITE(ConversationFetchSentTest);
     CPPUNIT_TEST(testSyncFetch);
     CPPUNIT_TEST(testSyncAfterDisconnection);
+    CPPUNIT_TEST(testDisplayedOnLoad);
     CPPUNIT_TEST_SUITE_END();
 };
 
@@ -171,6 +173,19 @@ ConversationFetchSentTest::connectSignals()
                 }
                 cv.notify_one();
             }));
+    confHandlers.insert(libjami::exportable_callback<libjami::ConversationSignal::SwarmLoaded>(
+        [&](uint32_t, const std::string& accountId,
+            const std::string& /* conversationId */,
+            std::vector<libjami::SwarmMessage> messages) {
+            if (accountId == aliceId) {
+                aliceData.messages.insert(aliceData.messages.end(), messages.begin(), messages.end());
+            } else if (accountId == bobId) {
+                bobData.messages.insert(bobData.messages.end(), messages.begin(), messages.end());
+            } else if (accountId == bob2Id) {
+                bob2Data.messages.insert(bob2Data.messages.end(), messages.begin(), messages.end());
+            }
+            cv.notify_one();
+        }));
     confHandlers.insert(libjami::exportable_callback<libjami::ConversationSignal::ConversationReady>(
         [&](const std::string& accountId, const std::string& conversationId) {
             if (accountId == aliceId) {
@@ -466,6 +481,64 @@ ConversationFetchSentTest::testSyncFetch()
     CPPUNIT_ASSERT(getMsgStatus(bobData, msgId6, aliceUri) == libjami::Account::MessageStates::UNKNOWN);
 }
 
+void
+ConversationFetchSentTest::testDisplayedOnLoad()
+{
+    std::cout << "\nRunning test: " << __func__ << std::endl;
+    connectSignals();
+
+    auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+    auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+    auto bobUri = bobAccount->getUsername();
+    auto aliceUri = aliceAccount->getUsername();
+
+    // Create conversation between alice and bob
+    aliceAccount->addContact(bobUri);
+    aliceAccount->sendTrustRequest(bobUri, {});
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return bobData.requestReceived; }));
+    CPPUNIT_ASSERT(bobAccount->acceptTrustRequest(aliceUri));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return !bobData.conversationId.empty(); }));
+
+    std::this_thread::sleep_for(5s); // Wait for all join messages to be received
+
+    // bob send 2 messages
+    auto aliceMsgSize = aliceData.messages.size(), bobMsgSize = bobData.messages.size();
+    libjami::sendMessage(bobId, bobData.conversationId, "1"s, "");
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() {
+        return aliceData.messages.size() == aliceMsgSize + 1
+                && bobData.messages.size() == bobMsgSize + 1; }));
+    auto msgId1 = aliceData.messages.rbegin()->id;
+    auto getMsgStatus = [&](const auto& data, const auto& id, const auto& peer) {
+        for (const auto& msg : data.messages) {
+            if (msg.id == id && msg.status.find(peer) != msg.status.end()) {
+                return static_cast<libjami::Account::MessageStates>(msg.status.at(peer));
+            }
+        }
+        return libjami::Account::MessageStates::UNKNOWN;
+    };
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return getMsgStatus(bobData, msgId1, aliceUri) == libjami::Account::MessageStates::SENT; }));
+    libjami::sendMessage(bobId, bobData.conversationId, "2"s, "");
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return aliceData.messages.size() == aliceMsgSize + 2
+                                                    && bobData.messages.size() == bobMsgSize + 2;}));
+    auto msgId2 = aliceData.messages.rbegin()->id;
+
+    // Second message is set to displayed by alice
+    aliceAccount->setMessageDisplayed("swarm:" + aliceData.conversationId, msgId2, 3);
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return getMsgStatus(bobData, msgId1, aliceUri) == libjami::Account::MessageStates::DISPLAYED
+                                                && getMsgStatus(bobData, msgId2, aliceUri) == libjami::Account::MessageStates::DISPLAYED; }));
+
+    bobAccount->convModule()->loadConversations(); // Reset data
+    bobData.messages.clear();
+    // Load messages, messages should be displayed
+    CPPUNIT_ASSERT(getMsgStatus(bobData, msgId1, aliceUri) != libjami::Account::MessageStates::DISPLAYED);
+    libjami::loadConversation(bobId, bobData.conversationId, "", 0);
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() {
+        return getMsgStatus(bobData, msgId1, aliceUri) == libjami::Account::MessageStates::DISPLAYED
+                                                && getMsgStatus(bobData, msgId2, aliceUri) == libjami::Account::MessageStates::DISPLAYED; }));
+
+}
+
+
 } // namespace test
 } // namespace jami