diff --git a/bin/dbus/configurationmanager-introspec.xml b/bin/dbus/configurationmanager-introspec.xml
index 50f4a6108b4180bc5d388df8d0df4e51f6dcf28e..d06a812a1afbeec61c2d7d5f56792312bc0b2233 100644
--- a/bin/dbus/configurationmanager-introspec.xml
+++ b/bin/dbus/configurationmanager-introspec.xml
@@ -272,22 +272,23 @@
           <arg type="a{ss}" name="payloads" direction="in"/>
           <arg type="t" name="id" direction="out">
              <tp:docstring>
-               The message ID.
+               The message ID. An ID of 0 means that the message was not sent,
+               likely because one of the parameters was invalid.
              </tp:docstring>
           </arg>
        </method>
 
-      <method name="getMessageStatus" tp:name-for-bindings="getMessageStatus">
+       <method name="getMessageStatus" tp:name-for-bindings="getMessageStatus">
           <arg type="t" name="id" direction="in"/>
-          <arg type="s" name="status" direction="out">
+          <arg type="i" name="status" direction="out">
              <tp:docstring>
                The message status.
                 <ul>
-                    <li>UNKNOWN:    unknown message or message status</li>
-                    <li>SENDING:    message is being sent or waiting for peer confirmation.</li>
-                    <li>SENT:       message have been received from the other end.</li>
-                    <li>READ:       message have been read by the peer.</li>
-                    <li>FAILURE:    the message coudn't be delivered.</li>
+                    <li>UNKNOWN = 0    unknown message or message status</li>
+                    <li>SENDING = 1    message is being sent or waiting for peer confirmation.</li>
+                    <li>SENT = 2      message have been received from the other end.</li>
+                    <li>READ = 3       message have been read by the peer.</li>
+                    <li>FAILURE = 4    the message coudn't be delivered.</li>
                 </ul>
              </tp:docstring>
           </arg>
@@ -304,17 +305,17 @@
           <arg type="a{ss}" name="payloads"/>
        </signal>
 
-       <signal name="accountMessageStatus" tp:name-for-bindings="accountMessageStatus">
+       <signal name="accountMessageStatusChanged" tp:name-for-bindings="accountMessageStatusChanged">
            <tp:added version="2.3.0"/>
            <tp:docstring>
                Notify clients that a sent text message status have changed
            </tp:docstring>
+           <arg type="s" name="accountID"/>
            <arg type="t" name="id"/>
-           <arg type="s" name="status">
+           <arg type="s" name="to"/>
+           <arg type="i" name="status">
               <tp:docstring>The new status of the message, see getMessageStatus for possible values.</tp:docstring>
            </arg>
-           <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/>
-          <arg type="a{ss}" name="payloads"/>
        </signal>
 
        <method name="setVolume" tp:name-for-bindings="setVolume">
diff --git a/bin/dbus/dbusconfigurationmanager.h b/bin/dbus/dbusconfigurationmanager.h
index e40eaf20872b8d97dae6fe1f7f81f94d84b1a0f7..a3c8c08b3dff52067046658aed2ccc0aecdb41fa 100644
--- a/bin/dbus/dbusconfigurationmanager.h
+++ b/bin/dbus/dbusconfigurationmanager.h
@@ -67,7 +67,7 @@ class DBusConfigurationManager :
         void sendRegister(const std::string& accoundID, const bool& enable);
         void registerAllAccounts(void);
         uint64_t sendTextMessage(const std::string& accoundID, const std::string& to, const std::map<std::string, std::string>& payloads);
-        std::string getMessageStatus(const uint64_t& id);
+        int getMessageStatus(const uint64_t& id);
         std::map<std::string, std::string> getTlsDefaultSettings();
         std::vector<std::string> getSupportedCiphers(const std::string& accountID);
         std::vector<unsigned> getCodecList();
diff --git a/src/client/configurationmanager.cpp b/src/client/configurationmanager.cpp
index e4737e65297d42fed5b8b1eef1d87cac2ac0d3f4..52b5da537fb28fdf8a1793e40d2a729899747e5d 100644
--- a/src/client/configurationmanager.cpp
+++ b/src/client/configurationmanager.cpp
@@ -283,7 +283,7 @@ sendAccountTextMessage(const std::string& accountID, const std::string& to, cons
     return ring::Manager::instance().sendTextMessage(accountID, to, payloads);
 }
 
-std::string
+int
 getMessageStatus(uint64_t id)
 {
     return ring::Manager::instance().getMessageStatus(id);
diff --git a/src/client/ring_signal.cpp b/src/client/ring_signal.cpp
index 214a7d5e63919ea2104fec519bfd71e7fd2f6849..d8f91e9dce638abdc473b42e63301b88a98347e4 100644
--- a/src/client/ring_signal.cpp
+++ b/src/client/ring_signal.cpp
@@ -65,7 +65,7 @@ getSignalHandlers()
         exported_callback<DRing::ConfigurationSignal::CertificateExpired>(),
         exported_callback<DRing::ConfigurationSignal::CertificateStateChanged>(),
         exported_callback<DRing::ConfigurationSignal::IncomingAccountMessage>(),
-        exported_callback<DRing::ConfigurationSignal::AccountMessageStatus>(),
+        exported_callback<DRing::ConfigurationSignal::AccountMessageStatusChanged>(),
         exported_callback<DRing::ConfigurationSignal::IncomingTrustRequest>(),
         exported_callback<DRing::ConfigurationSignal::MediaParametersChanged>(),
         exported_callback<DRing::ConfigurationSignal::Error>(),
diff --git a/src/dring/account_const.h b/src/dring/account_const.h
index 2e0158ec40d98ba207d6f384280838917e69e791..3e3bd5daa0c790f24820cc1438e372c22c2578f9 100644
--- a/src/dring/account_const.h
+++ b/src/dring/account_const.h
@@ -58,15 +58,13 @@ constexpr static const char REQUEST_TIMEOUT           [] = "Request Timeout";
 
 } //namespace DRing::Account
 
-namespace MessageStates {
-
-constexpr static const char UNKNOWN                   [] = "UNKNOWN";
-constexpr static const char SENDING                   [] = "SENDING";
-constexpr static const char SENT                      [] = "SENT";
-constexpr static const char READ                      [] = "READ";
-constexpr static const char FAILURE                   [] = "FAILURE";
-
-} //namespace DRing::MessageStates
+enum class MessageStates : int {
+    UNKNOWN = 0,
+    SENDING,
+    SENT,
+    READ,
+    FAILURE
+}; //DRing::Account::MessageStates
 
 namespace VolatileProperties {
 
diff --git a/src/dring/configurationmanager_interface.h b/src/dring/configurationmanager_interface.h
index 56b3370be0153a9b552f2f3e5bbb6906dae533dc..de7aa4f093400d7a94737d14ced47cb89edcadf0 100644
--- a/src/dring/configurationmanager_interface.h
+++ b/src/dring/configurationmanager_interface.h
@@ -50,7 +50,7 @@ std::vector<std::string> getAccountList();
 void sendRegister(const std::string& accountID, bool enable);
 void registerAllAccounts(void);
 uint64_t sendAccountTextMessage(const std::string& accountID, const std::string& to, const std::map<std::string, std::string>& payloads);
-std::string getMessageStatus(uint64_t id);
+int getMessageStatus(uint64_t id);
 
 std::map<std::string, std::string> getTlsDefaultSettings();
 
@@ -195,9 +195,9 @@ struct ConfigurationSignal {
                 constexpr static const char* name = "IncomingAccountMessage";
                 using cb_type = void(const std::string& /*account_id*/, const std::string& /*from*/, const std::map<std::string, std::string>& /*payloads*/);
         };
-        struct AccountMessageStatus {
-                constexpr static const char* name = "AccountMessageStatus";
-                using cb_type = void(uint64_t /*message_id*/, const std::string& /*state*/);
+        struct AccountMessageStatusChanged {
+                constexpr static const char* name = "AccountMessageStatusChanged";
+                using cb_type = void(const std::string& /*account_id*/, uint64_t /*message_id*/, const std::string& /*to*/, int /*state*/);
         };
         struct IncomingTrustRequest {
                 constexpr static const char* name = "IncomingTrustRequest";
diff --git a/src/im/message_engine.cpp b/src/im/message_engine.cpp
index 1a8551c67b195bbe39369388d802d80c978dc8b8..e1edc894a99603b68f54e363a43ae9351ef51aef 100644
--- a/src/im/message_engine.cpp
+++ b/src/im/message_engine.cpp
@@ -125,7 +125,10 @@ MessageEngine::trySend(decltype(MessageEngine::messages_)::iterator m)
     m->second.status = MessageStatus::SENDING;
     m->second.retried++;
     m->second.last_op = clock::now();
-    emitSignal<DRing::ConfigurationSignal::AccountMessageStatus>(m->first, DRing::Account::MessageStates::SENDING);
+    emitSignal<DRing::ConfigurationSignal::AccountMessageStatusChanged>(account_.getAccountID(),
+                                                                 m->first,
+                                                                 m->second.to,
+                                                                 static_cast<int>(DRing::Account::MessageStates::SENDING));
     account_.sendTextMessage(m->second.to, m->second.payloads, m->first);
 }
 
@@ -139,10 +142,16 @@ MessageEngine::onMessageSent(MessageToken token, bool ok)
         if (f->second.status == MessageStatus::SENDING) {
             if (ok) {
                 f->second.status = MessageStatus::SENT;
-                emitSignal<DRing::ConfigurationSignal::AccountMessageStatus>(token, DRing::Account::MessageStates::SENT);
+                emitSignal<DRing::ConfigurationSignal::AccountMessageStatusChanged>(account_.getAccountID(),
+                                                                             token,
+                                                                             f->second.to,
+                                                                             static_cast<int>(DRing::Account::MessageStates::SENT));
             } else if (f->second.retried == MAX_RETRIES) {
                 f->second.status = MessageStatus::FAILURE;
-                emitSignal<DRing::ConfigurationSignal::AccountMessageStatus>(token, DRing::Account::MessageStates::FAILURE);
+                emitSignal<DRing::ConfigurationSignal::AccountMessageStatusChanged>(account_.getAccountID(),
+                                                                             token,
+                                                                             f->second.to,
+                                                                             static_cast<int>(DRing::Account::MessageStates::FAILURE));
             } else {
                 f->second.status = MessageStatus::IDLE;
                 // TODO: reschedule sending
diff --git a/src/manager.cpp b/src/manager.cpp
index 4a3b82c4f7618799c6f4d791385b2108e59c76e3..79e50e4ad983876e9cbb83853fe0bc6cebe9ad50 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -1408,7 +1408,7 @@ Manager::scheduleTask(std::shared_ptr<Runnable> task, std::chrono::steady_clock:
 {
     std::lock_guard<std::mutex> lock(scheduledTasksMutex_);
     scheduledTasks_.emplace(when, task);
-    RING_DBG("Task scheduled. Next in %lds", std::chrono::duration_cast<std::chrono::seconds>(scheduledTasks_.begin()->first - std::chrono::steady_clock::now()).count());
+    RING_DBG("Task scheduled. Next in %llds", std::chrono::duration_cast<std::chrono::seconds>(scheduledTasks_.begin()->first - std::chrono::steady_clock::now()).count());
 }
 
 // Must be invoked periodically by a timer from the main event loop
@@ -2740,17 +2740,17 @@ uint64_t
 Manager::sendTextMessage(const std::string& accountID, const std::string& to,
                          const std::map<std::string, std::string>& payloads)
 {
-    const auto acc = getAccount(accountID);
-    if (!acc)
-        return 0;
-    try {
-        return acc->sendTextMessage(to, payloads);
-    } catch (const std::exception& e) {
-        RING_ERR("Exception during text message sending: %s", e.what());
+    if (const auto acc = getAccount(accountID)) {
+        try {
+            return acc->sendTextMessage(to, payloads);
+        } catch (const std::exception& e) {
+            RING_ERR("Exception during text message sending: %s", e.what());
+        }
     }
+    return 0;
 }
 
-std::string
+int
 Manager::getMessageStatus(uint64_t id)
 {
     const auto& allAccounts = accountFactory_.getAllAccounts();
@@ -2760,19 +2760,19 @@ Manager::getMessageStatus(uint64_t id)
             switch (status) {
             case im::MessageStatus::IDLE:
             case im::MessageStatus::SENDING:
-                return DRing::Account::MessageStates::SENDING;
+                return static_cast<int>(DRing::Account::MessageStates::SENDING);
             case im::MessageStatus::SENT:
-                return DRing::Account::MessageStates::SENT;
+                return static_cast<int>(DRing::Account::MessageStates::SENT);
             case im::MessageStatus::READ:
-                return DRing::Account::MessageStates::READ;
+                return static_cast<int>(DRing::Account::MessageStates::READ);
             case im::MessageStatus::FAILURE:
-                return DRing::Account::MessageStates::FAILURE;
+                return static_cast<int>(DRing::Account::MessageStates::FAILURE);
             default:
-                return DRing::Account::MessageStates::UNKNOWN;
+                return static_cast<int>(DRing::Account::MessageStates::UNKNOWN);
             }
         }
     }
-    return DRing::Account::MessageStates::UNKNOWN;
+    return static_cast<int>(DRing::Account::MessageStates::UNKNOWN);
 }
 
 void
diff --git a/src/manager.h b/src/manager.h
index eb3edcd4e23f901b6800ed92533837686edcea41..5747912611944dd1f0459385fa748057bbe7b3f8 100644
--- a/src/manager.h
+++ b/src/manager.h
@@ -419,7 +419,7 @@ class Manager {
         uint64_t sendTextMessage(const std::string& accountID, const std::string& to,
                              const std::map<std::string, std::string>& payloads);
 
-        std::string getMessageStatus(uint64_t id);
+        int getMessageStatus(uint64_t id);
 
         /**
          * Get account list
diff --git a/src/ringdht/ringaccount.cpp b/src/ringdht/ringaccount.cpp
index 2515e7ce5432a4c72a6d90e930c5e552e65b4fd5..0843fe93c0eaae25d26e0d33264f01c8667ef3b1 100644
--- a/src/ringdht/ringaccount.cpp
+++ b/src/ringdht/ringaccount.cpp
@@ -963,7 +963,7 @@ RingAccount::doRegister_()
                 std::map<std::string, std::string> payloads = {{"text/plain",
                                                                 utf8_make_valid(v.msg)}};
                 shared->onTextMessage(from, payloads);
-                RING_WARN("Sending message confirmation %lu", v.id);
+                RING_DBG("Sending message confirmation %llu", v.id);
                 this_.dht_.putEncrypted(inboxKey,
                           v.from,
                           dht::ImMessage(v.id, std::string(), now));
@@ -1429,7 +1429,7 @@ RingAccount::sendTextMessage(const std::string& to, const std::map<std::string,
                     return true;
                 }
                 this_->sentMessages_.erase(e);
-                RING_WARN("Relevent text message reply for %lu", token);
+                RING_DBG("Relevant text message reply for %llu", token);
 
                 // add treated message
                 auto res = this_->treatedMessages_.insert(msg.id);
diff --git a/src/sip/sipaccountbase.cpp b/src/sip/sipaccountbase.cpp
index e1db0a592383b2c2259fa4b2c79ad4e566a94cb8..3fba632ccbc9c08baa557f883ba3bbbc898057d4 100644
--- a/src/sip/sipaccountbase.cpp
+++ b/src/sip/sipaccountbase.cpp
@@ -46,7 +46,9 @@
 namespace ring {
 
 SIPAccountBase::SIPAccountBase(const std::string& accountID)
-    : Account(accountID), link_(getSIPVoIPLink()), messageEngine_(*this, fileutils::get_cache_dir()+DIR_SEPARATOR_STR+getAccountID()+DIR_SEPARATOR_STR "messages")
+    : Account(accountID),
+    messageEngine_(*this, fileutils::get_cache_dir()+DIR_SEPARATOR_STR+getAccountID()+DIR_SEPARATOR_STR "messages"),
+    link_(getSIPVoIPLink())
 {}
 
 SIPAccountBase::~SIPAccountBase() {}