diff --git a/include/opendht/dht.h b/include/opendht/dht.h
index d294404be969998efb6e6dccb4218ba931a5bc17..a49892beff5ad42c610a70506926b8f7e4076119 100644
--- a/include/opendht/dht.h
+++ b/include/opendht/dht.h
@@ -137,15 +137,15 @@ public:
                         cb and donecb won't be called again afterward.
      * @param f a filter function used to prefilter values.
      */
-    void get(const InfoHash& key, GetCallback cb, DoneCallback donecb=nullptr, Value::Filter f = Value::AllFilter());
-    void get(const InfoHash& key, GetCallback cb, DoneCallbackSimple donecb, Value::Filter f = Value::AllFilter()) {
-        get(key, cb, bindDoneCb(donecb), f);
+    virtual void get(const InfoHash& key, GetCallback cb, DoneCallback donecb={}, Value::Filter&& f={});
+    virtual void get(const InfoHash& key, GetCallback cb, DoneCallbackSimple donecb={}, Value::Filter&& f={}) {
+        get(key, cb, bindDoneCb(donecb), std::forward<Value::Filter>(f));
     }
-    void get(const InfoHash& key, GetCallbackSimple cb, DoneCallback donecb=nullptr, Value::Filter f = Value::AllFilter()) {
-        get(key, bindGetCb(cb), donecb, f);
+    void get(const InfoHash& key, GetCallbackSimple cb, DoneCallback donecb={}, Value::Filter&& f={}) {
+        get(key, bindGetCb(cb), donecb, std::forward<Value::Filter>(f));
     }
-    void get(const InfoHash& key, GetCallbackSimple cb, DoneCallbackSimple donecb, Value::Filter f = Value::AllFilter()) {
-        get(key, bindGetCb(cb), bindDoneCb(donecb), f);
+    void get(const InfoHash& key, GetCallbackSimple cb, DoneCallbackSimple donecb, Value::Filter&& f={}) {
+        get(key, bindGetCb(cb), bindDoneCb(donecb), std::forward<Value::Filter>(f));
     }
 
     /**
@@ -203,9 +203,9 @@ public:
      *
      * @return a token to cancel the listener later.
      */
-    size_t listen(const InfoHash&, GetCallback, Value::Filter = Value::AllFilter());
-    size_t listen(const InfoHash& key, GetCallbackSimple cb, Value::Filter f = Value::AllFilter()) {
-        return listen(key, bindGetCb(cb), f);
+    virtual size_t listen(const InfoHash&, GetCallback, Value::Filter&&={});
+    virtual size_t listen(const InfoHash& key, GetCallbackSimple cb, Value::Filter f={}) {
+        return listen(key, bindGetCb(cb), std::forward<Value::Filter>(f));
     }
 
     bool cancelListen(const InfoHash&, size_t token);
diff --git a/include/opendht/securedht.h b/include/opendht/securedht.h
index 9496ab775c5e429b57a3e42d3b243325a758ce39..b5dd7774de5db6393c59b453952b94f4b3f1152f 100644
--- a/include/opendht/securedht.h
+++ b/include/opendht/securedht.h
@@ -85,12 +85,12 @@ public:
      * If the signature can't be checked, or if the data can't be decrypted, it is not returned.
      * Public, non-signed & non-encrypted data is retransmitted as-is.
      */
-    void get(const InfoHash& id, GetCallback cb, DoneCallback donecb, Value::Filter&& = {});
-    void get(const InfoHash& id, GetCallback cb, DoneCallbackSimple donecb, Value::Filter&& f = {}) {
+    virtual void get(const InfoHash& id, GetCallback cb, DoneCallback donecb={}, Value::Filter&& = {}) override;
+    virtual void get(const InfoHash& id, GetCallback cb, DoneCallbackSimple donecb={}, Value::Filter&& f = {}) override {
         get(id, cb, bindDoneCb(donecb), std::forward<Value::Filter>(f));
     }
 
-    size_t listen(const InfoHash& id, GetCallback cb, Value::Filter&& = {});
+    virtual size_t listen(const InfoHash& id, GetCallback cb, Value::Filter&& = {}) override;
 
     /**
      * Will take ownership of the value, sign it using our private key and put it in the DHT.
diff --git a/src/dht.cpp b/src/dht.cpp
index 46ad883db6ec4af82a01cc58d78b654a4f610eb7..702e32ce13737e970ac9002361c5dce78a09f453 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -1063,7 +1063,7 @@ Dht::listenTo(const InfoHash& id, sa_family_t af, GetCallback cb, Value::Filter
 }
 
 size_t
-Dht::listen(const InfoHash& id, GetCallback cb, Value::Filter f)
+Dht::listen(const InfoHash& id, GetCallback cb, Value::Filter&& f)
 {
     scheduler.syncTime();
 
@@ -1200,7 +1200,7 @@ struct OpStatus {
 };
 
 void
-Dht::get(const InfoHash& id, GetCallback getcb, DoneCallback donecb, Value::Filter filter)
+Dht::get(const InfoHash& id, GetCallback getcb, DoneCallback donecb, Value::Filter&& filter)
 {
     scheduler.syncTime();