diff --git a/src/value.cpp b/src/value.cpp
index ac2c8782327236da0b4a55353ba85eccf01244d2..7e12f7bb31de4c5a66f4b33f011bafeae378d46c 100644
--- a/src/value.cpp
+++ b/src/value.cpp
@@ -45,7 +45,7 @@ Value::Filter bindFilterRaw(FilterRaw raw_filter, void* user_data) {
 std::ostream& operator<< (std::ostream& s, const Value& v)
 {
     auto flags(s.flags());
-    s << "Value[id:" << std::hex << v.id << std::dec << " ";
+    s << "Value[id:" << std::hex << v.id << std::dec << ' ';
     if (v.isEncrypted())
         s << "encrypted ";
     else if (v.isSigned()) {
@@ -67,14 +67,23 @@ std::ostream& operator<< (std::ostream& s, const Value& v)
             }
 #endif
         } else {
-            s << "Data (type: " << v.type << " ): ";
-            s << std::hex;
-            for (auto i : v.data)
-                s << std::setfill('0') << std::setw(2) << (unsigned)i;
-            s << std::dec;
+            if (v.user_type.empty())
+                s << "data:";
+            else
+                s << "data(" << v.user_type << "):";
+            if (v.user_type == "text/plain") {
+                s << '"';
+                s.write((const char*)v.data.data(), v.data.size());
+                s << '"';
+            } else {
+                s << std::hex;
+                for (auto i : v.data)
+                    s << std::setfill('0') << std::setw(2) << (unsigned)i;
+                s << std::dec;
+            }
         }
     }
-    s << "]";
+    s << ']';
     s.flags(flags);
     return s;
 }
diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index 85eb7be783e33dd653f08a57ddc9926c3d1b91b7..7b70196eb0142cd5e49b6df3003fabfdb82f0262 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -384,10 +384,11 @@ void cmd_loop(std::shared_ptr<DhtRunner>& node, dht_params& params
         else if (op == "p") {
             std::string v;
             iss >> v;
-            node->put(id, dht::Value {
+            auto value = std::make_shared<dht::Value>(
                 dht::ValueType::USER_DATA.id,
-                std::vector<uint8_t> {v.begin(), v.end()}
-            }, [start](bool ok) {
+                std::vector<uint8_t> {v.begin(), v.end()});
+            value->user_type = "text/plain";
+            node->put(id, std::move(value), [start](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
                 std::cout << "Put: " << (ok ? "success" : "failure") << ", took " << print_duration(end-start) << std::endl;
             });
@@ -399,6 +400,7 @@ void cmd_loop(std::shared_ptr<DhtRunner>& node, dht_params& params
                 dht::ValueType::USER_DATA.id,
                 std::vector<uint8_t> {v.begin(), v.end()}
             );
+            value->user_type = "text/plain";
             node->put(id, value, [start,value](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
                 auto flags(std::cout.flags());
@@ -418,10 +420,10 @@ void cmd_loop(std::shared_ptr<DhtRunner>& node, dht_params& params
             }
             std::string v;
             iss >> v;
-            node->putSigned(id, dht::Value {
-                dht::ValueType::USER_DATA.id,
-                std::vector<uint8_t> {v.begin(), v.end()}
-            }, [start](bool ok) {
+            auto value = std::make_shared<dht::Value>();
+            value->data = {v.begin(), v.end()};
+            value->user_type = "text/plain";
+            node->putSigned(id, std::move(value), [start](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
                 std::cout << "Put signed: " << (ok ? "success" : "failure") << " (took " << print_duration(end-start) << "s)" << std::endl;
             });
@@ -434,10 +436,12 @@ void cmd_loop(std::shared_ptr<DhtRunner>& node, dht_params& params
             std::string tostr;
             std::string v;
             iss >> tostr >> v;
-            node->putEncrypted(id, InfoHash(tostr), dht::Value {
+            auto value = std::make_shared<dht::Value>(
                 dht::ValueType::USER_DATA.id,
                 std::vector<uint8_t> {v.begin(), v.end()}
-            }, [start](bool ok) {
+            );
+            value->user_type = "text/plain";
+            node->putEncrypted(id, InfoHash(tostr), std::move(value), [start](bool ok) {
                 auto end = std::chrono::high_resolution_clock::now();
                 std::cout << "Put encrypted: " << (ok ? "success" : "failure") << " (took " << print_duration(end-start) << std::endl;
             });