diff --git a/tools/dhtcnode.c b/tools/dhtcnode.c
index ced538e8a5deaa0333d43679230f9806486fea7b..73320a838313adbb70fa06580259dece736a55de 100644
--- a/tools/dhtcnode.c
+++ b/tools/dhtcnode.c
@@ -36,12 +36,18 @@ struct op_context {
 struct listen_context {
     dht_runner* runner;
     dht_op_token* token;
+    size_t count;
 };
 
 bool dht_value_callback(const dht_value* value, bool expired, void* user_data)
 {
+    struct listen_context* ctx = (struct listen_context*) user_data;
+    if (expired)
+        ctx->count--;
+    else
+        ctx->count++;
     dht_data_view data = dht_value_get_data(value);
-    printf("Value callback %s: %.*s.\n", expired ? "expired" : "new", (int)data.size, data.data);
+    printf("Listen: %s value: %.*s (total %zu).\n", expired ? "expired" : "new", (int)data.size, data.data, ctx->count);
     return true;
 }
 
@@ -176,9 +182,9 @@ int main(int argc, char **argv)
 
     dht_runner* runner = dht_runner_new();
     dht_runner_config dht_config;
-	dht_runner_config_default(&dht_config);
-	dht_config.peer_discovery = params.peer_discovery; // Look for other peers on the network
-	dht_config.peer_publish = params.peer_discovery; // Publish our own peer info
+    dht_runner_config_default(&dht_config);
+    dht_config.peer_discovery = params.peer_discovery; // Look for other peers on the network
+    dht_config.peer_publish = params.peer_discovery; // Publish our own peer info
     dht_config.dht_config.node_config.network = params.network;
     dht_config.log = params.log;
     dht_runner_run_config(runner, params.port, &dht_config);
@@ -193,12 +199,11 @@ int main(int argc, char **argv)
     char value[256];
     while (true) {
         const char* line_read = readline("> ");
-        if (line_read && *line_read)
-            add_history(line_read);
         if (!line_read)
             break;
-        if (!strcmp(line_read, "\0"))
+        if (!*line_read)
             continue;
+        add_history(line_read);
 
         memset(cmd, 0, sizeof cmd);
         memset(arg, 0, sizeof arg);
@@ -218,6 +223,10 @@ int main(int argc, char **argv)
                 free(addrs);
             }
             continue;
+        } else if (!strcmp(cmd, "ll")) {
+            dht_infohash node_id = dht_runner_get_node_id(runner);
+            printf("DHT node %s running on port %u\n", dht_infohash_print(&node_id), dht_runner_get_bound_port(runner, AF_INET));
+            continue;
         }
 
         dht_infohash key;
@@ -231,6 +240,7 @@ int main(int argc, char **argv)
         } else if (!strcmp(cmd, "l")) {
             struct listen_context* ctx = malloc(sizeof(struct listen_context));
             ctx->runner = runner;
+            ctx->count = 0;
             ctx->token = dht_runner_listen(runner, &key, dht_value_callback, listen_context_free, ctx);
         } else if (!strcmp(cmd, "p")) {
             dht_value* val = dht_value_new_from_string(value);