diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp
index 074eeada755daf5b69a86e3adb9ccc4d075b56ed..887dece4cf24ddb66c19f0d36d6f59114d23cb84 100644
--- a/src/jamidht/jamiaccount.cpp
+++ b/src/jamidht/jamiaccount.cpp
@@ -2013,6 +2013,17 @@ JamiAccount::doRegister_()
     }
 }
 
+void
+JamiAccount::onTextMessage(const std::string& from,
+                              const std::map<std::string, std::string>& payloads)
+{
+    try {
+        const std::string fromUri = parseJamiUri(from);
+        SIPAccountBase::onTextMessage(fromUri, payloads);
+    } catch (...) {
+    }
+}
+
 void
 JamiAccount::incomingCall(dht::IceCandidates&& msg, const std::shared_ptr<dht::crypto::Certificate>& from_cert, const dht::InfoHash& from)
 {
diff --git a/src/jamidht/jamiaccount.h b/src/jamidht/jamiaccount.h
index 60ff268281d6b800036c945abc47dd9f6977d8b1..83287bfa329721537e867bda1dfe2b477d16e295 100644
--- a/src/jamidht/jamiaccount.h
+++ b/src/jamidht/jamiaccount.h
@@ -268,9 +268,11 @@ public:
      *      The type of this instance is given in template argument.
      *      This type can be any base class of SIPCall class (included).
      */
-    virtual std::shared_ptr<SIPCall>
+    std::shared_ptr<SIPCall>
     newIncomingCall(const std::string& from, const std::map<std::string, std::string>& details = {}, const std::shared_ptr<SipTransport>& sipTr = nullptr) override;
 
+    void onTextMessage(const std::string& from, const std::map<std::string, std::string>& payloads) override;
+
     virtual bool isTlsEnabled() const override {
         return true;
     }
diff --git a/src/sip/sipaccountbase.cpp b/src/sip/sipaccountbase.cpp
index b5cd863e370ae9f4d88996d65216397d95e88b8c..9b9bf866780e1853884b55c324bba53485ebfe6a 100644
--- a/src/sip/sipaccountbase.cpp
+++ b/src/sip/sipaccountbase.cpp
@@ -420,7 +420,7 @@ SIPAccountBase::onTextMessage(const std::string& from,
     message.payloads = payloads;
     message.received = std::time(nullptr);
     std::lock_guard<std::mutex> lck(mutexLastMessages_);
-    lastMessages_.emplace_back(message);
+    lastMessages_.emplace_back(std::move(message));
     while (lastMessages_.size() > MAX_WAITING_MESSAGES_SIZE) {
         lastMessages_.pop_front();
     }
diff --git a/src/sip/sipaccountbase.h b/src/sip/sipaccountbase.h
index aebe3ac5fb1a0974adfff37fe39158c7324a18b6..1ea26cca066dc89ab6818ee52dddbb167e7a8b91 100644
--- a/src/sip/sipaccountbase.h
+++ b/src/sip/sipaccountbase.h
@@ -275,7 +275,7 @@ public:
         return messageEngine_.cancel(id);
     }
 
-    void onTextMessage(const std::string& from, const std::map<std::string, std::string>& payloads);
+    virtual void onTextMessage(const std::string& from, const std::map<std::string, std::string>& payloads);
 
     /* Returns true if the username and/or hostname match this account */
     virtual MatchRank matches(const std::string &username, const std::string &hostname) const = 0;