diff --git a/src/ringdht/ringaccount.cpp b/src/ringdht/ringaccount.cpp
index 3078023f00847c7eacc4ec1158c793730d8d02ff..37cb52061c0585ca390ccbcba5226776ddfea4ba 100644
--- a/src/ringdht/ringaccount.cpp
+++ b/src/ringdht/ringaccount.cpp
@@ -531,6 +531,14 @@ std::map<std::string, std::string> RingAccount::getAccountDetails() const
     return a;
 }
 
+std::map<std::string, std::string>
+RingAccount::getVolatileAccountDetails() const
+{
+    auto a = SIPAccountBase::getVolatileAccountDetails();
+    a.emplace(DRing::Account::VolatileProperties::InstantMessaging::OFF_CALL, TRUE_STR);
+    return a;
+}
+
 void
 RingAccount::handleEvents()
 {
@@ -865,6 +873,18 @@ RingAccount::doRegister_()
                 return true;
             }
         );
+
+        dht_.listen<dht::ImMessage>(
+            inboxKey,
+            [shared](dht::ImMessage&& v) {
+                auto& this_ = *shared.get();
+                auto from = v.from.toString();
+                auto msg = v.im_message;
+                RING_DBG("Text message received from DHT ! %s -> %s",  from.c_str(), msg.c_str());
+                emitSignal<DRing::ConfigurationSignal::IncomingAccountMessage>(this_.getAccountID(), from, msg);
+                return true;
+            }
+        );
     }
     catch (const std::exception& e) {
         RING_ERR("Error registering DHT account: %s", e.what());
@@ -1191,7 +1211,6 @@ RingAccount::getTrustRequests() const
     return ret;
 }
 
-
 bool
 RingAccount::acceptTrustRequest(const std::string& from)
 {
@@ -1251,4 +1270,12 @@ RingAccount::connectivityChanged()
         dht_.connectivityChanged();
 }
 
+void
+RingAccount::sendTextMessage(const std::string& to, const std::string& message)
+{
+    dht_.putEncrypted(dht::InfoHash::get("inbox:"+to),
+                      dht::InfoHash(to),
+                      dht::ImMessage(std::string(message)));
+}
+
 } // namespace ring
diff --git a/src/ringdht/ringaccount.h b/src/ringdht/ringaccount.h
index 226dae8a89e5fa555dfd963e81f03fa364bdeb99..8a9e9efd59cf40609e3c47ba482b17e68b5c3133 100644
--- a/src/ringdht/ringaccount.h
+++ b/src/ringdht/ringaccount.h
@@ -107,6 +107,12 @@ class RingAccount : public SIPAccountBase {
          */
         virtual std::map<std::string, std::string> getAccountDetails() const;
 
+        /**
+         * Retrieve volatile details such as recent registration errors
+         * @return std::map< std::string, std::string > The account volatile details
+         */
+        virtual std::map<std::string, std::string> getVolatileAccountDetails() const override;
+
         /**
          * Actually useless, since config loading is done in init()
          */
@@ -249,6 +255,7 @@ class RingAccount : public SIPAccountBase {
         bool discardTrustRequest(const std::string& from);
 
         void sendTrustRequest(const std::string& to, const std::vector<uint8_t>& payload);
+        virtual void sendTextMessage(const std::string& /* to */, const std::string& /* message */) override;
 
         void connectivityChanged();