diff --git a/doc/dhtnode.1 b/doc/dhtnode.1
index 368ba94dce68ec093cfea5666a3a823946c698a0..2aca2c673edac16f811b3c166677d28d1f48aeff 100644
--- a/doc/dhtnode.1
+++ b/doc/dhtnode.1
@@ -1,4 +1,4 @@
-.TH DHTNODE 1 2016-06-27
+.TH DHTNODE 1 2016-07-29
 
 .SH NAME
 .B dhtnode
@@ -7,7 +7,7 @@
 .SH SYNOPSIS
 .B dhtnode [-h]
 
-.B dhtnode [-v[\fIlogfile\fP]] [-i] [-d] [-n \fInetwork_id\fP] [-p \fIlocal_port\fP] [-b[\fIbootstrap_host\fP[:\fIport\fP]]]
+.B dhtnode [-v [-l \fIlogfile\fP]] [-i] [-d] [-n \fInetwork_id\fP] [-p \fIlocal_port\fP] [-b \fIbootstrap_host\fP[:\fIport\fP]]
 
 .SH DESCRIPTION
 
diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index cbaed12318ae81831033caf7dc310a35d3d7b02d..656ed30506b017d90c3b1ca851bcfe5745c0b3b0 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -29,7 +29,7 @@ extern "C" {
 using namespace dht;
 
 void print_usage() {
-    std::cout << "Usage: dhtnode [-v[logfile]] [-i] [-d] [-n network_id] [-p local_port] [-b[bootstrap_host[:port]]]" << std::endl << std::endl;
+    std::cout << "Usage: dhtnode [-v [-l logfile]] [-i] [-d] [-n network_id] [-p local_port] [-b bootstrap_host[:port]]" << std::endl << std::endl;
     std::cout << "dhtnode, a simple OpenDHT command line node runner." << std::endl;
     std::cout << "Report bugs to: http://opendht.net" << std::endl;
 }
@@ -40,8 +40,6 @@ void print_id_req() {
 
 void print_node_info(const DhtRunner& dht, const dht_params& params) {
     std::cout << "OpenDht node " << dht.getNodeId() << " running on port " <<  dht.getBoundPort() << std::endl;
-    if (params.is_bootstrap_node)
-        std::cout << "Running in bootstrap mode (discouraged)." << std::endl;
     if (params.generate_identity)
         std::cout << "Public key ID " << dht.getId() << std::endl;
 }
diff --git a/tools/tools_common.h b/tools/tools_common.h
index 07418b4edb96b31236ff54aa59ed8007ded140e9..45f6b8273e0fbc71973894f3d6b58dcf1e0f2ff7 100644
--- a/tools/tools_common.h
+++ b/tools/tools_common.h
@@ -143,57 +143,55 @@ struct dht_params {
     std::string logfile {};
     in_port_t port {0};
     dht::NetId network {0};
-    bool is_bootstrap_node {false};
     bool generate_identity {false};
     bool daemonize {false};
     std::pair<std::string, std::string> bootstrap {};
 };
 
 static const constexpr struct option long_options[] = {
-   {"help",       no_argument,       nullptr, 'h'},
+   {"help",       no_argument      , nullptr, 'h'},
    {"port",       required_argument, nullptr, 'p'},
    {"net",        required_argument, nullptr, 'n'},
-   {"bootstrap",  optional_argument, nullptr, 'b'},
+   {"bootstrap",  required_argument, nullptr, 'b'},
    {"identity",   no_argument      , nullptr, 'i'},
-   {"verbose",    optional_argument, nullptr, 'v'},
+   {"verbose",    no_argument      , nullptr, 'v'},
    {"daemonize",  no_argument      , nullptr, 'd'},
-   {nullptr,      0,                 nullptr,  0}
+   {"logfile",    required_argument, nullptr, 'l'},
+   {nullptr,      0                , nullptr,  0}
 };
 
 dht_params
 parseArgs(int argc, char **argv) {
     dht_params params;
     int opt;
-    while ((opt = getopt_long(argc, argv, "hidv::p:n:b::", long_options, nullptr)) != -1) {
+    while ((opt = getopt_long(argc, argv, "hidvp:n:b:l:", long_options, nullptr)) != -1) {
         switch (opt) {
         case 'p': {
                 int port_arg = atoi(optarg);
                 if (port_arg >= 0 && port_arg < 0x10000)
                     params.port = port_arg;
                 else
-                    std::cerr << "Invalid port: " << port_arg << std::endl;
+                    std::cout << "Invalid port: " << port_arg << std::endl;
             }
             break;
         case 'n':
             params.network = strtoul(optarg, nullptr, 0);
             break;
         case 'b':
-            if (optarg) {
-                params.bootstrap = splitPort((optarg[0] == '=') ? optarg+1 : optarg);
-                if (not params.bootstrap.first.empty() and params.bootstrap.second.empty()) {
-                    std::stringstream ss;
-                    ss << DHT_DEFAULT_PORT;
-                    params.bootstrap.second = ss.str();
-                }
-            } else
-                params.is_bootstrap_node = true;
+            params.bootstrap = splitPort((optarg[0] == '=') ? optarg+1 : optarg);
+            if (not params.bootstrap.first.empty() and params.bootstrap.second.empty()) {
+                std::stringstream ss;
+                ss << DHT_DEFAULT_PORT;
+                params.bootstrap.second = ss.str();
+            }
             break;
         case 'h':
             params.help = true;
             break;
+        case 'l':
+            params.logfile = optarg;
+            break;
         case 'v':
-            if (optarg)
-                params.logfile = optarg;
             params.log = true;
             break;
         case 'i':
@@ -202,9 +200,6 @@ parseArgs(int argc, char **argv) {
         case 'd':
             params.daemonize = true;
             break;
-        case '?':
-            std::cerr << "unrecognized option -- '" << static_cast<char>(optopt) << '\'' << std::endl;
-            exit(EXIT_FAILURE);
         default:
             break;
         }