diff --git a/include/opendht/utils.h b/include/opendht/utils.h
index 0c33160aaab9d66e25e32a30661313250cce18c9..497b62a3f88a7a525132f05190052bea91b90b71 100644
--- a/include/opendht/utils.h
+++ b/include/opendht/utils.h
@@ -92,6 +92,18 @@ print_dt(DT d) {
     return std::chrono::duration_cast<std::chrono::duration<double>>(d).count();
 }
 
+template <class DT>
+static std::string
+print_duration(DT d) {
+    if (d < std::chrono::milliseconds(1)) {
+        return std::to_string(std::chrono::duration_cast<std::chrono::duration<double, std::micro>>(d).count()) +  " us";
+    } else if (d < std::chrono::seconds(1)) {
+        return std::to_string(std::chrono::duration_cast<std::chrono::duration<double, std::milli>>(d).count()) +  " ms";
+    } else {
+        return std::to_string(print_dt(d)) + " s";
+    }
+}
+
 template <typename Duration = duration>
 class uniform_duration_distribution : public std::uniform_int_distribution<typename Duration::rep> {
     using Base = std::uniform_int_distribution<typename Duration::rep>;
diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index 3d1937b8322fd2f71dba5a2f336219a209005001..660f3c977234d58ab30e85a1314724220c121884 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -308,14 +308,15 @@ void cmd_loop(std::shared_ptr<DhtRunner>& dht, dht_params& params
         if (op == "g") {
             std::string rem;
             std::getline(iss, rem);
-            dht->get(id, [start](std::shared_ptr<Value> value) {
+            dht->get(id, [start](const std::vector<std::shared_ptr<Value>>& values) {
                 auto now = std::chrono::high_resolution_clock::now();
-                std::cout << "Get: found value (after " << print_dt(now-start) << "s)" << std::endl;
-                std::cout << "\t" << *value << std::endl;
+                std::cout << "Get: found " << values.size() << " value(s) after " << print_duration(now-start) << std::endl;
+                for (const auto& value : values)
+                    std::cout << "\t" << *value << std::endl;
                 return true;
             }, [start](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
-                std::cout << "Get: " << (ok ? "completed" : "failure") << " (took " << print_dt(end-start) << "s)" << std::endl;
+                std::cout << "Get: " << (ok ? "completed" : "failure") << ", took " << print_duration(end-start) << std::endl;
             }, {}, dht::Where {rem});
         }
         else if (op == "q") {
@@ -324,13 +325,13 @@ void cmd_loop(std::shared_ptr<DhtRunner>& dht, dht_params& params
             dht->query(id, [start](const std::vector<std::shared_ptr<FieldValueIndex>>& field_value_indexes) {
                 auto now = std::chrono::high_resolution_clock::now();
                 for (auto& index : field_value_indexes) {
-                    std::cout << "Query: found field value index (after " << print_dt(now-start) << "s)" << std::endl;
+                    std::cout << "Query: found field value index after " << print_duration(now-start) << std::endl;
                     std::cout << "\t" << *index << std::endl;
                 }
                 return true;
             }, [start](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
-                std::cout << "Query: " << (ok ? "completed" : "failure") << " (took " << print_dt(end-start) << "s)" << std::endl;
+                std::cout << "Query: " << (ok ? "completed" : "failure") << ", took " << print_duration(end-start) << std::endl;
             }, dht::Query {rem});
         }
         else if (op == "l") {
@@ -365,7 +366,7 @@ void cmd_loop(std::shared_ptr<DhtRunner>& dht, dht_params& params
                 std::vector<uint8_t> {v.begin(), v.end()}
             }, [start](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
-                std::cout << "Put: " << (ok ? "success" : "failure") << " (took " << print_dt(end-start) << "s)" << std::endl;
+                std::cout << "Put: " << (ok ? "success" : "failure") << ", took " << print_duration(end-start) << std::endl;
             });
         }
         else if (op == "pp") {
@@ -378,7 +379,7 @@ void cmd_loop(std::shared_ptr<DhtRunner>& dht, dht_params& params
             dht->put(id, value, [start,value](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
                 auto flags(std::cout.flags());
-                std::cout << "Put: " << (ok ? "success" : "failure") << " (took " << print_dt(end-start) << "s). Value ID: " << std::hex << value->id << std::endl;
+                std::cout << "Put: " << (ok ? "success" : "failure") << ", took " << print_duration(end-start) << ". Value ID: " << std::hex << value->id << std::endl;
                 std::cout.flags(flags);
             }, time_point::max(), true);
         }
@@ -399,7 +400,7 @@ void cmd_loop(std::shared_ptr<DhtRunner>& dht, dht_params& params
                 std::vector<uint8_t> {v.begin(), v.end()}
             }, [start](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
-                std::cout << "Put signed: " << (ok ? "success" : "failure") << " (took " << print_dt(end-start) << "s)" << std::endl;
+                std::cout << "Put signed: " << (ok ? "success" : "failure") << " (took " << print_duration(end-start) << "s)" << std::endl;
             });
         }
         else if (op == "e") {
@@ -415,7 +416,7 @@ void cmd_loop(std::shared_ptr<DhtRunner>& dht, dht_params& params
                 std::vector<uint8_t> {v.begin(), v.end()}
             }, [start](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
-                std::cout << "Put encrypted: " << (ok ? "success" : "failure") << " (took " << print_dt(end-start) << "s)" << std::endl;
+                std::cout << "Put encrypted: " << (ok ? "success" : "failure") << " (took " << print_duration(end-start) << std::endl;
             });
         }
         else if (op == "a") {
@@ -423,7 +424,7 @@ void cmd_loop(std::shared_ptr<DhtRunner>& dht, dht_params& params
             iss >> port;
             dht->put(id, dht::Value {dht::IpServiceAnnouncement::TYPE.id, dht::IpServiceAnnouncement(port)}, [start](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
-                std::cout << "Announce: " << (ok ? "success" : "failure") << " (took " << print_dt(end-start) << "s)" << std::endl;
+                std::cout << "Announce: " << (ok ? "success" : "failure") << " (took " << print_duration(end-start) << std::endl;
             });
         }
 #ifdef OPENDHT_INDEXATION
@@ -446,7 +447,7 @@ void cmd_loop(std::shared_ptr<DhtRunner>& dht, dht_params& params
                     [start](bool ok) {
                         auto end = std::chrono::high_resolution_clock::now();
                         std::cout << "Pht::lookup: " << (ok ? "done." : "failed.")
-                                  << " took " << print_dt(end-start) << "s)" << std::endl;
+                                  << " took " << print_duration(end-start) << std::endl;
 
                     }, exact_match.size() != 0 and exact_match == "false" ? false : true
                 );