diff --git a/src/jamidht/namedirectory.cpp b/src/jamidht/namedirectory.cpp
index 192855d76e1e0dec061c21b1228b16484e011194..7edc9d18557718f12ddf0ca8dacab8b207062f9c 100644
--- a/src/jamidht/namedirectory.cpp
+++ b/src/jamidht/namedirectory.cpp
@@ -77,9 +77,7 @@ NameDirectory::instance()
 }
 
 void
-NameDirectory::lookupUri(std::string_view uri,
-                         const std::string& default_server,
-                         LookupCallback cb)
+NameDirectory::lookupUri(std::string_view uri, const std::string& default_server, LookupCallback cb)
 {
     const std::string& default_ns = default_server.empty() ? DEFAULT_SERVER_HOST : default_server;
     std::svmatch pieces_match;
@@ -92,7 +90,7 @@ NameDirectory::lookupUri(std::string_view uri,
             return;
         }
     }
-    JAMI_ERR("Can't parse URI: %.*s", (int)uri.size(), uri.data());
+    JAMI_ERR("Can't parse URI: %.*s", (int) uri.size(), uri.data());
     cb("", Response::invalidResponse);
 }
 
@@ -108,6 +106,12 @@ NameDirectory::NameDirectory(const std::string& serverUrl, std::shared_ptr<dht::
                  + DIR_SEPARATOR_STR + resolver_->get_url().host;
 }
 
+NameDirectory::~NameDirectory()
+{
+    std::lock_guard<std::mutex> lk(requestsMtx_);
+    requests_.clear();
+}
+
 void
 NameDirectory::load()
 {
@@ -172,12 +176,12 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb)
                         Json::CharReaderBuilder rbuilder;
                         auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
                         if (!reader->parse(response.body.data(),
-                                        response.body.data() + response.body.size(),
-                                        &json,
-                                        &err)) {
+                                           response.body.data() + response.body.size(),
+                                           &json,
+                                           &err)) {
                             JAMI_DBG("Address lookup for %s: can't parse server response: %s",
-                                    addr.c_str(),
-                                    response.body.c_str());
+                                     addr.c_str(),
+                                     response.body.c_str());
                             cb("", Response::error);
                             return;
                         }
@@ -199,12 +203,15 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb)
                         cb("", Response::error);
                     }
                 }
+                std::lock_guard<std::mutex> lk(requestsMtx_);
                 requests_.erase(reqid);
             });
         request->send();
+        std::lock_guard<std::mutex> lk(requestsMtx_);
         requests_[reqid] = request;
     } catch (const std::exception& e) {
         JAMI_ERR("Error when performing address lookup: %s", e.what());
+        std::lock_guard<std::mutex> lk(requestsMtx_);
         requests_.erase(reqid);
     }
 }
@@ -296,12 +303,15 @@ NameDirectory::lookupName(const std::string& n, LookupCallback cb)
                     cb("", Response::error);
                 }
             }
+            std::lock_guard<std::mutex> lk(requestsMtx_);
             requests_.erase(reqid);
         });
         request->send();
+        std::lock_guard<std::mutex> lk(requestsMtx_);
         requests_[reqid] = request;
     } catch (const std::exception& e) {
         JAMI_ERR("Name lookup for %s failed: %s", name.c_str(), e.what());
+        std::lock_guard<std::mutex> lk(requestsMtx_);
         requests_.erase(reqid);
     }
 }
@@ -399,13 +409,16 @@ NameDirectory::registerName(const std::string& addr,
                     }
                     cb(success ? RegistrationResponse::success : RegistrationResponse::error);
                 }
+                std::lock_guard<std::mutex> lk(requestsMtx_);
                 requests_.erase(reqid);
             });
         request->send();
+        std::lock_guard<std::mutex> lk(requestsMtx_);
         requests_[reqid] = request;
     } catch (const std::exception& e) {
         JAMI_ERR("Error when performing name registration: %s", e.what());
         cb(RegistrationResponse::error);
+        std::lock_guard<std::mutex> lk(requestsMtx_);
         requests_.erase(reqid);
     }
 }
diff --git a/src/jamidht/namedirectory.h b/src/jamidht/namedirectory.h
index 7e96464df047515be161066114b74cbe5444c0d8..0ae8ecb6b0af1c73fb49a3104890977f4525cf61 100644
--- a/src/jamidht/namedirectory.h
+++ b/src/jamidht/namedirectory.h
@@ -67,6 +67,7 @@ public:
     using RegistrationCallback = std::function<void(RegistrationResponse response)>;
 
     NameDirectory(const std::string& serverUrl, std::shared_ptr<dht::Logger> l = {});
+    ~NameDirectory();
     void load();
 
     static NameDirectory& instance(const std::string& serverUrl,
@@ -108,6 +109,7 @@ private:
      */
     std::shared_ptr<asio::io_context> httpContext_;
     std::shared_ptr<dht::http::Resolver> resolver_;
+    std::mutex requestsMtx_ {};
     std::map<unsigned, std::shared_ptr<dht::http::Request>> requests_;
 
     std::map<std::string, std::string> nameCache_ {};