diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp
index 176b60f5251e81b906abcf8f0fdea54e0d306687..c6cbce985e0f2095b7b8ec1d5f377e3e571c6dd5 100644
--- a/src/jamidht/conversation.cpp
+++ b/src/jamidht/conversation.cpp
@@ -29,6 +29,12 @@
 #include <opendht/thread_pool.h>
 #include <tuple>
 
+#ifdef ENABLE_PLUGIN
+#include "manager.h"
+#include "plugin/jamipluginmanager.h"
+#include "plugin/streamdata.h"
+#endif
+
 namespace jami {
 
 ConvInfo::ConvInfo(const Json::Value& json)
@@ -196,6 +202,19 @@ public:
                                 shared->getAccountID(), convId, uri, action);
                     }
                 }
+#ifdef ENABLE_PLUGIN
+                auto& pluginChatManager
+                    = jami::Manager::instance().getJamiPluginManager().getChatServicesManager();
+                std::shared_ptr<JamiMessage> cm
+                    = std::make_shared<JamiMessage>(shared->getAccountID(),
+                                                    convId,
+                                                    c.at("author") != shared->getUsername(),
+                                                    const_cast<std::map<std::string, std::string>&>(
+                                                        c),
+                                                    false);
+                cm->isSwarm = true;
+                pluginChatManager.publishMessage(cm);
+#endif
                 // announce message
                 emitSignal<DRing::ConversationSignal::MessageReceived>(shared->getAccountID(),
                                                                        convId,
@@ -244,6 +263,7 @@ Conversation::Impl::repoPath() const
 std::vector<std::map<std::string, std::string>>
 Conversation::Impl::convCommitToMap(const std::vector<ConversationCommit>& commits) const
 {
+    auto shared = account_.lock();
     std::vector<std::map<std::string, std::string>> result = {};
     for (const auto& commit : commits) {
         auto authorDevice = commit.author.email;
@@ -309,6 +329,19 @@ Conversation::Impl::convCommitToMap(const std::vector<ConversationCommit>& commi
         message["type"] = type;
         message["timestamp"] = std::to_string(commit.timestamp);
         result.emplace_back(message);
+#ifdef ENABLE_PLUGIN
+        auto& pluginChatManager
+            = jami::Manager::instance().getJamiPluginManager().getChatServicesManager();
+        std::shared_ptr<JamiMessage> cm
+            = std::make_shared<JamiMessage>(shared->getAccountID(),
+                                            repository_->id(),
+                                            authorId != shared->getUsername(),
+                                            const_cast<std::map<std::string, std::string>&>(message),
+                                            false);
+        cm->isSwarm = true;
+        cm->fromHistory = true;
+        pluginChatManager.publishMessage(cm);
+#endif
     }
     return result;
 }
diff --git a/src/plugin/chatservicesmanager.cpp b/src/plugin/chatservicesmanager.cpp
index 104947e23991d730f138196d0c71b3f82ca5106e..6d8b48ed435e031da46831f5ccdbb15612c97886 100644
--- a/src/plugin/chatservicesmanager.cpp
+++ b/src/plugin/chatservicesmanager.cpp
@@ -20,6 +20,7 @@
 #include "pluginmanager.h"
 #include "logger.h"
 #include "manager.h"
+#include "jamidht/jamiaccount.h"
 #include "fileutils.h"
 
 namespace jami {
@@ -90,7 +91,20 @@ ChatServicesManager::registerChatService(PluginManager& pluginManager)
     // sendTextMessage is a service that allows plugins to send a message in a conversation.
     auto sendTextMessage = [](const DLPlugin*, void* data) {
         auto cm = static_cast<JamiMessage*>(data);
-        jami::Manager::instance().sendTextMessage(cm->accountId, cm->peerId, cm->data, true);
+        if (const auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(
+                cm->accountId)) {
+            try {
+                if (cm->isSwarm)
+                    acc->sendMessage(cm->peerId, cm->data.at("body"));
+                else
+                    jami::Manager::instance().sendTextMessage(cm->accountId,
+                                                              cm->peerId,
+                                                              cm->data,
+                                                              true);
+            } catch (const std::exception& e) {
+                JAMI_ERR("Exception during text message sending: %s", e.what());
+            }
+        }
         return 0;
     };
 
diff --git a/src/plugin/streamdata.h b/src/plugin/streamdata.h
index 8e33f63913bb0055ee8c023002d2f3eb81fb1aef..e8a49f4bef4a532d42a5d17da985ce261b3cfd0d 100644
--- a/src/plugin/streamdata.h
+++ b/src/plugin/streamdata.h
@@ -88,4 +88,6 @@ struct JamiMessage
     std::map<std::string, std::string> data;
     // True if message is originated from Plugin code.
     bool fromPlugin;
+    bool isSwarm {false};
+    bool fromHistory {false};
 };
\ No newline at end of file