diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp
index 2045146bd91a0ec6a144d374b2c12d03e706ee92..39a769ae337bbd503ca98683097aa5d0af11faaf 100644
--- a/src/jamidht/conversation.cpp
+++ b/src/jamidht/conversation.cpp
@@ -638,7 +638,8 @@ public:
     bool handleMessage(History& history,
                        const std::shared_ptr<libjami::SwarmMessage>& sharedCommit,
                        bool messageReceived) const;
-
+    void rectifyStatus(const std::shared_ptr<libjami::SwarmMessage>& message,
+                       History& history) const;
     /**
      * {uri, {
      *          {"fetch", "commitId"},
@@ -1071,6 +1072,36 @@ Conversation::Impl::handleMessage(History& history,
     return !messageReceived;
 }
 
+void Conversation::Impl::rectifyStatus(const std::shared_ptr<libjami::SwarmMessage>& message,
+                                       History& history) const
+{
+
+    auto parentIt = history.quickAccess.find(message->linearizedParent);
+    auto currentMessage = message;
+
+    while(parentIt != history.quickAccess.end()){
+        const auto& parent = parentIt->second;
+        for (const auto& [peer, value] : message->status) {
+            auto parentStatusIt = parent->status.find(peer);
+            if (parentStatusIt == parent->status.end() || parentStatusIt->second < value) {
+                parent->status[peer] = value;
+                emitSignal<libjami::ConfigurationSignal::AccountMessageStatusChanged>(
+                    accountId_,
+                    repository_->id(),
+                    peer,
+                    parent->id,
+                    value);
+            }
+            else if(parentStatusIt->second >= value){
+                break;
+            }
+        }
+        currentMessage = parent;
+        parentIt = history.quickAccess.find(parent->linearizedParent);
+    }
+}
+
+
 std::vector<std::shared_ptr<libjami::SwarmMessage>>
 Conversation::Impl::addToHistory(const std::vector<std::map<std::string, std::string>>& commits,
                                  bool messageReceived,
@@ -1137,7 +1168,9 @@ Conversation::Impl::addToHistory(const std::vector<std::map<std::string, std::st
                             cache = static_cast<int32_t>(libjami::Account::MessageStates::SENT);
                         }
                     }
-                    sharedCommit->status[member.uri] = static_cast<int32_t>(cache);
+                    if(static_cast<int32_t>(cache) > sharedCommit->status[member.uri]){
+                        sharedCommit->status[member.uri] = static_cast<int32_t>(cache);
+                    }
                 } else {
                     // If member is author of the message received, they already saw it
                     if (member.uri == commit.at("author")) {
@@ -1155,7 +1188,9 @@ Conversation::Impl::addToHistory(const std::vector<std::map<std::string, std::st
                     } else if (messagesStatus_[member.uri]["fetched"] == sharedCommit->id) {
                         status = static_cast<int32_t>(libjami::Account::MessageStates::SENT);
                     }
-                    sharedCommit->status[member.uri] = static_cast<int32_t>(status);
+                    if(static_cast<int32_t>(status) > sharedCommit->status[member.uri]){
+                        sharedCommit->status[member.uri] = static_cast<int32_t>(status);
+                    }
                 }
             }
         }
@@ -1168,6 +1203,7 @@ Conversation::Impl::addToHistory(const std::vector<std::map<std::string, std::st
         } else if (handleMessage(*history, sharedCommit, messageReceived)) {
             messages.emplace_back(sharedCommit);
         }
+        rectifyStatus(sharedCommit, *history);
     };
     std::for_each(commits.begin(), commits.end(), addCommit);
 
@@ -2145,13 +2181,15 @@ Conversation::Impl::updateStatus(const std::string& uri,
         auto message = loadedHistory_.quickAccess.find(cid);
         if (message != loadedHistory_.quickAccess.end()) {
             // Update message and emit to client,
-            message->second->status[uri] = static_cast<int32_t>(st);
-            emitSignal<libjami::ConfigurationSignal::AccountMessageStatusChanged>(
-                accountId_,
-                repository_->id(),
-                uri,
-                cid,
-                static_cast<int>(st));
+            if(static_cast<int32_t>(st) > message->second->status[uri]){
+                message->second->status[uri] = static_cast<int32_t>(st);
+                emitSignal<libjami::ConfigurationSignal::AccountMessageStatusChanged>(
+                    accountId_,
+                    repository_->id(),
+                    uri,
+                    cid,
+                    static_cast<int>(st));
+            }
         } else {
             // In this case, commit is not loaded by client, so we cache it
             // No need to emit to client, they will get a correct status on load.