diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index 2966121edb600efd05e398678d266ef2881f21a1..05ccd202ee6096276b8f35b94f677e40d4cd65fe 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -327,15 +327,17 @@ void cmd_loop(std::shared_ptr<DhtRunner>& node, dht_params& params
         if (op == "g") {
             std::string rem;
             std::getline(iss, rem);
-            node->get(id, [start](const std::vector<std::shared_ptr<Value>>& values) {
+            auto total = std::make_shared<size_t>();
+            node->get(id, [start, total](const std::vector<std::shared_ptr<Value>>& values) {
                 auto now = std::chrono::high_resolution_clock::now();
-                std::cout << "Get: found " << values.size() << " value(s) after " << print_duration(now-start) << std::endl;
+                (*total) += values.size();
+                std::cout << "Get: found " << values.size() << " value(s) after " << print_duration(now-start) << " (total " << *total << ')' << std::endl;
                 for (const auto& value : values)
                     std::cout << "\t" << *value << std::endl;
                 return true;
-            }, [start](bool ok) {
+            }, [start, total](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
-                std::cout << "Get: " << (ok ? "completed" : "failure") << ", took " << print_duration(end-start) << std::endl;
+                std::cout << "Get: " << (ok ? "completed" : "failure") << ", took " << print_duration(end-start) << " (total " << *total << ')' << std::endl;
             }, {}, dht::Where {rem});
         }
         else if (op == "q") {
@@ -356,8 +358,13 @@ void cmd_loop(std::shared_ptr<DhtRunner>& node, dht_params& params
         else if (op == "l") {
             std::string rem;
             std::getline(iss, rem);
-            auto token = node->listen(id, [](const std::vector<std::shared_ptr<Value>>& values, bool expired) {
-                std::cout << "Listen: found " << values.size() << " values" << (expired ? " expired" : "") << std::endl;
+            auto total = std::make_shared<size_t>();
+            auto token = node->listen(id, [total](const std::vector<std::shared_ptr<Value>>& values, bool expired) {
+                if (expired)
+                    (*total) -= values.size();
+                else
+                    (*total) += values.size();
+                std::cout << "Listen: found " << values.size() << " values" << (expired ? " expired" : "") << " (total " << *total << ')' << std::endl;
                 for (const auto& value : values)
                     std::cout << "\t" << *value << std::endl;
                 return true;