diff --git a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml
index 891b3137e3ac3758f5f38ad5b83eb9312bf9693d..307856c836a20da372a5522d3a3cfae8b0e2513b 100644
--- a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml
+++ b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml
@@ -1774,6 +1774,18 @@
            <arg type="u" name="id" direction="out"/>
        </method>
 
+       <method name="loadConversationUntil" tp:name-for-bindings="loadConversationUntil">
+           <tp:added version="10.0.0"/>
+           <tp:docstring>
+               Load messages from a conversation
+           </tp:docstring>
+           <arg type="s" name="accountId" direction="in"/>
+           <arg type="s" name="conversationId" direction="in"/>
+           <arg type="s" name="fromMessage" direction="in"/>
+           <arg type="s" name="to" direction="in"/>
+           <arg type="u" name="id" direction="out"/>
+       </method>
+
        <method name="countInteractions" tp:name-for-bindings="countInteractions">
            <tp:added version="10.0.0"/>
            <tp:docstring>
diff --git a/bin/dbus/dbusconfigurationmanager.cpp b/bin/dbus/dbusconfigurationmanager.cpp
index ebe07adc767f7ee98d5be49bc9bdf6596633e95f..3fffa78e705174cb03cd4a282d56cf5d729c4e1e 100644
--- a/bin/dbus/dbusconfigurationmanager.cpp
+++ b/bin/dbus/dbusconfigurationmanager.cpp
@@ -920,6 +920,15 @@ DBusConfigurationManager::loadConversationMessages(const std::string& accountId,
     return DRing::loadConversationMessages(accountId, conversationId, fromMessage, n);
 }
 
+uint32_t
+DBusConfigurationManager::loadConversationUntil(const std::string& accountId,
+                                                const std::string& conversationId,
+                                                const std::string& fromMessage,
+                                                const std::string& to)
+{
+    return DRing::loadConversationUntil(accountId, conversationId, fromMessage, to);
+}
+
 uint32_t
 DBusConfigurationManager::countInteractions(const std::string& accountId,
                                             const std::string& conversationId,
diff --git a/bin/dbus/dbusconfigurationmanager.h b/bin/dbus/dbusconfigurationmanager.h
index 0224aa6b89daf24f0b2291ec3603949607191831..86357d49c25972fc5c23b02286d6f8d38a3893b8 100644
--- a/bin/dbus/dbusconfigurationmanager.h
+++ b/bin/dbus/dbusconfigurationmanager.h
@@ -281,6 +281,10 @@ public:
                                       const std::string& conversationId,
                                       const std::string& fromMessage,
                                       const uint32_t& n);
+    uint32_t loadConversationUntil(const std::string& accountId,
+                                   const std::string& conversationId,
+                                   const std::string& fromMessage,
+                                   const std::string& to);
     uint32_t countInteractions(const std::string& accountId,
                                const std::string& conversationId,
                                const std::string& toId,
diff --git a/bin/jni/conversation.i b/bin/jni/conversation.i
index db4fc2205979ee7071eea79ddd0445b3877f4078..d076d8206ad12bf593ffc9bc28ab62b3d622c71c 100644
--- a/bin/jni/conversation.i
+++ b/bin/jni/conversation.i
@@ -59,6 +59,7 @@ namespace DRing {
   // Message send/load
   void sendMessage(const std::string& accountId, const std::string& conversationId, const std::string& message, const std::string& replyTo);
   uint32_t loadConversationMessages(const std::string& accountId, const std::string& conversationId, const std::string& fromMessage, size_t n);
+  uint32_t loadConversationUntil(const std::string& accountId, const std::string& conversationId, const std::string& fromMessage, const std::string& toMessage);
   uint32_t countInteractions(const std::string& accountId, const std::string& conversationId, const std::string& toId, const std::string& fromId, const std::string& authorUri);
 }
 
diff --git a/bin/nodejs/conversation.i b/bin/nodejs/conversation.i
index 7d0d94c4c4f7b5b9ec536fb957ec977b8d2b3546..c63ed3bf7aba6102cc2e6295ed609b63d1892e64 100644
--- a/bin/nodejs/conversation.i
+++ b/bin/nodejs/conversation.i
@@ -59,6 +59,7 @@ namespace DRing {
   // Message send/load
   void sendMessage(const std::string& accountId, const std::string& conversationId, const std::string& message, const std::string& replyTo);
   uint32_t loadConversationMessages(const std::string& accountId, const std::string& conversationId, const std::string& fromMessage, size_t n);
+  uint32_t loadConversationUntil(const std::string& accountId, const std::string& conversationId, const std::string& fromMessage, const std::string& toMessage);
   uint32_t countInteractions(const std::string& accountId, const std::string& conversationId, const std::string& toId, const std::string& fromId, const std::string& authorUri);
 
 }
diff --git a/src/client/conversation_interface.cpp b/src/client/conversation_interface.cpp
index 91adc77d0a824cd495aef83b92a8b950482cf4ce..9ce74993ebe52551c07330070cd90accc7883bdf 100644
--- a/src/client/conversation_interface.cpp
+++ b/src/client/conversation_interface.cpp
@@ -160,6 +160,18 @@ loadConversationMessages(const std::string& accountId,
     return 0;
 }
 
+uint32_t
+loadConversationUntil(const std::string& accountId,
+                      const std::string& conversationId,
+                      const std::string& fromMessage,
+                      const std::string& toMessage)
+{
+    if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
+        if (auto convModule = acc->convModule())
+            return convModule->loadConversationUntil(conversationId, fromMessage, toMessage);
+    return 0;
+}
+
 uint32_t
 countInteractions(const std::string& accountId,
                   const std::string& conversationId,
diff --git a/src/jami/conversation_interface.h b/src/jami/conversation_interface.h
index 63bbdc8012089c54503769e10c1ea56509f963b5..931b1fc6336ae632f4ad010307e4afd40910c9f6 100644
--- a/src/jami/conversation_interface.h
+++ b/src/jami/conversation_interface.h
@@ -69,6 +69,10 @@ DRING_PUBLIC uint32_t loadConversationMessages(const std::string& accountId,
                                                const std::string& conversationId,
                                                const std::string& fromMessage,
                                                size_t n);
+DRING_PUBLIC uint32_t loadConversationUntil(const std::string& accountId,
+                                            const std::string& conversationId,
+                                            const std::string& fromMessage,
+                                            const std::string& toMessage);
 DRING_PUBLIC uint32_t countInteractions(const std::string& accountId,
                                         const std::string& conversationId,
                                         const std::string& toId,
diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp
index d0009f3c379cace4fb841373be7b93d461bd2071..bd32ff9ce59374f805350c33ceb1dcddca6c24f2 100644
--- a/src/jamidht/conversation_module.cpp
+++ b/src/jamidht/conversation_module.cpp
@@ -1261,6 +1261,30 @@ ConversationModule::loadConversationMessages(const std::string& conversationId,
     return 0;
 }
 
+uint32_t
+ConversationModule::loadConversationUntil(const std::string& conversationId,
+                                          const std::string& fromMessage,
+                                          const std::string& toMessage)
+{
+    std::lock_guard<std::mutex> lk(pimpl_->conversationsMtx_);
+    auto acc = pimpl_->account_.lock();
+    auto conversation = pimpl_->conversations_.find(conversationId);
+    if (acc && conversation != pimpl_->conversations_.end() && conversation->second) {
+        const uint32_t id = std::uniform_int_distribution<uint32_t> {}(acc->rand);
+        conversation->second->loadMessages(
+            [accountId = pimpl_->accountId_, conversationId, id](auto&& messages) {
+                emitSignal<DRing::ConversationSignal::ConversationLoaded>(id,
+                                                                          accountId,
+                                                                          conversationId,
+                                                                          messages);
+            },
+            fromMessage,
+            toMessage);
+        return id;
+    }
+    return 0;
+}
+
 std::shared_ptr<TransferManager>
 ConversationModule::dataTransfer(const std::string& id) const
 {
diff --git a/src/jamidht/conversation_module.h b/src/jamidht/conversation_module.h
index 2c4d38008316e8368401369bebba91f05c1c339b..e0454cbd8d179b633b96e883c4924b37ed38c49b 100644
--- a/src/jamidht/conversation_module.h
+++ b/src/jamidht/conversation_module.h
@@ -171,6 +171,9 @@ public:
     uint32_t loadConversationMessages(const std::string& conversationId,
                                       const std::string& fromMessage = "",
                                       size_t n = 0);
+    uint32_t loadConversationUntil(const std::string& conversationId,
+                                   const std::string& fromMessage,
+                                   const std::string& to);
 
     // File transfer
     /**