diff --git a/tools/dhtchat.cpp b/tools/dhtchat.cpp
index 2dff83632c6c94bf632de6833d99f7babe9503cc..eb1c9d7ff4a50fe9099e6998f9ae8b51b92ac516 100644
--- a/tools/dhtchat.cpp
+++ b/tools/dhtchat.cpp
@@ -62,16 +62,37 @@ main(int argc, char **argv)
 
     DhtRunner dht;
     try {
-        dht.run(params.port, dht::crypto::generateIdentity("DHT Chat Node"), true, params.network);
+        if (not params.id.first) {
+            auto node_ca = std::make_unique<dht::crypto::Identity>(dht::crypto::generateEcIdentity("DHT Node CA"));
+            params.id = dht::crypto::generateIdentity("DHT Chat Node", *node_ca);
+            if (not params.save_identity.empty()) {
+                dht::crypto::saveIdentity(*node_ca, params.save_identity + "_ca", params.privkey_pwd);
+                dht::crypto::saveIdentity(params.id, params.save_identity, params.privkey_pwd);
+            }
+        }
 
+        dht::DhtRunner::Config config {};
+        config.dht_config.node_config.network = params.network;
+        config.dht_config.node_config.maintain_storage = false;
+        config.dht_config.node_config.persist_path = params.persist_path;
+        config.dht_config.id = params.id;
+        config.threaded = true;
+        config.proxy_server = params.proxyclient;
+        config.push_node_id = "dhtnode";
+        config.push_token = params.devicekey;
+        config.peer_discovery = params.peer_discovery;
+        config.peer_publish = params.peer_discovery;
+
+        dht::DhtRunner::Context context {};
         if (params.log) {
-            if (params.syslog)
-                log::enableSyslog(dht, "dhtnode");
+            if (params.syslog or (params.daemonize and params.logfile.empty()))
+                context.logger = log::getSyslogLogger("dhtnode");
             else if (not params.logfile.empty())
-                log::enableFileLogging(dht, params.logfile);
+                context.logger = log::getFileLogger(params.logfile);
             else
-                log::enableLogging(dht);
+                context.logger = log::getStdLogger();
         }
+        dht.run(params.port, config, std::move(context));
 
         if (not params.bootstrap.first.empty())
             dht.bootstrap(params.bootstrap.first.c_str(), params.bootstrap.second.c_str());
diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index 06d7799f416d63ca5b2fbe872ca03e2b562cc1dc..b80d8cb8db6585e48290ede5bbd33ce2d7ec494c 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -549,10 +549,9 @@ main(int argc, char **argv)
         config.threaded = true;
         config.proxy_server = params.proxyclient;
         config.push_node_id = "dhtnode";
+        config.push_token = params.devicekey;
         config.peer_discovery = params.peer_discovery;
         config.peer_publish = params.peer_discovery;
-        if (not params.proxyclient.empty())
-            node->setPushNotificationToken(params.devicekey);
 
         dht::DhtRunner::Context context {};
         if (params.log) {
@@ -564,8 +563,6 @@ main(int argc, char **argv)
                 context.logger = log::getStdLogger();
         }
         node->run(params.port, config, std::move(context));
-        if (context.logger)
-            log::enableLogging(*node);
 
         if (not params.bootstrap.first.empty()) {
             std::cout << "Bootstrap: " << params.bootstrap.first << ":" << params.bootstrap.second << std::endl;