diff --git a/test/unitTest/namedirectory/namedirectory.cpp b/test/unitTest/namedirectory/namedirectory.cpp
index df73816799566ee836259543dbeca097bf3e1dc0..301f7ba47cb2c683bc21a4717554ad8e87b882fe 100644
--- a/test/unitTest/namedirectory/namedirectory.cpp
+++ b/test/unitTest/namedirectory/namedirectory.cpp
@@ -52,43 +52,79 @@ public:
         // Init daemon
         libjami::init(
             libjami::InitFlag(libjami::LIBJAMI_FLAG_DEBUG | libjami::LIBJAMI_FLAG_CONSOLE_LOG));
-        if (not Manager::instance().initialized)
+        if (not Manager::instance().initialized) {
             CPPUNIT_ASSERT(libjami::start("jami-sample.yml"));
 
-        // Create express router for our service.
-        auto router = std::make_unique<router::express_router_t<>>();
-        router->http_post(
-                R"(/name/:name)",
-                [](auto req, auto params) {
-                    const auto qp = parse_query(req->header().query());
-                    return req->create_response()
-                            .set_body(
-                                    fmt::format("{{\"success\":true}}")
-                            )
-                            .done();
-                });
+            // Create express router for our service.
+            auto router = std::make_unique<router::express_router_t<>>();
+            router->http_post(
+                    R"(/name/:name)",
+                    [](auto req, auto params) {
+                        const auto qp = parse_query(req->header().query());
+                        return req->create_response()
+                                .set_body(
+                                        fmt::format("{{\"success\":true}}")
+                                )
+                                .done();
+                    });
+            router->http_get(
+                    R"(/name/:name)",
+                    [](auto req, auto params) {
+                        const auto qp = parse_query(req->header().query());
+                        if (params["name"] == "taken") {
+                            return req->create_response()
+                                    .set_body(
+                                            fmt::format("{{\"name\":\"taken\",\"addr\":\"c0dec0dec0dec0dec0dec0dec0dec0dec0dec0de\"}}")
+                                    )
+                                    .done();
+                        }
+                        return req->create_response(restinio::status_not_found())
+                                .set_body(
+                                        fmt::format("{{\"error\":\"name not registered\"}}")
+                                )
+                                .done();
+                    });
+            router->http_get(
+                    R"(/addr/:addr)",
+                    [](auto req, auto params) {
+                        const auto qp = parse_query(req->header().query());
+                        if (params["addr"] == "c0dec0dec0dec0dec0dec0dec0dec0dec0dec0de") {
+                            return req->create_response()
+                                    .set_body(
+                                            fmt::format("{{\"name\":\"taken\",\"addr\":\"c0dec0dec0dec0dec0dec0dec0dec0dec0dec0de\"}}")
+                                    )
+                                    .done();
+                        }
+                        return req->create_response(restinio::status_not_found())
+                                .set_body(
+                                        fmt::format("{{\"error\":\"address not registered\"}}")
+                                )
+                                .done();
+                    });
 
-        router->non_matched_request_handler(
-                [](auto req){
-                    return req->create_response(restinio::status_not_found()).connection_close().done();
-                });
+            router->non_matched_request_handler(
+                    [](auto req){
+                        return req->create_response(restinio::status_not_found()).connection_close().done();
+                    });
 
 
-        auto settings = restinio::run_on_this_thread_settings_t<RestRouterTraits>();
-        settings.address("localhost");
-        settings.port(1412);
-        settings.request_handler(std::move(router));
-        httpServer_ = std::make_unique<restinio::http_server_t<RestRouterTraits>>(
-            Manager::instance().ioContext(),
-            std::forward<restinio::run_on_this_thread_settings_t<RestRouterTraits>>(std::move(settings))
-        );
-        // run http server
-        serverThread_ = std::thread([this](){
-            httpServer_->open_async([]{/*ok*/}, [](std::exception_ptr ex){
-                std::rethrow_exception(ex);
+            auto settings = restinio::run_on_this_thread_settings_t<RestRouterTraits>();
+            settings.address("localhost");
+            settings.port(1412);
+            settings.request_handler(std::move(router));
+            httpServer_ = std::make_unique<restinio::http_server_t<RestRouterTraits>>(
+                Manager::instance().ioContext(),
+                std::forward<restinio::run_on_this_thread_settings_t<RestRouterTraits>>(std::move(settings))
+            );
+            // run http server
+            serverThread_ = std::thread([this](){
+                httpServer_->open_async([]{/*ok*/}, [](std::exception_ptr ex){
+                    std::rethrow_exception(ex);
+                });
+                httpServer_->io_context().run();
             });
-            httpServer_->io_context().run();
-        });
+        }
+
     }
     ~NameDirectoryTest() {
         libjami::fini();
@@ -107,9 +143,21 @@ public:
 
 private:
     void testRegisterName();
+    void testLookupName();
+    void testLookupNameInvalid();
+    void testLookupNameNotFound();
+    void testLookupAddr();
+    void testLookupAddrInvalid();
+    void testLookupAddrNotFound();
 
     CPPUNIT_TEST_SUITE(NameDirectoryTest);
     CPPUNIT_TEST(testRegisterName);
+    CPPUNIT_TEST(testLookupName);
+    CPPUNIT_TEST(testLookupNameInvalid);
+    CPPUNIT_TEST(testLookupNameNotFound);
+    CPPUNIT_TEST(testLookupAddr);
+    CPPUNIT_TEST(testLookupAddrInvalid);
+    CPPUNIT_TEST(testLookupAddrNotFound);
     CPPUNIT_TEST_SUITE_END();
 };
 
@@ -152,6 +200,138 @@ NameDirectoryTest::testRegisterName()
     CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return nameRegistered; }));
 }
 
+void
+NameDirectoryTest::testLookupName()
+{
+    std::mutex mtx;
+    std::unique_lock<std::mutex> lk {mtx};
+    std::condition_variable cv;
+    std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers;
+    bool nameFound {false};
+    // Watch signals
+    confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>(
+        [&](const std::string&,
+            int status,
+            const std::string&,
+            const std::string&) {
+            nameFound = status == 0;
+            cv.notify_one();
+        }));
+    libjami::registerSignalHandlers(confHandlers);
+    CPPUNIT_ASSERT(libjami::lookupName(aliceId, "", "taken"));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return nameFound; }));
+}
+
+void
+NameDirectoryTest::testLookupNameInvalid()
+{
+    std::mutex mtx;
+    std::unique_lock<std::mutex> lk {mtx};
+    std::condition_variable cv;
+    std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers;
+    bool nameInvalid {false};
+    // Watch signals
+    confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>(
+        [&](const std::string&,
+            int status,
+            const std::string&,
+            const std::string&) {
+            nameInvalid = status == 1;
+            cv.notify_one();
+        }));
+    libjami::registerSignalHandlers(confHandlers);
+    CPPUNIT_ASSERT(libjami::lookupName(aliceId, "", "===="));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return nameInvalid; }));
+}
+
+void
+NameDirectoryTest::testLookupNameNotFound()
+{
+    std::mutex mtx;
+    std::unique_lock<std::mutex> lk {mtx};
+    std::condition_variable cv;
+    std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers;
+    bool nameNotFound {false};
+    // Watch signals
+    confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>(
+        [&](const std::string&,
+            int status,
+            const std::string&,
+            const std::string&) {
+            nameNotFound = status == 2;
+            cv.notify_one();
+        }));
+    libjami::registerSignalHandlers(confHandlers);
+    CPPUNIT_ASSERT(libjami::lookupName(aliceId, "", "nottaken"));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return nameNotFound; }));
+}
+
+void
+NameDirectoryTest::testLookupAddr()
+{
+    std::mutex mtx;
+    std::unique_lock<std::mutex> lk {mtx};
+    std::condition_variable cv;
+    std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers;
+    bool addrFound {false};
+    // Watch signals
+    confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>(
+        [&](const std::string&,
+            int status,
+            const std::string&,
+            const std::string&) {
+            addrFound = status == 0;
+            cv.notify_one();
+        }));
+    libjami::registerSignalHandlers(confHandlers);
+    CPPUNIT_ASSERT(libjami::lookupAddress(aliceId, "", "c0dec0dec0dec0dec0dec0dec0dec0dec0dec0de"));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return addrFound; }));
+}
+
+void
+NameDirectoryTest::testLookupAddrInvalid()
+{
+    std::mutex mtx;
+    std::unique_lock<std::mutex> lk {mtx};
+    std::condition_variable cv;
+    std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers;
+    bool addrInvalid {false};
+    // Watch signals
+    confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>(
+        [&](const std::string&,
+            int status,
+            const std::string&,
+            const std::string&) {
+            addrInvalid = status == 1;
+            cv.notify_one();
+        }));
+    libjami::registerSignalHandlers(confHandlers);
+    CPPUNIT_ASSERT(libjami::lookupName(aliceId, "", "===="));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return addrInvalid; }));
+}
+
+void
+NameDirectoryTest::testLookupAddrNotFound()
+{
+    std::mutex mtx;
+    std::unique_lock<std::mutex> lk {mtx};
+    std::condition_variable cv;
+    std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers;
+    bool addrNotFound {false};
+    // Watch signals
+    confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>(
+        [&](const std::string&,
+            int status,
+            const std::string&,
+            const std::string&) {
+            addrNotFound = status == 2;
+            cv.notify_one();
+        }));
+    libjami::registerSignalHandlers(confHandlers);
+    CPPUNIT_ASSERT(libjami::lookupAddress(aliceId, "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return addrNotFound; }));
+}
+
 } // namespace test
 } // namespace jami