diff --git a/src/api/conversationmodel.h b/src/api/conversationmodel.h
index 90e04543c6ce96cf21d6e6aaf5a7c27d6510b840..05eef0488c2b4e2a9f977aa8f82e4311f8e564a3 100644
--- a/src/api/conversationmodel.h
+++ b/src/api/conversationmodel.h
@@ -146,7 +146,6 @@ public:
      * @return a copy of the conversation
      */
     OptRef<conversation::Info> filteredConversation(unsigned row) const;
-
     /**
      * Get the search results
      * @return a searchResult
@@ -202,8 +201,9 @@ public:
      * Send a message to the conversation
      * @param uid of the conversation
      * @param body of the message
+     * @param parentId id of parent message. Default is "" - last message in conversation.
      */
-    void sendMessage(const QString& uid, const QString& body);
+    void sendMessage(const QString& uid, const QString& body, const QString& parentId = "");
     /**
      * Modify the current filter (will change the result of getFilteredConversations)
      * @param filter the new filter
@@ -276,7 +276,7 @@ public:
 
     void cancelTransfer(const QString& convUid, uint64_t interactionId);
 
-    void getTransferInfo(uint64_t interactionId, api::datatransfer::Info& info);
+    void getTransferInfo(const QString& conversationId, uint64_t interactionId, api::datatransfer::Info& info);
     /**
      * @param convUid, uid of the conversation
      * @return the number of unread messages for the conversation
@@ -288,6 +288,36 @@ public:
      * @param isComposing   if is composing
      */
     void setIsComposing(const QString& uid, bool isComposing);
+    /**
+     * load messages for conversation
+     * @param conversationId conversation's id
+     * @param size number of messages should be loaded. Default 1
+     * @return id for loading request.
+     */
+    uint32_t loadConversationMessages(const QString& conversationId,
+                                      const int size = 1);
+    /**
+     * accept request for conversation
+     * @param conversationId conversation's id
+     */
+    void acceptConversationRequest(const QString& conversationId);
+    /**
+     * decline request for conversation
+     * @param conversationId conversation's id
+     */
+    void declineConversationRequest(const QString& conversationId);
+    /**
+     * add member to conversation
+     * @param conversationId conversation's id
+     * @param memberId members's id
+     */
+    void addConversationMember(const QString& conversationId, const QString& memberId);
+    /**
+     * remove member from conversation
+     * @param conversationId conversation's id
+     * @param memberId members's id
+     */
+    void removeConversationMember(const QString& conversationId, const QString& memberId);
 
 Q_SIGNALS:
     /**
@@ -383,6 +413,19 @@ Q_SIGNALS:
      * Emitted when search result has been updated
      */
     void searchResultUpdated() const;
+    /**
+     * Emitted when finish loading messages for conversation
+     * @param loadingRequestId  loading request id
+     * @param conversationId conversation Id
+     */
+    void conversationMessagesLoaded(uint32_t loadingRequestId, const QString& conversationId) const;
+    /**
+     * Emitted when new messages available. When messages loaded from loading request or
+     * receiving/sending new interactions
+     * @param accountId  account id
+     * @param conversationId conversation Id
+     */
+    void newMessagesAvailable(const QString& accountId, const QString& conversationId) const;
 
     /**
      * The following signals are intended for QAbtractListModel compatibility
diff --git a/src/api/datatransfermodel.h b/src/api/datatransfermodel.h
index 934c0196eac980a7860fa47cf2f8e68ee4fc0b49..acf99c3079980a9c8156dffdbd577b13d1587806 100644
--- a/src/api/datatransfermodel.h
+++ b/src/api/datatransfermodel.h
@@ -57,13 +57,13 @@ public:
                   const QString& file_path,
                   const QString& display_name);
 
-    void transferInfo(long long ringId, datatransfer::Info& lrc_info);
+    void transferInfo(const QString& accountId, const QString& conversationId, long long ringId, datatransfer::Info& lrc_info);
 
-    void bytesProgress(int interactionId, int64_t& total, int64_t& progress);
+    void bytesProgress(const QString& accountId, const QString& conversationId, int interactionId, int64_t& total, int64_t& progress);
 
-    QString accept(int interactionId, const QString& file_path, std::size_t offset);
+    QString accept(const QString& accountId, const QString& conversationId, int interactionId, const QString& file_path, std::size_t offset);
 
-    void cancel(int interactionId);
+    void cancel(const QString& accountId, const QString& conversationId, int interactionId);
 
     void registerTransferId(long long dringId, int interactionId);
 
diff --git a/src/callbackshandler.cpp b/src/callbackshandler.cpp
index 374be8561794a2644cefe1fc248ffbeedc8b2c95..22bb0da4c990bf299a56189a1a83bc350fcb1c95 100644
--- a/src/callbackshandler.cpp
+++ b/src/callbackshandler.cpp
@@ -262,6 +262,31 @@ CallbacksHandler::CallbacksHandler(const Lrc& parent)
             this,
             &CallbacksHandler::slotAudioMeterReceived,
             Qt::QueuedConnection);
+    connect(&ConfigurationManager::instance(),
+            &ConfigurationManagerInterface::conversationLoaded,
+            this,
+            &CallbacksHandler::slotConversationLoaded,
+            Qt::QueuedConnection);
+    connect(&ConfigurationManager::instance(),
+            &ConfigurationManagerInterface::messageReceived,
+            this,
+            &CallbacksHandler::slotMessageReceived,
+            Qt::QueuedConnection);
+    connect(&ConfigurationManager::instance(),
+            &ConfigurationManagerInterface::conversationRequestReceived,
+            this,
+            &CallbacksHandler::slotConversationRequestReceived,
+            Qt::QueuedConnection);
+    connect(&ConfigurationManager::instance(),
+            &ConfigurationManagerInterface::conversationReady,
+            this,
+            &CallbacksHandler::slotConversationReady,
+            Qt::QueuedConnection);
+    connect(&ConfigurationManager::instance(),
+            &ConfigurationManagerInterface::conversationMemberEvent,
+            this,
+            &CallbacksHandler::slotConversationMemberEvent,
+            Qt::QueuedConnection);
 }
 
 CallbacksHandler::~CallbacksHandler() {}
@@ -487,12 +512,12 @@ CallbacksHandler::slotAccountMessageStatusChanged(const QString& accountId,
 }
 
 void
-CallbacksHandler::slotDataTransferEvent(qulonglong dringId, uint codeStatus)
+CallbacksHandler::slotDataTransferEvent(const QString& accountId, const QString& conversationId, qulonglong dringId, uint codeStatus)
 {
     auto event = DRing::DataTransferEventCode(codeStatus);
 
     api::datatransfer::Info info;
-    parent.getDataTransferModel().transferInfo(dringId, info);
+    parent.getDataTransferModel().transferInfo(accountId, conversationId, dringId, info);
 
     // WARNING: info.status could be INVALID in case of async signaling
     // So listeners must only take account of dringId in such case.
@@ -631,4 +656,41 @@ CallbacksHandler::slotRemoteRecordingChanged(const QString& callId,
     emit remoteRecordingChanged(callId, peerNumber, state);
 }
 
+void
+CallbacksHandler::slotConversationLoaded(uint32_t requestId,
+                                         const QString& accountId,
+                                         const QString& conversationId,
+                                         const VectorMapStringString& messages)
+{
+    emit conversationLoaded(requestId, accountId, conversationId, messages);
+}
+void
+CallbacksHandler::slotMessageReceived(const QString& accountId,
+                                      const QString& conversationId,
+                                      const MapStringString& message)
+{
+    emit messageReceived(accountId, conversationId, message);
+}
+void
+CallbacksHandler::slotConversationRequestReceived(const QString& accountId,
+                                                  const QString& conversationId,
+                                                  const MapStringString& metadatas)
+{
+    emit conversationRequestReceived(accountId, conversationId, metadatas);
+}
+void
+CallbacksHandler::slotConversationReady(const QString& accountId, const QString& conversationId)
+{
+    emit conversationReady(accountId, conversationId);
+}
+
+void
+CallbacksHandler::slotConversationMemberEvent(const QString& accountId,
+                                              const QString& conversationId,
+                                              const QString& memberId,
+                                              int event)
+{
+    emit conversationMemberEvent(accountId, conversationId, memberId, event);
+}
+
 } // namespace lrc
diff --git a/src/callbackshandler.h b/src/callbackshandler.h
index 8e16e64d3e55a3ae4aed11da2bd2f12774c7bc1d..1bf1a2f28ab712f4a5b9e0e4cfe083584ffe480b 100644
--- a/src/callbackshandler.h
+++ b/src/callbackshandler.h
@@ -332,6 +332,21 @@ Q_SIGNALS:
      * @param code
      */
     void remoteRecordingChanged(const QString& callId, const QString& peerNumber, bool state);
+    void conversationLoaded(uint32_t requestId,
+                            const QString& accountId,
+                            const QString& conversationId,
+                            const VectorMapStringString& messages);
+    void messageReceived(const QString& accountId,
+                         const QString& conversationId,
+                         const MapStringString& message);
+    void conversationRequestReceived(const QString& accountId,
+                                     const QString& conversationId,
+                                     const MapStringString& metadatas);
+    void conversationReady(const QString& accountId, const QString& conversationId);
+    void conversationMemberEvent(const QString& accountId,
+                                 const QString& conversationId,
+                                 const QString& memberId,
+                                 int event);
 
 private Q_SLOTS:
     /**
@@ -491,7 +506,7 @@ private Q_SLOTS:
                                          const QString& to,
                                          int status);
 
-    void slotDataTransferEvent(qulonglong id, uint code);
+    void slotDataTransferEvent(const QString& accountId, const QString& conversationId, qulonglong id, uint code);
 
     /**
      * Emit knownDevicesChanged
@@ -626,6 +641,21 @@ private Q_SLOTS:
      * @param state, new state
      */
     void slotRemoteRecordingChanged(const QString& callId, const QString& contactId, bool state);
+    void slotConversationLoaded(uint32_t requestId,
+                                const QString& accountId,
+                                const QString& conversationId,
+                                const VectorMapStringString& messages);
+    void slotMessageReceived(const QString& accountId,
+                             const QString& conversationId,
+                             const MapStringString& message);
+    void slotConversationRequestReceived(const QString& accountId,
+                                         const QString& conversationId,
+                                         const MapStringString& metadatas);
+    void slotConversationReady(const QString& accountId, const QString& conversationId);
+    void slotConversationMemberEvent(const QString& accountId,
+                                     const QString& conversationId,
+                                     const QString& memberId,
+                                     int event);
 
 private:
     const api::Lrc& parent;
diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp
index b1c8117ac9e367f68d8f12dd0c75a76790c09581..928257c8ee0e5deccd61fb5da9ff263108927f70 100644
--- a/src/conversationmodel.cpp
+++ b/src/conversationmodel.cpp
@@ -313,6 +313,17 @@ public Q_SLOTS:
     void updateTransferStatus(long long dringId,
                               api::datatransfer::Info info,
                               interaction::Status newStatus);
+    void slotConversationLoaded(uint32_t requestId,
+                                const QString& accountId,
+                                const QString& conversationId,
+                                const VectorMapStringString& messages);
+    void slotMessageReceived(const QString& accountId,
+                             const QString& conversationId,
+                             const MapStringString& message);
+    void slotConversationRequestReceived(const QString& accountId,
+                                         const QString& conversationId,
+                                         const MapStringString& metadatas);
+    void slotConversationReady(const QString& accountId, const QString& conversationId);
 };
 
 ConversationModel::ConversationModel(const account::Info& owner,
@@ -811,7 +822,7 @@ ConversationModel::placeCall(const QString& uid)
 }
 
 void
-ConversationModel::sendMessage(const QString& uid, const QString& body)
+ConversationModel::sendMessage(const QString& uid, const QString& body, const QString& parentId)
 {
     try {
         auto& conversation = pimpl_->getConversationForUid(uid, true).get();
@@ -1255,6 +1266,29 @@ ConversationModel::clearUnreadInteractions(const QString& convId)
     }
 }
 
+uint32_t
+ConversationModel::loadConversationMessages(const QString& conversationId,
+                                            const int size)
+{
+    return -1;
+}
+
+void
+ConversationModel::acceptConversationRequest(const QString& conversationId)
+{}
+
+void
+ConversationModel::declineConversationRequest(const QString& conversationId)
+{}
+
+void
+ConversationModel::addConversationMember(const QString& conversationId, const QString& memberId)
+{}
+
+void
+ConversationModel::removeConversationMember(const QString& conversationId, const QString& memberId)
+{}
+
 ConversationModelPimpl::ConversationModelPimpl(const ConversationModel& linked,
                                                Lrc& lrc,
                                                Database& db,
@@ -1372,6 +1406,23 @@ ConversationModelPimpl::ConversationModelPimpl(const ConversationModel& linked,
             &CallbacksHandler::transferStatusUnjoinable,
             this,
             &ConversationModelPimpl::slotTransferStatusUnjoinable);
+    // swarm conversations
+    connect(&callbacksHandler,
+            &CallbacksHandler::conversationLoaded,
+            this,
+            &ConversationModelPimpl::slotConversationLoaded);
+    connect(&callbacksHandler,
+            &CallbacksHandler::messageReceived,
+            this,
+            &ConversationModelPimpl::slotMessageReceived);
+    connect(&callbacksHandler,
+            &CallbacksHandler::conversationRequestReceived,
+            this,
+            &ConversationModelPimpl::slotConversationRequestReceived);
+    connect(&callbacksHandler,
+            &CallbacksHandler::conversationReady,
+            this,
+            &ConversationModelPimpl::slotConversationReady);
 }
 
 ConversationModelPimpl::~ConversationModelPimpl()
@@ -1475,6 +1526,23 @@ ConversationModelPimpl::~ConversationModelPimpl()
                &CallbacksHandler::transferStatusUnjoinable,
                this,
                &ConversationModelPimpl::slotTransferStatusUnjoinable);
+    // swarm conversations
+    disconnect(&callbacksHandler,
+               &CallbacksHandler::conversationLoaded,
+               this,
+               &ConversationModelPimpl::slotConversationLoaded);
+    disconnect(&callbacksHandler,
+               &CallbacksHandler::messageReceived,
+               this,
+               &ConversationModelPimpl::slotMessageReceived);
+    disconnect(&callbacksHandler,
+               &CallbacksHandler::conversationRequestReceived,
+               this,
+               &ConversationModelPimpl::slotConversationRequestReceived);
+    disconnect(&callbacksHandler,
+               &CallbacksHandler::conversationReady,
+               this,
+               &ConversationModelPimpl::slotConversationReady);
 }
 
 void
@@ -1670,6 +1738,29 @@ ConversationModelPimpl::sendContactRequest(const QString& contactUri)
     if (isNotUsed)
         linked.owner.contactModel->addContact(contact);
 }
+void
+ConversationModelPimpl::slotConversationLoaded(uint32_t requestId,
+                                               const QString& accountId,
+                                               const QString& conversationId,
+                                               const VectorMapStringString& messages)
+{}
+
+void
+ConversationModelPimpl::slotMessageReceived(const QString& accountId,
+                                            const QString& conversationId,
+                                            const MapStringString& message)
+{}
+
+void
+ConversationModelPimpl::slotConversationRequestReceived(const QString& accountId,
+                                                        const QString& conversationId,
+                                                        const MapStringString& metadatas)
+{}
+
+void
+ConversationModelPimpl::slotConversationReady(const QString& accountId,
+                                              const QString& conversationId)
+{}
 
 void
 ConversationModelPimpl::slotContactAdded(const QString& contactUri)
@@ -2342,7 +2433,7 @@ void
 ConversationModel::acceptTransfer(const QString& convUid, uint64_t interactionId)
 {
     lrc::api::datatransfer::Info info = {};
-    getTransferInfo(interactionId, info);
+    getTransferInfo(convUid, interactionId, info);
     acceptTransfer(convUid, interactionId, info.displayName);
 }
 
@@ -2379,7 +2470,7 @@ ConversationModel::cancelTransfer(const QString& convUid, uint64_t interactionId
     }
     if (emitUpdated) {
         // Forward cancel action to daemon (will invoke slotTransferStatusCanceled)
-        pimpl_->lrc.getDataTransferModel().cancel(interactionId);
+        pimpl_->lrc.getDataTransferModel().cancel(owner.id, convUid, interactionId);
         pimpl_->invalidateModel();
         emit interactionStatusUpdated(convUid, interactionId, itCopy);
         emit pimpl_->behaviorController.newReadInteraction(owner.id, convUid, interactionId);
@@ -2387,11 +2478,11 @@ ConversationModel::cancelTransfer(const QString& convUid, uint64_t interactionId
 }
 
 void
-ConversationModel::getTransferInfo(uint64_t interactionId, datatransfer::Info& info)
+ConversationModel::getTransferInfo(const QString& conversationId, uint64_t interactionId, datatransfer::Info& info)
 {
     try {
         auto dringId = pimpl_->lrc.getDataTransferModel().getDringIdFromInteractionId(interactionId);
-        pimpl_->lrc.getDataTransferModel().transferInfo(dringId, info);
+        pimpl_->lrc.getDataTransferModel().transferInfo(owner.id, conversationId, dringId, info);
     } catch (...) {
         info.status = datatransfer::Status::INVALID;
     }
@@ -2550,7 +2641,9 @@ ConversationModelPimpl::acceptTransfer(const QString& convUid,
     QDir dir = QFileInfo(destinationDir + path).absoluteDir();
     if (!dir.exists())
         dir.mkpath(".");
-    auto acceptedFilePath = lrc.getDataTransferModel().accept(interactionId,
+    auto acceptedFilePath = lrc.getDataTransferModel().accept(linked.owner.id,
+                                                              convUid,
+                                                              interactionId,
                                                               destinationDir + path,
                                                               0);
     storage::updateInteractionBody(db, interactionId, acceptedFilePath);
diff --git a/src/datatransfermodel.cpp b/src/datatransfermodel.cpp
index 16a2f56cc2d2ef3cdd58ef7587cb3055cc4251ed..a5cb4ac515fbde97b2c742636f06771ebc6a544e 100644
--- a/src/datatransfermodel.cpp
+++ b/src/datatransfermodel.cpp
@@ -128,10 +128,10 @@ DataTransferModel::DataTransferModel()
 DataTransferModel::~DataTransferModel() = default;
 
 void
-DataTransferModel::transferInfo(long long ringId, datatransfer::Info& lrc_info)
+DataTransferModel::transferInfo(const QString& accountId, const QString& conversationId, long long ringId, datatransfer::Info& lrc_info)
 {
     DataTransferInfo infoFromDaemon;
-    if (ConfigurationManager::instance().dataTransferInfo(ringId, infoFromDaemon) == 0) {
+    if (ConfigurationManager::instance().dataTransferInfo(accountId, conversationId, ringId, infoFromDaemon) == 0) {
         // lrc_info.uid = ?
         lrc_info.status = convertDataTransferEvent(
             DRing::DataTransferEventCode(infoFromDaemon.lastEvent));
@@ -174,32 +174,32 @@ DataTransferModel::sendFile(const QString& account_id,
 }
 
 void
-DataTransferModel::bytesProgress(int interactionId, int64_t& total, int64_t& progress)
+DataTransferModel::bytesProgress(const QString& accountId, const QString& conversationId, int interactionId, int64_t& total, int64_t& progress)
 {
     ConfigurationManager::instance()
 #ifdef ENABLE_LIBWRAP
-        .dataTransferBytesProgress(pimpl_->lrc2dringIdMap.at(interactionId), total, progress);
+        .dataTransferBytesProgress(accountId, conversationId, pimpl_->lrc2dringIdMap.at(interactionId), total, progress);
 #else
-        .dataTransferBytesProgress(pimpl_->lrc2dringIdMap.at(interactionId),
+        .dataTransferBytesProgress(accountId, conversationId, pimpl_->lrc2dringIdMap.at(interactionId),
                                    reinterpret_cast<qlonglong&>(total),
                                    reinterpret_cast<qlonglong&>(progress));
 #endif
 }
 
 QString
-DataTransferModel::accept(int interactionId, const QString& file_path, std::size_t offset)
+DataTransferModel::accept(const QString& accountId, const QString& conversationId, int interactionId, const QString& file_path, std::size_t offset)
 {
     auto unique_file_path = pimpl_->getUniqueFilePath(file_path);
     auto dring_id = pimpl_->lrc2dringIdMap.at(interactionId);
-    ConfigurationManager::instance().acceptFileTransfer(dring_id, unique_file_path, offset);
+    ConfigurationManager::instance().acceptFileTransfer(accountId, conversationId, dring_id, unique_file_path, offset);
     return unique_file_path;
 }
 
 void
-DataTransferModel::cancel(int interactionId)
+DataTransferModel::cancel(const QString& accountId, const QString& conversationId, int interactionId)
 {
     auto dring_id = pimpl_->lrc2dringIdMap.at(interactionId);
-    ConfigurationManager::instance().cancelDataTransfer(dring_id);
+    ConfigurationManager::instance().cancelDataTransfer(accountId, conversationId, dring_id);
 }
 
 int
diff --git a/src/qtwrapper/configurationmanager_wrap.h b/src/qtwrapper/configurationmanager_wrap.h
index ef1f3f13fd00d8fbf57a811823ecbf0551109650..8c1bb9d8e9c20e9757adf369fa76d55f74d16a8d 100644
--- a/src/qtwrapper/configurationmanager_wrap.h
+++ b/src/qtwrapper/configurationmanager_wrap.h
@@ -32,6 +32,7 @@
 #include <configurationmanager_interface.h>
 #include <datatransfer_interface.h>
 #include <account_const.h>
+#include <conversation_interface.h>
 
 #include "typedefs.h"
 #include "conversions_wrap.hpp"
@@ -46,6 +47,7 @@ class ConfigurationManagerInterface : public QObject
 public:
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> dataXferHandlers;
+    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> conversationsHandlers;
 
     ConfigurationManagerInterface()
     {
@@ -54,6 +56,7 @@ public:
         using DRing::ConfigurationSignal;
         using DRing::AudioSignal;
         using DRing::DataTransferSignal;
+        using DRing::ConversationSignal;
 
         setObjectName("ConfigurationManagerInterface");
         confHandlers = {
@@ -224,7 +227,10 @@ public:
                     Q_EMIT this->messageSend(QString(message.c_str()));
                 }),
             exportable_callback<ConfigurationSignal::ComposingStatusChanged>(
-                [this](const std::string& account_id, const std::string& from, int status) {
+                [this](const std::string& account_id,
+                       const std::string& convId,
+                       const std::string& from,
+                       int status) {
                     Q_EMIT this->composingStatusChanged(QString(account_id.c_str()),
                                                         QString(from.c_str()),
                                                         status > 0 ? true : false);
@@ -243,10 +249,50 @@ public:
 
         dataXferHandlers = {
             exportable_callback<DataTransferSignal::DataTransferEvent>(
-                [this](const uint64_t& transfer_id, const uint32_t& code) {
-                    Q_EMIT this->dataTransferEvent(transfer_id, code);
+                [this]( const std::string& accountId, const std::string& conversationId, const uint64_t& transfer_id, const uint32_t& code) {
+                    Q_EMIT this->dataTransferEvent(QString(accountId.c_str()),QString(conversationId.c_str()),transfer_id, code);
                 }),
         };
+        conversationsHandlers
+            = {exportable_callback<ConversationSignal::ConversationLoaded>(
+                   [this](uint32_t id,
+                          const std::string& accountId,
+                          const std::string& conversationId,
+                          const std::vector<std::map<std::string, std::string>>& messages) {
+                       Q_EMIT conversationLoaded(id,
+                                                 QString(accountId.c_str()),
+                                                 QString(conversationId.c_str()),
+                                                 convertVecMap(messages));
+                   }),
+               exportable_callback<ConversationSignal::MessageReceived>(
+                   [this](const std::string& accountId,
+                          const std::string& conversationId,
+                          const std::map<std::string, std::string>& message) {
+                       Q_EMIT messageReceived(QString(accountId.c_str()),
+                                              QString(conversationId.c_str()),
+                                              convertMap(message));
+                   }),
+               exportable_callback<ConversationSignal::ConversationRequestReceived>(
+                   [this](const std::string& accountId,
+                          const std::string& conversationId,
+                          const std::map<std::string, std::string>& metadata) {
+                       Q_EMIT conversationRequestReceived(QString(accountId.c_str()),
+                                                          QString(conversationId.c_str()),
+                                                          convertMap(metadata));
+                   }),
+                exportable_callback<ConversationSignal::ConversationReady>(
+                    [this](const std::string& accountId, const std::string& conversationId) {
+                    Q_EMIT conversationReady(QString(accountId.c_str()),
+                                             QString(conversationId.c_str()));
+                }),
+                exportable_callback<ConversationSignal::ConversationMemberEvent>(
+                    [this](const std::string& accountId, const std::string& conversationId, const std::string& memberId, int event) {
+                    Q_EMIT conversationMemberEvent(QString(accountId.c_str()),
+                                                   QString(conversationId.c_str()),
+                                                   QString(memberId.c_str()),
+                                                   event);
+                })
+            };
     }
 
     ~ConfigurationManagerInterface() {}
@@ -727,8 +773,6 @@ public Q_SLOTS: // METHODS
         return convertMap(DRing::getContactDetails(accountID.toStdString(), uri.toStdString()));
     }
 
-    VectorULongLong dataTransferList() { return convertVectorULongLong(DRing::dataTransferList()); }
-
     uint32_t sendFile(const DataTransferInfo& lrc_info, DRing::DataTransferId& id)
     {
         DRing::DataTransferInfo dring_info;
@@ -744,10 +788,10 @@ public Q_SLOTS: // METHODS
         return uint32_t(DRing::sendFile(dring_info, id));
     }
 
-    uint32_t dataTransferInfo(uint64_t transfer_id, DataTransferInfo& lrc_info)
+    uint32_t dataTransferInfo(QString accountId, QString conversationId, const DRing::DataTransferId& transfer_id, DataTransferInfo& lrc_info)
     {
         DRing::DataTransferInfo dring_info;
-        auto error = uint32_t(DRing::dataTransferInfo(transfer_id, dring_info));
+        auto error = uint32_t(DRing::dataTransferInfo(accountId.toStdString(), conversationId.toStdString(), transfer_id, dring_info));
         lrc_info.accountId = QString::fromStdString(dring_info.accountId);
         lrc_info.lastEvent = quint32(dring_info.lastEvent);
         lrc_info.flags = dring_info.flags;
@@ -760,19 +804,19 @@ public Q_SLOTS: // METHODS
         return error;
     }
 
-    uint64_t dataTransferBytesProgress(uint64_t transfer_id, int64_t& total, int64_t& progress)
+    uint64_t dataTransferBytesProgress(QString accountId, QString conversationId, const DRing::DataTransferId& transfer_id, int64_t& total, int64_t& progress)
     {
-        return uint32_t(DRing::dataTransferBytesProgress(transfer_id, total, progress));
+        return uint32_t(DRing::dataTransferBytesProgress(accountId.toStdString(), conversationId.toStdString(), transfer_id, total, progress));
     }
 
-    uint32_t acceptFileTransfer(uint64_t transfer_id, const QString& file_path, int64_t offset)
+    uint32_t acceptFileTransfer(QString accountId, QString conversationId, const DRing::DataTransferId& transfer_id, const QString& file_path, int64_t offset)
     {
-        return uint32_t(DRing::acceptFileTransfer(transfer_id, file_path.toStdString(), offset));
+        return uint32_t(DRing::acceptFileTransfer(accountId.toStdString(), conversationId.toStdString(), transfer_id, file_path.toStdString(), offset));
     }
 
-    uint32_t cancelDataTransfer(int64_t transfer_id)
+    uint32_t cancelDataTransfer(QString accountId, QString conversationId, const DRing::DataTransferId& transfer_id)
     {
-        return uint32_t(DRing::cancelDataTransfer(transfer_id));
+        return uint32_t(DRing::cancelDataTransfer(accountId.toStdString(), conversationId.toStdString(), transfer_id));
     }
 
     void enableProxyClient(const QString& accountID, bool enable)
@@ -810,6 +854,77 @@ public Q_SLOTS: // METHODS
     {
         return DRing::searchUser(accountId.toStdString(), query.toStdString());
     }
+    //swarm
+    QString startConversation(const QString& accountId)
+    {
+        auto convId = DRing::startConversation(accountId.toStdString());
+        return QString(convId.c_str());
+    }
+    void acceptConversationRequest(const QString& accountId, const QString& conversationId)
+    {
+        DRing::acceptConversationRequest(accountId.toStdString(), conversationId.toStdString());
+    }
+    void declineConversationRequest(const QString& accountId, const QString& conversationId)
+    {
+        DRing::declineConversationRequest(accountId.toStdString(), conversationId.toStdString());
+    }
+    bool removeConversation(const QString& accountId, const QString& conversationId)
+    {
+        return DRing::removeConversation(accountId.toStdString(), conversationId.toStdString());
+    }
+    VectorString getConversations(const QString& accountId)
+    {
+        auto conversations = DRing::getConversations(accountId.toStdString());
+        return convertVectorString(conversations);
+    }
+    VectorMapStringString getConversationRequests(const QString& accountId)
+    {
+        auto requests = DRing::getConversationRequests(accountId.toStdString());
+        return convertVecMap(requests);
+    }
+    void addConversationMember(const QString& accountId,
+                               const QString& conversationId,
+                               const QString& memberId)
+    {
+        DRing::addConversationMember(accountId.toStdString(),
+                                     conversationId.toStdString(),
+                                     memberId.toStdString());
+    }
+    void removeConversationMember(const QString& accountId,
+                                  const QString& conversationId,
+                                  const QString& memberId)
+    {
+        DRing::removeConversationMember(accountId.toStdString(),
+                                        conversationId.toStdString(),
+                                        memberId.toStdString());
+    }
+    VectorMapStringString getConversationMembers(const QString& accountId,
+                                                 const QString& conversationId)
+    {
+        auto members = DRing::getConversationMembers(accountId.toStdString(),
+                                                     conversationId.toStdString());
+        return convertVecMap(members);
+    }
+    void sendMessage(const QString& accountId,
+                     const QString& conversationId,
+                     const QString& message,
+                     const QString& parrent)
+    {
+        DRing::sendMessage(accountId.toStdString(),
+                           conversationId.toStdString(),
+                           message.toStdString(),
+                           parrent.toStdString());
+    }
+    uint32_t loadConversationMessages(const QString& accountId,
+                                      const QString& conversationId,
+                                      const QString& fromId,
+                                      const int size)
+    {
+        return DRing::loadConversationMessages(accountId.toStdString(),
+                                               conversationId.toStdString(),
+                                               fromId.toStdString(),
+                                               size);
+    }
 
     void setDefaultModerator(const QString& accountID, const QString& peerURI, const bool& state)
     {
@@ -886,7 +1001,7 @@ Q_SIGNALS: // SIGNALS
     void contactAdded(const QString& accountID, const QString& uri, bool banned);
     void contactRemoved(const QString& accountID, const QString& uri, bool banned);
     void profileReceived(const QString& accountID, const QString& peer, const QString& vCard);
-    void dataTransferEvent(qulonglong transfer_id, uint code);
+    void dataTransferEvent(const QString& accountId, const QString& conversationId, qulonglong transfer_id, uint code);
     void deviceRevocationEnded(const QString& accountId, const QString& deviceId, int status);
     void accountProfileReceived(const QString& accountId,
                                 const QString& displayName,
@@ -899,6 +1014,22 @@ Q_SIGNALS: // SIGNALS
                          int status,
                          const QString& query,
                          VectorMapStringString results);
+    //swarm
+    void conversationLoaded(uint32_t requestId,
+                            const QString& accountId,
+                            const QString& conversationId,
+                            const VectorMapStringString& messages);
+    void messageReceived(const QString& accountId,
+                         const QString& conversationId,
+                         const MapStringString& message);
+    void conversationRequestReceived(const QString& accountId,
+                                     const QString& conversationId,
+                                     const MapStringString& metadatas);
+    void conversationReady(const QString& accountId, const QString& conversationId);
+    void conversationMemberEvent(const QString& accountId,
+                                 const QString& conversationId,
+                                 const QString& memberId,
+                                 int event);
 };
 
 namespace org {
diff --git a/src/qtwrapper/instancemanager.cpp b/src/qtwrapper/instancemanager.cpp
index a5aabdb8f5b01a813df0ea73604d474802bd51d5..6df98d353daa455a69539a0bc993b24755e2acf4 100644
--- a/src/qtwrapper/instancemanager.cpp
+++ b/src/qtwrapper/instancemanager.cpp
@@ -37,6 +37,7 @@ InstanceManagerInterface::InstanceManagerInterface(bool muteDring)
     using DRing::ConfigurationSignal;
     using DRing::PresenceSignal;
     using DRing::DataTransferSignal;
+    using DRing::ConversationSignal;
 
 #ifdef ENABLE_VIDEO
     using DRing::VideoSignal;
@@ -58,6 +59,7 @@ InstanceManagerInterface::InstanceManagerInterface(bool muteDring)
 #ifdef ENABLE_VIDEO
     registerSignalHandlers(VideoManager::instance().videoHandlers);
 #endif
+    registerSignalHandlers(ConfigurationManager::instance().conversationsHandlers);
 
     if (!DRing::start())
         printf("Error initializing daemon\n");