diff --git a/contrib/src/opendht/SHA512SUMS b/contrib/src/opendht/SHA512SUMS
index c9f28e2d5e9474d81c06b47bd343cd6829e289d4..481cf17286e1bde35d7fde92d299288ab1c6947d 100644
--- a/contrib/src/opendht/SHA512SUMS
+++ b/contrib/src/opendht/SHA512SUMS
@@ -1 +1 @@
-fe4675faf918ccdcca6eac17ffca7a010edf77296db16c7adb02ea4709199dac1ef11815e54fb1203b9401a98c8cc58d78280e79e434159c82a77398f47a5807  opendht-63afc8c29a01f4b062b596608e0a5886e4f05a18.tar.gz
+e9401823db7130560969e97174329ac7ae72a07eedb6806f1b5ac43c2f366e3e12c9a6fab981e531e0afdd9430c0cd200ba57cbd2e79b566eead6453a660c98a  opendht-b03a7732e3dca3a48689e64e345fe418e130b6ac.tar.gz
diff --git a/contrib/src/opendht/rules.mak b/contrib/src/opendht/rules.mak
index 57b4ae34b3c7121d21b81f394dd3692226caf2d0..f87438f1bbbfcbdcc508d5d9a9c54dcc2ee62e7a 100644
--- a/contrib/src/opendht/rules.mak
+++ b/contrib/src/opendht/rules.mak
@@ -1,5 +1,5 @@
 # OPENDHT
-OPENDHT_VERSION := 63afc8c29a01f4b062b596608e0a5886e4f05a18
+OPENDHT_VERSION := b03a7732e3dca3a48689e64e345fe418e130b6ac
 OPENDHT_URL := https://github.com/savoirfairelinux/opendht/archive/$(OPENDHT_VERSION).tar.gz
 
 PKGS += opendht
diff --git a/src/jamidht/namedirectory.cpp b/src/jamidht/namedirectory.cpp
index ee78294e43d21b0b11a7b9bb1aacbd07e0d0d381..f2d7818804f0846497d034842b43ce038714f67b 100644
--- a/src/jamidht/namedirectory.cpp
+++ b/src/jamidht/namedirectory.cpp
@@ -49,9 +49,6 @@ constexpr const char* const QUERY_NAME {"/name/"};
 constexpr const char* const QUERY_ADDR {"/addr/"};
 constexpr const char* const CACHE_DIRECTORY {"namecache"};
 
-constexpr const char* const HTTPS_URI {"https://"};
-static const std::string HTTPS_PROTO {"https"};
-
 const std::string  HEX_PREFIX = "0x";
 constexpr std::chrono::seconds SAVE_INTERVAL {5};
 
@@ -87,13 +84,14 @@ NameDirectory::lookupUri(const std::string& uri, const std::string& default_serv
     cb("", Response::invalidResponse);
 }
 
-NameDirectory::NameDirectory(const std::string& s, std::shared_ptr<dht::Logger> l)
-   : serverHost_(s)
-   , cachePath_(fileutils::get_cache_dir() + DIR_SEPARATOR_STR + CACHE_DIRECTORY + DIR_SEPARATOR_STR + serverHost_)
-   , logger_(l)
+NameDirectory::NameDirectory(const std::string& serverUrl, std::shared_ptr<dht::Logger> l)
+   : serverUrl_(serverUrl), logger_(std::move(l))
    , httpContext_(Manager::instance().ioContext())
-   , resolver_(std::make_shared<dht::http::Resolver>(*httpContext_, serverHost_, HTTPS_PROTO, true, logger_))
-{}
+{
+    resolver_ = std::make_shared<dht::http::Resolver>(*httpContext_, serverUrl, logger_);
+    cachePath_ = fileutils::get_cache_dir() + DIR_SEPARATOR_STR + CACHE_DIRECTORY +
+                                              DIR_SEPARATOR_STR + resolver_->get_url().host;
+}
 
 void
 NameDirectory::load()
@@ -102,9 +100,9 @@ NameDirectory::load()
 }
 
 NameDirectory&
-NameDirectory::instance(const std::string& server, std::shared_ptr<dht::Logger> l)
+NameDirectory::instance(const std::string& serverUrl, std::shared_ptr<dht::Logger> l)
 {
-    const std::string& s = server.empty() ? DEFAULT_SERVER_HOST : server;
+    const std::string& s = serverUrl.empty() ? DEFAULT_SERVER_HOST : serverUrl;
     static std::mutex instanceMtx {};
 
     std::lock_guard<std::mutex> lock(instanceMtx);
@@ -122,8 +120,7 @@ NameDirectory::instance(const std::string& server, std::shared_ptr<dht::Logger>
 
 void
 NameDirectory::setHeaderFields(Request& request){
-    const std::string host = HTTPS_PROTO + ":" + serverHost_;
-    request.set_header_field(restinio::http_field_t::host, host);
+    request.set_header_field(restinio::http_field_t::host, request.get_url().host + ":" + request.get_url().service);
     request.set_header_field(restinio::http_field_t::user_agent, "JamiDHT");
     request.set_header_field(restinio::http_field_t::accept, "*/*");
     request.set_header_field(restinio::http_field_t::content_type, "application/json");
@@ -141,11 +138,17 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb)
     auto reqid = request->id();
     try {
         request->set_connection_type(restinio::http_connection_header_t::keep_alive);
-        request->set_target(QUERY_ADDR + addr);
+        auto target_prefix = request->get_url().target;
+        if (target_prefix.back() == '/')
+            target_prefix.pop_back();
+        request->set_target(target_prefix + QUERY_ADDR + addr);
         request->set_method(restinio::http_method_get());
         setHeaderFields(*request);
 
-        const std::string uri = HTTPS_URI + serverHost_ + QUERY_ADDR + addr;
+        std::string uri = serverUrl_;
+        if (uri.back() == '/')
+            uri.pop_back();
+        uri += QUERY_ADDR + addr;
         JAMI_DBG("Address lookup for %s: %s", addr.c_str(), uri.c_str());
         request->add_on_state_change_callback([this, cb=std::move(cb), reqid, addr]
                                               (Request::State state, const dht::http::Response& response){
@@ -223,11 +226,17 @@ NameDirectory::lookupName(const std::string& n, LookupCallback cb)
     auto reqid = request->id();
     try {
         request->set_connection_type(restinio::http_connection_header_t::keep_alive);
-        request->set_target(QUERY_NAME + name);
+        auto target_prefix = request->get_url().target;
+        if (target_prefix.back() == '/')
+            target_prefix.pop_back();
+        request->set_target(target_prefix + QUERY_NAME + name);
         request->set_method(restinio::http_method_get());
         setHeaderFields(*request);
 
-        const std::string uri = HTTPS_URI + serverHost_ + QUERY_NAME + name;
+        std::string uri = serverUrl_;
+        if (uri.back() == '/')
+            uri.pop_back();
+        uri += QUERY_NAME + name;
         JAMI_DBG("Name lookup for %s: %s", name.c_str(), uri.c_str());
 
         request->add_on_state_change_callback([this, reqid, name, cb=std::move(cb)]
@@ -337,7 +346,10 @@ void NameDirectory::registerName(const std::string& addr, const std::string& n,
     auto reqid = request->id();
     try {
         request->set_connection_type(restinio::http_connection_header_t::keep_alive);
-        request->set_target(QUERY_NAME + name);
+        auto target_prefix = request->get_url().target;
+        if (target_prefix.back() == '/')
+            target_prefix.pop_back();
+        request->set_target(target_prefix + QUERY_NAME + name);
         request->set_method(restinio::http_method_post());
         setHeaderFields(*request);
         request->set_body(body);
diff --git a/src/jamidht/namedirectory.h b/src/jamidht/namedirectory.h
index a4baa64ce76648e0f549e4d230ec05582e4732de..64b4d5acdd6a57f1c37978b26e734f479e638545 100644
--- a/src/jamidht/namedirectory.h
+++ b/src/jamidht/namedirectory.h
@@ -62,10 +62,10 @@ public:
     using LookupCallback = std::function<void(const std::string& result, Response response)>;
     using RegistrationCallback = std::function<void(RegistrationResponse response)>;
 
-    NameDirectory(const std::string& s, std::shared_ptr<dht::Logger> l = {});
+    NameDirectory(const std::string& serverUrl, std::shared_ptr<dht::Logger> l = {});
     void load();
 
-    static NameDirectory& instance(const std::string& server, std::shared_ptr<dht::Logger> l = {});
+    static NameDirectory& instance(const std::string& serverUrl, std::shared_ptr<dht::Logger> l = {});
     static NameDirectory& instance() { return instance(DEFAULT_SERVER_HOST); }
 
     static void lookupUri(const std::string& uri, const std::string& default_server,
@@ -78,18 +78,14 @@ public:
                       const std::string& owner, RegistrationCallback cb,
                       const std::string& signedname, const std::string& publickey);
 
-    const std::string& getServer() const {
-        return serverHost_;
-    }
-
 private:
     NON_COPYABLE(NameDirectory);
     NameDirectory(NameDirectory&&) = delete;
     NameDirectory& operator=(NameDirectory&&) = delete;
-    constexpr static const char* const DEFAULT_SERVER_HOST = "ns.jami.net";
+    constexpr static const char* const DEFAULT_SERVER_HOST = "https://ns.jami.net";
 
-    const std::string serverHost_ {DEFAULT_SERVER_HOST};
-    const std::string cachePath_;
+    std::string serverUrl_;
+    std::string cachePath_;
 
     std::mutex cacheLock_ {};
     std::shared_ptr<dht::Logger> logger_;
diff --git a/src/jamidht/server_account_manager.cpp b/src/jamidht/server_account_manager.cpp
index 00a786929f7c35a922afc0de5d5b5c88affb9121..f6a54c840077fa5164e94ff6f0a388f04efb3d19 100644
--- a/src/jamidht/server_account_manager.cpp
+++ b/src/jamidht/server_account_manager.cpp
@@ -50,6 +50,14 @@ ServerAccountManager::ServerAccountManager(
     [](char const* m, va_list args) { Logger::vlog(LOG_DEBUG, nullptr, 0, true, m, args); }))
 {};
 
+void
+ServerAccountManager::setHeaderFields(Request& request){
+    request.set_header_field(restinio::http_field_t::host, request.get_url().host + ":" + request.get_url().service);
+    request.set_header_field(restinio::http_field_t::user_agent, "Jami");
+    request.set_header_field(restinio::http_field_t::accept, "application/json");
+    request.set_header_field(restinio::http_field_t::content_type, "application/json");
+}
+
 void
 ServerAccountManager::initAuthentication(
     CertRequest csrRequest,
@@ -71,11 +79,13 @@ ServerAccountManager::initAuthentication(
     onChange_ = std::move(onChange);
 
     const std::string url = managerHostname_ + PATH_DEVICE_REGISTER;
-    JAMI_WARN("[Auth] authentication with: %s %s to %s", ctx->credentials->username.c_str(), ctx->credentials->password.c_str(), url.c_str());
+    JAMI_WARN("[Auth] authentication with: %s to %s", ctx->credentials->username.c_str(), url.c_str());
     auto request = std::make_shared<Request>(*Manager::instance().ioContext(), url, logger_);
     auto reqid = request->id();
-    request->set_connection_type(restinio::http_connection_header_t::close);
-    request->set_method(restinio::http_method_post());
+    restinio::http_request_header_t header;
+    header.method(restinio::http_method_post());
+    request->set_header(header);
+    request->set_target(PATH_DEVICE_REGISTER);
     request->set_auth(ctx->credentials->username, ctx->credentials->password);
     {
         std::stringstream ss;
@@ -86,12 +96,10 @@ ServerAccountManager::initAuthentication(
         JAMI_WARN("[Auth] Sending request: %s", csr.c_str());
         request->set_body(ss.str());
     }
-
-    request->set_header_field(restinio::http_field_t::user_agent, "Jami");
-    request->set_header_field(restinio::http_field_t::accept, "application/json");
-    request->set_header_field(restinio::http_field_t::content_type, "application/json");
+    setHeaderFields(*request);
+    request->set_header_field(restinio::http_field_t::expect, "100-continue");
     request->add_on_state_change_callback([reqid, ctx, onAsync = onAsync_]
-                                            (Request::State state, const dht::http::Response& response){
+                                          (Request::State state, const dht::http::Response& response){
 
         JAMI_ERR("[Auth] Got server response: %d", (int)state);
         if (state != Request::State::DONE)
@@ -186,16 +194,15 @@ ServerAccountManager::syncDevices()
     if (not creds_)
         return;
     const std::string url = managerHostname_ + PATH_DEVICES;
-    JAMI_WARN("[Auth] syncDevices with: %s %s to %s", creds_->username.c_str(), creds_->password.c_str(), url.c_str());
+    JAMI_WARN("[Auth] syncDevices with: %s to %s", creds_->username.c_str(), url.c_str());
     auto request = std::make_shared<Request>(*Manager::instance().ioContext(), url, logger_);
     auto reqid = request->id();
-    request->set_connection_type(restinio::http_connection_header_t::close);
-    request->set_method(restinio::http_method_get());
+    restinio::http_request_header_t header;
+    header.method(restinio::http_method_get());
+    request->set_header(header);
+    request->set_target(PATH_DEVICES);
     request->set_auth(creds_->username, creds_->password);
-    request->set_header_field(restinio::http_field_t::user_agent, "Jami");
-    request->set_header_field(restinio::http_field_t::accept, "application/json");
-    request->set_header_field(restinio::http_field_t::content_type, "application/json");
-
+    setHeaderFields(*request);
     request->add_on_state_change_callback([reqid, onAsync = onAsync_]
                                             (Request::State state, const dht::http::Response& response){
         onAsync([reqid, state, response] (AccountManager& accountManager) {
diff --git a/src/jamidht/server_account_manager.h b/src/jamidht/server_account_manager.h
index b07fb9452b5b12c05c66e5f8119dc89c349f6ef9..09531ceaba4727f42f18c419de03f11f983a0cb6 100644
--- a/src/jamidht/server_account_manager.h
+++ b/src/jamidht/server_account_manager.h
@@ -76,6 +76,8 @@ private:
     std::shared_ptr<dht::Logger> logger_;
     std::map<unsigned int /*id*/, std::shared_ptr<dht::http::Request>> requests_;
     std::unique_ptr<ServerAccountCredentials> creds_;
+
+    void setHeaderFields(dht::http::Request& request);
 };
 
-}
\ No newline at end of file
+}