diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index 189fb6375c849075063dfa03a64c292ec1402434..45e6ef41a467efeb56ad4371844711753c7f1fdf 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -505,6 +505,8 @@ main(int argc, char **argv)
         config.threaded = true;
         config.proxy_server = params.proxyclient;
         config.push_node_id = "dhtnode";
+        config.peer_discovery = params.peer_discovery;
+        config.peer_publish = params.peer_discovery;
         if (not params.proxyclient.empty())
             dht->setPushNotificationToken(params.devicekey);
 
diff --git a/tools/tools_common.h b/tools/tools_common.h
index 39671475bd5ccdbdf7f50d11c2f67e7aba176351..f0ff4c26edbb4dc3c9b003f1b39761166cf548e5 100644
--- a/tools/tools_common.h
+++ b/tools/tools_common.h
@@ -98,6 +98,7 @@ struct dht_params {
     bool generate_identity {false};
     bool daemonize {false};
     bool service {false};
+    bool peer_discovery {false};
     std::pair<std::string, std::string> bootstrap {};
     in_port_t proxyserver {0};
     std::string proxyclient {};
@@ -107,29 +108,30 @@ struct dht_params {
 };
 
 static const constexpr struct option long_options[] = {
-   {"help",       no_argument      , nullptr, 'h'},
-   {"port",       required_argument, nullptr, 'p'},
-   {"net",        required_argument, nullptr, 'n'},
-   {"bootstrap",  required_argument, nullptr, 'b'},
-   {"identity",   no_argument      , nullptr, 'i'},
-   {"verbose",    no_argument      , nullptr, 'v'},
-   {"daemonize",  no_argument      , nullptr, 'd'},
-   {"service",    no_argument      , nullptr, 's'},
-   {"persist",    required_argument, nullptr, 'f'},
-   {"logfile",    required_argument, nullptr, 'l'},
-   {"syslog",     no_argument      , nullptr, 'L'},
-   {"proxyserver",required_argument, nullptr, 'S'},
-   {"proxyclient",required_argument, nullptr, 'C'},
-   {"pushserver", required_argument, nullptr, 'P'},
-   {"devicekey",  required_argument, nullptr, 'D'},
-   {nullptr,      0                , nullptr,  0}
+   {"help",             no_argument      , nullptr, 'h'},
+   {"port",             required_argument, nullptr, 'p'},
+   {"net",              required_argument, nullptr, 'n'},
+   {"bootstrap",        required_argument, nullptr, 'b'},
+   {"identity",         no_argument      , nullptr, 'i'},
+   {"verbose",          no_argument      , nullptr, 'v'},
+   {"daemonize",        no_argument      , nullptr, 'd'},
+   {"service",          no_argument      , nullptr, 's'},
+   {"peer-discovery",   no_argument      , nullptr, 'D'},
+   {"persist",          required_argument, nullptr, 'f'},
+   {"logfile",          required_argument, nullptr, 'l'},
+   {"syslog",           no_argument      , nullptr, 'L'},
+   {"proxyserver",      required_argument, nullptr, 'S'},
+   {"proxyclient",      required_argument, nullptr, 'C'},
+   {"pushserver",       required_argument, nullptr, 'y'},
+   {"devicekey",        required_argument, nullptr, 'z'},
+   {nullptr,            0                , nullptr,  0}
 };
 
 dht_params
 parseArgs(int argc, char **argv) {
     dht_params params;
     int opt;
-    while ((opt = getopt_long(argc, argv, "hidsvp:n:b:f:l:", long_options, nullptr)) != -1) {
+    while ((opt = getopt_long(argc, argv, "hidsvDp:n:b:f:l:", long_options, nullptr)) != -1) {
         switch (opt) {
         case 'p': {
                 int port_arg = atoi(optarg);
@@ -147,13 +149,16 @@ parseArgs(int argc, char **argv) {
                     std::cout << "Invalid port: " << port_arg << std::endl;
             }
             break;
-        case 'P':
+        case 'D':
+            params.peer_discovery = true;
+            break;
+        case 'y':
             params.pushserver = optarg;
             break;
         case 'C':
             params.proxyclient = optarg;
             break;
-        case 'D':
+        case 'z':
             params.devicekey = optarg;
             break;
         case 'f':