diff --git a/include/opendht/dht.h b/include/opendht/dht.h
index 48cfd03802ab701454d7a6ce2ff9204065f5690d..8bbe2463a378b0bf9555f98dd6e0b0f7a2db6d7f 100644
--- a/include/opendht/dht.h
+++ b/include/opendht/dht.h
@@ -453,7 +453,7 @@ private:
     void expireStorage(InfoHash h);
     void expireStore(decltype(store)::iterator);
 
-    void storageChanged(const InfoHash& id, Storage& st, ValueStorage&, bool newValue);
+    void storageChanged(const InfoHash& id, Storage& st, const Sp<Value>&, bool newValue);
     std::string printStorageLog(const decltype(store)::value_type&) const;
 
     /**
diff --git a/src/dht.cpp b/src/dht.cpp
index 19b002ba8088c67c9acbb236d07bbc9440886e68..fc9bc0ad39125f4503090515523b3b818b4b1751 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -1202,7 +1202,7 @@ Dht::cancelPut(const InfoHash& id, const Value::Id& vid)
 // Storage
 
 void
-Dht::storageChanged(const InfoHash& id, Storage& st, ValueStorage& v, bool newValue)
+Dht::storageChanged(const InfoHash& id, Storage& st, const Sp<Value>& v, bool newValue)
 {
     if (newValue) {
         if (not st.local_listeners.empty()) {
@@ -1212,8 +1212,8 @@ Dht::storageChanged(const InfoHash& id, Storage& st, ValueStorage& v, bool newVa
             cbs.reserve(st.local_listeners.size());
             for (const auto& l : st.local_listeners) {
                 std::vector<Sp<Value>> vals;
-                if (not l.second.filter or l.second.filter(*v.data))
-                    vals.push_back(v.data);
+                if (not l.second.filter or l.second.filter(*v))
+                    vals.push_back(v);
                 if (not vals.empty()) {
                     if (logger_)
                         logger_->d(id, "[store %s] sending update local listener with token %lu",
@@ -1234,14 +1234,14 @@ Dht::storageChanged(const InfoHash& id, Storage& st, ValueStorage& v, bool newVa
         for (const auto& node_listeners : st.listeners) {
             for (const auto& l : node_listeners.second) {
                 auto f = l.second.query.where.getFilter();
-                if (f and not f(*v.data))
+                if (f and not f(*v))
                     continue;
                 if (logger_)
                     logger_->w(id, node_listeners.first->id, "[store %s] [node %s] sending update",
                         id.toString().c_str(),
                         node_listeners.first->toString().c_str());
                 std::vector<Sp<Value>> vals {};
-                vals.push_back(v.data);
+                vals.push_back(v);
                 Blob ntoken = makeToken(node_listeners.first->getAddr(), false);
                 network_engine.tellListener(node_listeners.first, l.first, id, 0, ntoken, {}, {},
                         std::move(vals), l.second.query, l.second.version);
@@ -1284,7 +1284,7 @@ Dht::storageStore(const InfoHash& id, const Sp<Value>& value, time_point created
         if (total_store_size > max_store_size) {
             expireStore();
         }
-        storageChanged(id, st->second, *vs, store.second.values_diff > 0);
+        storageChanged(id, st->second, vs->data, store.second.values_diff > 0);
     }
 
     return std::get<0>(store);