diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp
index d7e4146ee81ec82334f7452a1c1903fc9f6f4de1..609d0bad6aedf1360df9dddbd6d126763f0b7b38 100644
--- a/src/jamidht/jamiaccount.cpp
+++ b/src/jamidht/jamiaccount.cpp
@@ -1300,13 +1300,18 @@ JamiAccount::loadAccountFromDHT(const std::string& archive_password, const std::
         JAMI_ERR("DHT already running (stopping it first).");
         dht_.join();
     }
-    dht_.setOnStatusChanged([](dht::NodeStatus s4, dht::NodeStatus s6) {
+
+    dht::DhtRunner::Config config {};
+    config.dht_config.node_config.persist_path = cachePath_+DIR_SEPARATOR_STR "dhtstate";
+    config.proxy_server = getDhtProxyServer();
+
+    dht::DhtRunner::Context context {};
+    context.statusChangedCallback = [](dht::NodeStatus s4, dht::NodeStatus s6) {
         JAMI_WARN("Dht status : IPv4 %s; IPv6 %s", dhtStatusStr(s4), dhtStatusStr(s6));
-    });
-    dht_.run((in_port_t)dhtPortUsed_, {}, true);
-    dht_.bootstrap(loadNodes());
-    auto bootstrap = loadBootstrap();
-    if (not bootstrap.empty())
+    };
+
+    dht_.run((in_port_t)dhtPortUsed_, config, std::move(context));
+    for (const auto& bootstrap : loadBootstrap())
         dht_.bootstrap(bootstrap);
 
     auto w = weak();
@@ -2078,33 +2083,17 @@ JamiAccount::doRegister()
 }
 
 
-std::vector<dht::SockAddr>
+std::vector<std::string>
 JamiAccount::loadBootstrap() const
 {
-    std::vector<dht::SockAddr> bootstrap;
+    std::vector<std::string> bootstrap;
     if (!hostname_.empty()) {
         std::stringstream ss(hostname_);
         std::string node_addr;
-        while (std::getline(ss, node_addr, ';')) {
-            auto ips = dht::SockAddr::resolve(node_addr);
-            if (ips.empty()) {
-                IpAddr resolved(node_addr);
-                if (resolved) {
-                    if (resolved.getPort() == 0)
-                        resolved.setPort(DHT_DEFAULT_PORT);
-                    bootstrap.emplace_back(static_cast<const sockaddr*>(resolved), resolved.getLength());
-                }
-            } else {
-                bootstrap.reserve(bootstrap.size() + ips.size());
-                for (auto& ip : ips) {
-                    if (ip.getPort() == 0)
-                        ip.setPort(DHT_DEFAULT_PORT);
-                    bootstrap.emplace_back(std::move(ip));
-                }
-            }
-        }
-        for (const auto& ip : bootstrap)
-            JAMI_DBG("Bootstrap node: %s", ip.toString().c_str());
+        while (std::getline(ss, node_addr, ';'))
+            bootstrap.emplace_back(std::move(node_addr));
+        for (const auto& b : bootstrap)
+            JAMI_DBG("Bootstrap node: %s", b.c_str());
     }
     return bootstrap;
 }
@@ -2328,8 +2317,7 @@ JamiAccount::doRegister_()
         setRegistrationState(RegistrationState::TRYING);
         dht_.run((in_port_t)dhtPortUsed_, config, std::move(context));
 
-        auto bootstrap = loadBootstrap();
-        if (not bootstrap.empty())
+        for (const auto& bootstrap : loadBootstrap())
             dht_.bootstrap(bootstrap);
 
         // Put device annoucement
@@ -2948,84 +2936,6 @@ JamiAccount::getKnownDevices() const
     return ids;
 }
 
-void
-JamiAccount::saveNodes(const std::vector<dht::NodeExport>& nodes) const
-{
-    if (nodes.empty())
-        return;
-    fileutils::check_dir(cachePath_.c_str());
-    std::string nodesPath = cachePath_+DIR_SEPARATOR_STR "nodes";
-    {
-        std::lock_guard<std::mutex> lock(fileutils::getFileLock(nodesPath));
-        std::ofstream file(nodesPath, std::ios::trunc | std::ios::binary);
-        if (!file.is_open()) {
-            JAMI_ERR("Could not save nodes to %s", nodesPath.c_str());
-            return;
-        }
-        for (auto& n : nodes)
-            file << n.id << " " << IpAddr(n.ss).toString(true) << "\n";
-    }
-}
-
-void
-JamiAccount::saveValues(const std::vector<dht::ValuesExport>& values) const
-{
-    std::lock_guard<std::mutex> lock(dhtValuesMtx_);
-    fileutils::check_dir(dataPath_.c_str());
-    for (const auto& v : values) {
-        const std::string fname = dataPath_ + DIR_SEPARATOR_STR + v.first.toString();
-        std::ofstream file(fname, std::ios::trunc | std::ios::out | std::ios::binary);
-        file.write((const char*)v.second.data(), v.second.size());
-    }
-}
-
-std::vector<dht::NodeExport>
-JamiAccount::loadNodes() const
-{
-    std::vector<dht::NodeExport> nodes;
-    std::string nodesPath = cachePath_+DIR_SEPARATOR_STR "nodes";
-    {
-        std::lock_guard<std::mutex> lock(fileutils::getFileLock(nodesPath));
-        std::ifstream file(nodesPath);
-        if (!file.is_open()) {
-            JAMI_DBG("Could not load nodes from %s", nodesPath.c_str());
-            return nodes;
-        }
-        std::string line;
-        while (std::getline(file, line))
-        {
-            std::istringstream iss(line);
-            std::string id, ipstr;
-            if (!(iss >> id >> ipstr)) { break; }
-            IpAddr ip {ipstr};
-            dht::NodeExport e {dht::InfoHash(id), ip, ip.getLength()};
-            nodes.push_back(e);
-        }
-    }
-    return nodes;
-}
-
-std::vector<dht::ValuesExport>
-JamiAccount::loadValues() const
-{
-    std::lock_guard<std::mutex> lock(dhtValuesMtx_);
-    std::vector<dht::ValuesExport> values;
-    const auto dircontent(fileutils::readDirectory(dataPath_));
-    for (const auto& fname : dircontent) {
-        const auto file = dataPath_+DIR_SEPARATOR_STR+fname;
-        try {
-            std::ifstream ifs(file, std::ifstream::in | std::ifstream::binary);
-            std::istreambuf_iterator<char> begin(ifs), end;
-            values.emplace_back(dht::ValuesExport{dht::InfoHash(fname), std::vector<uint8_t>{begin, end}});
-        } catch (const std::exception& e) {
-            JAMI_ERR("[Account %s] error reading value from cache : %s", getAccountID().c_str(), e.what());
-        }
-        fileutils::remove(file);
-    }
-    JAMI_DBG("[Account %s] loaded %zu values", getAccountID().c_str(), values.size());
-    return values;
-}
-
 tls::DhParams
 JamiAccount::loadDhParams(std::string path)
 {
diff --git a/src/jamidht/jamiaccount.h b/src/jamidht/jamiaccount.h
index 19148a60431b4ad134503c567bd817956a726042..2edb7ed07a516572bf6cc0fedb5a32132f8d72f0 100644
--- a/src/jamidht/jamiaccount.h
+++ b/src/jamidht/jamiaccount.h
@@ -81,7 +81,6 @@ class JamiAccount : public SIPAccountBase {
 
     public:
         constexpr static const char* const ACCOUNT_TYPE = "RING";
-        constexpr static const in_port_t DHT_DEFAULT_PORT = 4222;
         constexpr static const char* const DHT_DEFAULT_BOOTSTRAP = "bootstrap.jami.net";
         constexpr static const char* const DHT_DEFAULT_PROXY = "dhtproxy.jami.net:[80-100]";
         constexpr static const char* const DHT_TYPE_NS = "cx.ring";
@@ -604,11 +603,9 @@ class JamiAccount : public SIPAccountBase {
         void updateArchive(AccountArchive& content) const;
         void saveArchive(AccountArchive& content, const std::string& pwd);
         AccountArchive readArchive(const std::string& pwd) const;
-        std::vector<dht::SockAddr> loadBootstrap() const;
+        std::vector<std::string> loadBootstrap() const;
 
         static std::pair<std::string, std::string> saveIdentity(const dht::crypto::Identity id, const std::string& path, const std::string& name);
-        void saveNodes(const std::vector<dht::NodeExport>&) const;
-        void saveValues(const std::vector<dht::ValuesExport>&) const;
 
         void loadTreatedCalls();
         void saveTreatedCalls() const;
@@ -634,9 +631,6 @@ class JamiAccount : public SIPAccountBase {
          * Otherwise, generate a new identity and returns it.
          */
         dht::crypto::Identity loadIdentity(const std::string& crt_path, const std::string& key_path, const std::string& key_pwd) const;
-        std::vector<dht::NodeExport> loadNodes() const;
-        std::vector<dht::ValuesExport> loadValues() const;
-        mutable std::mutex dhtValuesMtx_;
 
         bool dhtPublicInCalls_ {true};