diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h
index 57f060fc9f8cea09e1dbdcf784e6e0a959f640e5..6d55aecc12472cf07c8168de237e31303b0785f1 100644
--- a/include/opendht/dhtrunner.h
+++ b/include/opendht/dhtrunner.h
@@ -149,26 +149,40 @@ public:
     void cancelListen(InfoHash h, size_t token);
     void cancelListen(InfoHash h, std::shared_future<size_t> token);
 
-    void put(InfoHash hash, Value&& value, Dht::DoneCallback cb=nullptr);
-    void put(InfoHash hash, const std::shared_ptr<Value>&, Dht::DoneCallback cb=nullptr);
+    void put(InfoHash hash, std::shared_ptr<Value> value, Dht::DoneCallback cb={});
+    void put(InfoHash hash, std::shared_ptr<Value> value, Dht::DoneCallbackSimple cb) {
+        put(hash, value, Dht::bindDoneCb(cb));
+    }
+
+    void put(InfoHash hash, Value&& value, Dht::DoneCallback cb={});
     void put(InfoHash hash, Value&& value, Dht::DoneCallbackSimple cb) {
         put(hash, std::forward<Value>(value), Dht::bindDoneCb(cb));
     }
-    void put(const std::string& key, Value&& value, Dht::DoneCallbackSimple cb=nullptr);
+    void put(const std::string& key, Value&& value, Dht::DoneCallbackSimple cb={});
 
     void cancelPut(const InfoHash& h, const Value::Id& id);
 
-    void putSigned(InfoHash hash, Value&& value, Dht::DoneCallback cb=nullptr);
-    void putSigned(const std::string& key, Value&& value, Dht::DoneCallbackSimple cb=nullptr);
+    void putSigned(InfoHash hash, std::shared_ptr<Value> value, Dht::DoneCallback cb={});
+    void putSigned(InfoHash hash, std::shared_ptr<Value> value, Dht::DoneCallbackSimple cb) {
+        putSigned(hash, value, Dht::bindDoneCb(cb));
+    }
+
+    void putSigned(InfoHash hash, Value&& value, Dht::DoneCallback cb={});
     void putSigned(InfoHash hash, Value&& value, Dht::DoneCallbackSimple cb) {
         putSigned(hash, std::forward<Value>(value), Dht::bindDoneCb(cb));
     }
+    void putSigned(const std::string& key, Value&& value, Dht::DoneCallbackSimple cb={});
+
+    void putEncrypted(InfoHash hash, InfoHash to, std::shared_ptr<Value> value, Dht::DoneCallback cb={});
+    void putEncrypted(InfoHash hash, InfoHash to, std::shared_ptr<Value> value, Dht::DoneCallbackSimple cb) {
+        putEncrypted(hash, to, value, Dht::bindDoneCb(cb));
+    }
 
-    void putEncrypted(InfoHash hash, InfoHash to, Value&& value, Dht::DoneCallback cb=nullptr);
+    void putEncrypted(InfoHash hash, InfoHash to, Value&& value, Dht::DoneCallback cb={});
     void putEncrypted(InfoHash hash, InfoHash to, Value&& value, Dht::DoneCallbackSimple cb) {
         putEncrypted(hash, to, std::forward<Value>(value), Dht::bindDoneCb(cb));
     }
-    void putEncrypted(const std::string& key, InfoHash to, Value&& value, Dht::DoneCallback cb=nullptr);
+    void putEncrypted(const std::string& key, InfoHash to, Value&& value, Dht::DoneCallback cb={});
 
     void bootstrap(const char* host, const char* service);
     void bootstrap(const std::vector<std::pair<sockaddr_storage, socklen_t>>& nodes);
diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp
index 52f6b65df6954a38ee8b400c5137c53be2606fae..b836c3ff8c6438e0b7bf21ef6eed741e50150cc7 100644
--- a/src/dhtrunner.cpp
+++ b/src/dhtrunner.cpp
@@ -359,7 +359,7 @@ DhtRunner::put(InfoHash hash, Value&& value, Dht::DoneCallback cb)
 }
 
 void
-DhtRunner::put(InfoHash hash, const std::shared_ptr<Value>& value, Dht::DoneCallback cb)
+DhtRunner::put(InfoHash hash, std::shared_ptr<Value> value, Dht::DoneCallback cb)
 {
     std::lock_guard<std::mutex> lck(storage_mtx);
     pending_ops.emplace([=](SecureDht& dht) {
@@ -385,16 +385,21 @@ DhtRunner::cancelPut(const InfoHash& h , const Value::Id& id)
 }
 
 void
-DhtRunner::putSigned(InfoHash hash, Value&& value, Dht::DoneCallback cb)
+DhtRunner::putSigned(InfoHash hash, std::shared_ptr<Value> value, Dht::DoneCallback cb)
 {
     std::lock_guard<std::mutex> lck(storage_mtx);
-    auto sv = std::make_shared<Value>(std::move(value));
     pending_ops.emplace([=](SecureDht& dht) {
-        dht.putSigned(hash, sv, cb);
+        dht.putSigned(hash, value, cb);
     });
     cv.notify_all();
 }
 
+void
+DhtRunner::putSigned(InfoHash hash, Value&& value, Dht::DoneCallback cb)
+{
+    putSigned(hash, std::make_shared<Value>(std::move(value)), cb);
+}
+
 void
 DhtRunner::putSigned(const std::string& key, Value&& value, Dht::DoneCallbackSimple cb)
 {
@@ -402,16 +407,21 @@ DhtRunner::putSigned(const std::string& key, Value&& value, Dht::DoneCallbackSim
 }
 
 void
-DhtRunner::putEncrypted(InfoHash hash, InfoHash to, Value&& value, Dht::DoneCallback cb)
+DhtRunner::putEncrypted(InfoHash hash, InfoHash to, std::shared_ptr<Value> value, Dht::DoneCallback cb)
 {
-    std::lock_guard<std::mutex> lck(storage_mtx);
-    auto sv = std::make_shared<Value>(std::move(value));
+    std::lock_guard<std::mutex> lck(storage_mtx);    
     pending_ops.emplace([=](SecureDht& dht) {
-        dht.putEncrypted(hash, to, sv, cb);
+        dht.putEncrypted(hash, to, value, cb);
     });
     cv.notify_all();
 }
 
+void
+DhtRunner::putEncrypted(InfoHash hash, InfoHash to, Value&& value, Dht::DoneCallback cb)
+{
+    putEncrypted(hash, to, std::make_shared<Value>(std::move(value)), cb);
+}
+
 void
 DhtRunner::putEncrypted(const std::string& key, InfoHash to, Value&& value, Dht::DoneCallback cb)
 {