diff --git a/contrib/src/opendht/rules.mak b/contrib/src/opendht/rules.mak
index c46566379271cdb75b07685362f6d4c394086ef3..86489fcc81855197c1e6c083cce5c5d05258f1a4 100644
--- a/contrib/src/opendht/rules.mak
+++ b/contrib/src/opendht/rules.mak
@@ -1,5 +1,5 @@
 # OPENDHT
-OPENDHT_VERSION := e7295bac7b57540905e287a37904c615de971392
+OPENDHT_VERSION := 3fb7c2acfe098b18908d1803e5aaa2437d878af4
 OPENDHT_URL := https://github.com/savoirfairelinux/opendht/archive/$(OPENDHT_VERSION).tar.gz
 
 PKGS += opendht
diff --git a/src/ringdht/ringaccount.cpp b/src/ringdht/ringaccount.cpp
index bf7800492eb7ee9022c4c252585a9c9b7c3909d7..0a4f6e64ab783bbd97bbba5dc5a89ec12220e4e4 100644
--- a/src/ringdht/ringaccount.cpp
+++ b/src/ringdht/ringaccount.cpp
@@ -2083,6 +2083,9 @@ RingAccount::doRegister_()
                         // Contact exists, update confirmation status
                         contact->second.confirmed = true;
                         emitSignal<DRing::ConfigurationSignal::ContactAdded>(this_.getAccountID(), peer_account.toString(), true);
+                        // Send confirmation
+                        if (not v.confirm)
+                            this_.sendTrustRequestConfirm(peer_account);
                         this_.syncDevices();
                     } else {
                         // Add trust request
@@ -2759,13 +2762,14 @@ RingAccount::getContactHeader(pjsip_transport* t)
 /* contacts */
 
 void
-RingAccount::addContact(const std::string& uri)
+RingAccount::addContact(const std::string& uri, bool confirmed)
 {
     dht::InfoHash h (uri);
     auto c = contacts_.find(h);
     if (c == contacts_.end())
         c = contacts_.emplace(h, Contact{}).first;
     c->second.added = std::time(nullptr);
+    c->second.confirmed = confirmed or c->second.confirmed;
     trust_.setCertificateStatus(uri, tls::TrustStore::PermissionStatus::ALLOWED);
     saveContacts();
     emitSignal<DRing::ConfigurationSignal::ContactAdded>(getAccountID(), uri, c->second.confirmed);
@@ -2818,7 +2822,7 @@ RingAccount::updateContact(const dht::InfoHash& id, const Contact& contact)
         c->second.added = std::max(contact.added, c->second.added);
         c->second.removed = std::max(contact.removed, c->second.removed);
         if (contact.confirmed != c->second.confirmed) {
-            c->second.confirmed = std::max(contact.confirmed, c->second.confirmed);
+            c->second.confirmed = contact.confirmed or c->second.confirmed;
             emitSignal<DRing::ConfigurationSignal::ContactAdded>(getAccountID(), id.toString(), c->second.confirmed);
         }
     }
@@ -2867,13 +2871,20 @@ RingAccount::acceptTrustRequest(const std::string& from)
 {
     dht::InfoHash f(from);
     auto i = trustRequests_.find(f);
-    if (i != trustRequests_.end()) {
-        addContact(from);
-        trustRequests_.erase(i);
-        saveTrustRequests();
-        return true;
-    }
-    return false;
+    if (i == trustRequests_.end())
+        return false;
+
+    // The contact sent us a TR so we are in its contact list
+    addContact(from, true);
+
+    // Clear trust request
+    auto treq = std::move(i->second);
+    trustRequests_.erase(i);
+    saveTrustRequests();
+
+    // Send confirmation
+    sendTrustRequestConfirm(f);
+    return true;
 }
 
 bool
@@ -2901,6 +2912,18 @@ RingAccount::sendTrustRequest(const std::string& to, const std::vector<uint8_t>&
     });
 }
 
+void
+RingAccount::sendTrustRequestConfirm(const dht::InfoHash& to)
+{
+    dht::TrustRequest answer {DHT_TYPE_NS};
+    answer.confirm = true;
+    forEachDevice(to, [to,answer](const std::shared_ptr<RingAccount>& shared, const dht::InfoHash& dev)
+    {
+        RING_WARN("[Account %s] sending trust request reply: %s / %s", shared->getAccountID().c_str(), to.toString().c_str(), dev.toString().c_str());
+        shared->dht_.putEncrypted(dht::InfoHash::get("inbox:"+dev.toString()), dev, answer);
+    });
+}
+
 void
 RingAccount::saveTrustRequests() const
 {
diff --git a/src/ringdht/ringaccount.h b/src/ringdht/ringaccount.h
index 7eeb58cf8721e16978aeb1d24f61461b961bfffe..84fccbd22c53b221df701acd95f560766e3da28e 100644
--- a/src/ringdht/ringaccount.h
+++ b/src/ringdht/ringaccount.h
@@ -291,11 +291,16 @@ class RingAccount : public SIPAccountBase {
         bool acceptTrustRequest(const std::string& from);
         bool discardTrustRequest(const std::string& from);
 
-        void addContact(const std::string& uri);
+        /**
+         * Add contact to the account contact list.
+         * Set confirmed if we know the contact also added us.
+         */
+        void addContact(const std::string& uri, bool confirmed = false);
         void removeContact(const std::string& uri);
         std::vector<std::map<std::string, std::string>> getContacts() const;
 
         void sendTrustRequest(const std::string& to, const std::vector<uint8_t>& payload);
+        void sendTrustRequestConfirm(const dht::InfoHash& to);
         virtual void sendTextMessage(const std::string& to, const std::map<std::string, std::string>& payloads, uint64_t id) override;
 
         void addDevice(const std::string& password);