diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp
index 0cb915f561ec6a75f1eda692a05f617ab591db39..7a0daa0127553a11c16eb0c7e93dfca2ce16fe26 100644
--- a/src/jamidht/conversation.cpp
+++ b/src/jamidht/conversation.cpp
@@ -161,14 +161,24 @@ public:
          const std::string& conversationId)
         : account_(account)
     {
+        std::vector<ConversationCommit> commits;
         repository_ = ConversationRepository::cloneConversation(account,
                                                                 remoteDevice,
-                                                                conversationId);
+                                                                conversationId,
+                                                                std::move([&](auto c) {
+                                                                    commits = std::move(c);
+                                                                }));
         if (!repository_) {
             emitSignal<libjami::ConversationSignal::OnConversationError>(
                 account->getAccountID(), conversationId, EFETCH, "Couldn't clone repository");
             throw std::logic_error("Couldn't clone repository");
         }
+        // To detect current active calls, we need to check history
+        conversationDataPath_ = fileutils::get_data_dir() / account->getAccountID()
+                                        / "conversation_data" / conversationId;
+        activeCallsPath_ = conversationDataPath_ / ConversationMapKeys::ACTIVE_CALLS;
+        for (const auto& c: repository_->convCommitToMap(commits))
+            updateActiveCalls(c);
         init();
     }
 
@@ -271,10 +281,11 @@ public:
      * Update activeCalls_ via announced commits (in load or via new commits)
      * @param commit        Commit to check
      * @param eraseOnly     If we want to ignore added commits
+     * @param emitSig    If we want to emit to client
      * @note eraseOnly is used by loadMessages. This is a fail-safe, this SHOULD NOT happen
      */
     void updateActiveCalls(const std::map<std::string, std::string>& commit,
-                           bool eraseOnly = false) const
+                           bool eraseOnly = false, bool emitSig = true) const
     {
         if (!repository_)
             return;
@@ -296,9 +307,10 @@ public:
             }
             if (updateActives) {
                 saveActiveCalls();
-                emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_,
-                                                                             repository_->id(),
-                                                                             activeCalls_);
+                if (emitSig)
+                    emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_,
+                                                                                repository_->id(),
+                                                                                activeCalls_);
             }
             return;
         }
@@ -331,9 +343,10 @@ public:
                     activeCall["device"] = device;
                     activeCalls_.emplace_back(activeCall);
                     saveActiveCalls();
-                    emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_,
-                                                                                 repository_->id(),
-                                                                                 activeCalls_);
+                    if (emitSig)
+                        emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_,
+                                                                                    repository_->id(),
+                                                                                    activeCalls_);
                 }
             } else {
                 if (itActive != activeCalls_.end()) {
@@ -366,9 +379,10 @@ public:
                     }
                 }
                 saveActiveCalls();
-                emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_,
-                                                                             repository_->id(),
-                                                                             activeCalls_);
+                if (emitSig)
+                    emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_,
+                                                                                repository_->id(),
+                                                                                activeCalls_);
             }
         }
     }
diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp
index 16963cfe9ed39de5813469ad4929bfebb6963179..8bcb71a52aa67a19e04e5174d4430222a9f13e5d 100644
--- a/src/jamidht/conversationrepository.cpp
+++ b/src/jamidht/conversationrepository.cpp
@@ -2524,7 +2524,8 @@ ConversationRepository::createConversation(const std::shared_ptr<JamiAccount>& a
 std::unique_ptr<ConversationRepository>
 ConversationRepository::cloneConversation(const std::shared_ptr<JamiAccount>& account,
                                           const std::string& deviceId,
-                                          const std::string& conversationId)
+                                          const std::string& conversationId,
+                                          std::function<void(std::vector<ConversationCommit>)>&& checkCommitCb)
 {
     auto conversationsPath = fileutils::get_data_dir() / account->getAccountID() / "conversations";
     dhtnet::fileutils::check_dir(conversationsPath);
@@ -2570,7 +2571,7 @@ ConversationRepository::cloneConversation(const std::shared_ptr<JamiAccount>& ac
     git_repository_free(rep);
     auto repo = std::make_unique<ConversationRepository>(account, conversationId);
     repo->pinCertificates(true); // need to load certificates to validate non known members
-    if (!repo->validClone()) {
+    if (!repo->validClone(std::move(checkCommitCb))) {
         repo->erase();
         JAMI_ERROR("Error when validating remote conversation");
         return nullptr;
@@ -3635,9 +3636,15 @@ ConversationRepository::validFetch(const std::string& remoteDevice) const
 }
 
 bool
-ConversationRepository::validClone() const
+ConversationRepository::validClone(std::function<void(std::vector<ConversationCommit>)>&& checkCommitCb) const
 {
-    return pimpl_->validCommits(log({}));
+    auto commits = log({});
+    auto res = pimpl_->validCommits(commits);
+    if (!res)
+        return false;
+    if (checkCommitCb)
+        checkCommitCb(std::move(commits));
+    return true;
 }
 
 void
diff --git a/src/jamidht/conversationrepository.h b/src/jamidht/conversationrepository.h
index 937c7517b44d3efc3b9d5497b368ffcccdfa9367..2202227dcf2a6df2f7e3fe2eca97df8d39ca9d85 100644
--- a/src/jamidht/conversationrepository.h
+++ b/src/jamidht/conversationrepository.h
@@ -158,12 +158,13 @@ public:
      * @param account           The account getting the conversation
      * @param deviceId          Remote device
      * @param conversationId    Conversation to clone
-     * @param socket            Socket used to clone
+     * @param checkCommitCb     Used if commits should be treated
      */
     static LIBJAMI_TESTABLE std::unique_ptr<ConversationRepository> cloneConversation(
         const std::shared_ptr<JamiAccount>& account,
         const std::string& deviceId,
-        const std::string& conversationId);
+        const std::string& conversationId,
+        std::function<void(std::vector<ConversationCommit>)>&& checkCommitCb = {});
 
     /**
      * Open a conversation repository for an account and an id
@@ -334,7 +335,7 @@ public:
      */
     std::pair<std::vector<ConversationCommit>, bool> validFetch(
         const std::string& remoteDevice) const;
-    bool validClone() const;
+    bool validClone(std::function<void(std::vector<ConversationCommit>)>&& checkCommitCb) const;
 
     /**
      * Delete branch with remote