diff --git a/src/ringdht/namedirectory.cpp b/src/ringdht/namedirectory.cpp
index 2c4d5a777656be84c0ae24550ab74a5214fdb65d..d093c2dbac1c6ed70647e8ca784429f0f989846e 100644
--- a/src/ringdht/namedirectory.cpp
+++ b/src/ringdht/namedirectory.cpp
@@ -105,9 +105,9 @@ size_t getContentLength(restbed::Response& reply)
 void NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb)
 {
     try {
-        auto cacheRes = nameCache_.find(addr);
-        if (cacheRes != nameCache_.end()) {
-            cb(cacheRes->second, Response::found);
+        std::string cacheResult = nameCache(addr);
+        if (not cacheResult.empty()) {
+            cb(cacheResult, Response::found);
             return;
         }
 
@@ -179,9 +179,9 @@ void NameDirectory::lookupName(const std::string& n, LookupCallback cb)
         }
         toLower(name);
 
-        auto cacheRes = addrCache_.find(name);
-        if (cacheRes != addrCache_.end()) {
-            cb(cacheRes->second, Response::found);
+        std::string cacheResult = addrCache(name);
+        if (not cacheResult.empty()) {
+            cb(cacheResult, Response::found);
             return;
         }
 
@@ -260,9 +260,9 @@ void NameDirectory::registerName(const std::string& addr, const std::string& n,
         }
         toLower(name);
 
-        auto cacheRes = addrCache_.find(name);
-        if (cacheRes != addrCache_.end()) {
-            if (cacheRes->second == addr)
+        auto cacheResult = addrCache(name);
+        if (not cacheResult.empty()) {
+            if (cacheResult == addr)
                 cb(RegistrationResponse::success);
             else
                 cb(RegistrationResponse::alreadyTaken);
diff --git a/src/ringdht/namedirectory.h b/src/ringdht/namedirectory.h
index 1590c4736119b97e16d8745864d79834dac0c9b0..62049ef4fbe46803bb778f6e93701c3a69e9e14d 100644
--- a/src/ringdht/namedirectory.h
+++ b/src/ringdht/namedirectory.h
@@ -58,12 +58,24 @@ private:
     NameDirectory(NameDirectory&&) = delete;
     constexpr static const char* const DEFAULT_SERVER_HOST = "ns.jami.net";
 
+    std::mutex lock_ {};
+
     const std::string serverHost_ {DEFAULT_SERVER_HOST};
     const std::string cachePath_;
 
     std::map<std::string, std::string> nameCache_ {};
     std::map<std::string, std::string> addrCache_ {};
-    std::mutex lock_ {};
+
+    std::string nameCache(const std::string& addr) {
+        std::lock_guard<std::mutex> l(lock_);
+        auto cacheRes = nameCache_.find(addr);
+        return cacheRes != nameCache_.end() ? cacheRes->second : std::string{};
+    }
+    std::string addrCache(const std::string& name) {
+        std::lock_guard<std::mutex> l(lock_);
+        auto cacheRes = addrCache_.find(name);
+        return cacheRes != addrCache_.end() ? cacheRes->second : std::string{};
+    }
 
     bool validateName(const std::string& name) const;