diff --git a/src/jamidht/account_manager.cpp b/src/jamidht/account_manager.cpp
index aa2c122aced8d692d933c64284198a099af2dbcb..2cfbd9d786119de42f9063fc37398c53b947556e 100644
--- a/src/jamidht/account_manager.cpp
+++ b/src/jamidht/account_manager.cpp
@@ -240,6 +240,7 @@ AccountManager::startSync()
                                                                   v.confirm,
                                                                   std::move(v.payload))) {
                                   sendTrustRequestConfirm(peer_account);
+                                  info_->contacts->saveTrustRequests();
                               }
                       });
         return true;
diff --git a/src/jamidht/archive_account_manager.cpp b/src/jamidht/archive_account_manager.cpp
index 925b3f3eae26b49e71dd458531a39873f7fa4f00..3f4a49b04072d319e2ae77225d6aca3e3d0b6504 100644
--- a/src/jamidht/archive_account_manager.cpp
+++ b/src/jamidht/archive_account_manager.cpp
@@ -497,11 +497,12 @@ ArchiveAccountManager::onSyncData(DeviceSync&& sync)
     // Sync contacts
     for (const auto& peer : sync.peers)
         info_->contacts->updateContact(peer.first, peer.second);
-    // saveContacts();
+    info_->contacts->saveContacts();
 
     // Sync trust requests
     for (const auto& tr : sync.trust_requests)
         info_->contacts->onTrustRequest(tr.first, tr.second.device, tr.second.received, false, {});
+    info_->contacts->saveTrustRequests();
 }
 
 AccountArchive
diff --git a/src/jamidht/contact_list.cpp b/src/jamidht/contact_list.cpp
index 0a31fb39f56f7cc9ce54fbeaf5762a3907c68641..ad8ff44460f417ca1452cfe704c5bdc1081729ff 100644
--- a/src/jamidht/contact_list.cpp
+++ b/src/jamidht/contact_list.cpp
@@ -81,7 +81,6 @@ ContactList::addContact(const dht::InfoHash& h, bool confirmed)
     trust_.setCertificateStatus(hStr, tls::TrustStore::PermissionStatus::ALLOWED);
     saveContacts();
     callbacks_.contactAdded(hStr, c->second.confirmed);
-    // syncDevices();
     return true;
 }
 
@@ -104,7 +103,6 @@ ContactList::removeContact(const dht::InfoHash& h, bool ban)
         saveTrustRequests();
     saveContacts();
     callbacks_.contactRemoved(uri, ban);
-    // syncDevices();
     return true;
 }
 
@@ -251,8 +249,6 @@ ContactList::onTrustRequest(const dht::InfoHash& peer_account,
             if (not contact->second.confirmed) {
                 contact->second.confirmed = true;
                 callbacks_.contactAdded(peer_account.toString(), true);
-                saveContacts();
-                // syncDevices();
             }
         }
     }
@@ -275,7 +271,6 @@ ContactList::onTrustRequest(const dht::InfoHash& peer_account,
                          peer_account.toString().c_str());
             }
         }
-        saveTrustRequests();
         callbacks_.trustRequest(req->first.toString(), req->second.payload, received);
     }
     return accept;
diff --git a/src/jamidht/contact_list.h b/src/jamidht/contact_list.h
index ea31ccc65476017cde33f716417ee23bc35a63a9..0fe48aa80de9953fefbd96030098d276f0a59f36 100644
--- a/src/jamidht/contact_list.h
+++ b/src/jamidht/contact_list.h
@@ -95,6 +95,9 @@ public:
     void setContacts(const std::map<dht::InfoHash, Contact>&);
     void updateContact(const dht::InfoHash&, const Contact&);
 
+    /** Should be called only after updateContact */
+    void saveContacts() const;
+
     /* Contact requests */
 
     /** Inform of a new contact request. Returns true if the request should be immediatly accepted
@@ -108,6 +111,9 @@ public:
     bool acceptTrustRequest(const dht::InfoHash& from);
     bool discardTrustRequest(const dht::InfoHash& from);
 
+    /** Should be called only after onTrustRequest */
+    void saveTrustRequests() const;
+
     /* Devices */
     const std::map<dht::InfoHash, KnownDevice>& getKnownDevices() const { return knownDevices_; }
     void foundAccountDevice(const dht::InfoHash& device,
@@ -139,10 +145,7 @@ private:
     OnChangeCallback callbacks_;
 
     void loadContacts();
-    void saveContacts() const;
-
     void loadTrustRequests();
-    void saveTrustRequests() const;
 
     void loadKnownDevices();
     void saveKnownDevices() const;
diff --git a/src/jamidht/server_account_manager.cpp b/src/jamidht/server_account_manager.cpp
index 76f05fb0f6511efb9535c915960f2c644627398f..20937e3dcb14e9345b5b08c7c07e69c6bfc78a27 100644
--- a/src/jamidht/server_account_manager.cpp
+++ b/src/jamidht/server_account_manager.cpp
@@ -402,6 +402,7 @@ ServerAccountManager::syncDevices()
                                 this_.info_->contacts
                                     ->updateContact(dht::InfoHash {e["uri"].asString()}, contact);
                             }
+                            this_.info_->contacts->saveContacts();
                         }
                     } catch (const std::exception& e) {
                         JAMI_ERR("Error when iterating contact list: %s", e.what());