diff --git a/src/ringdht/ringaccount.cpp b/src/ringdht/ringaccount.cpp
index 0898495a67840b461ba542e0e94ca67336cf660f..61f9f450af022f15af86c77653c658cd90f67129 100644
--- a/src/ringdht/ringaccount.cpp
+++ b/src/ringdht/ringaccount.cpp
@@ -2256,8 +2256,12 @@ RingAccount::doRegister_()
                                                                         const dht::InfoHash& peer_account)
                 {
                     auto now = clock::to_time_t(clock::now());
-                    std::map<std::string, std::string> payloads = {{"text/plain",
-                                                                    utf8_make_valid(v.msg)}};
+                    std::string datatype = utf8_make_valid(v.datatype);
+                    if (datatype.empty()) {
+                        datatype = "text/plain";
+                    }
+                    std::map<std::string, std::string> payloads = {{datatype,
+                                                                   utf8_make_valid(v.msg)}};
                     shared->onTextMessage(peer_account.toString(), payloads);
                     RING_DBG("Sending message confirmation %" PRIx64, v.id);
                     shared->dht_.putEncrypted(inboxDeviceKey,
@@ -3351,7 +3355,7 @@ RingAccount::sendTextMessage(const std::string& to, const std::map<std::string,
         });
         confirm->listenTokens.emplace(h, std::move(list_token));
         shared->dht_.putEncrypted(h, dev,
-            dht::ImMessage(token, std::string(payloads.begin()->second), now),
+            dht::ImMessage(token, std::string(payloads.begin()->first), std::string(payloads.begin()->second), now),
             [wshared,token,confirm,h](bool ok) {
                 if (auto this_ = wshared.lock()) {
                     RING_DBG("[Account %s] [message %" PRIx64 "] put encrypted %s", this_->getAccountID().c_str(), token, ok ? "ok" : "failed");