diff --git a/include/opendht/dht.h b/include/opendht/dht.h
index 9e5bc7fedc7d008533e36f04391d68675a72077b..9a21b308b2589041837b486048f03457da164df6 100644
--- a/include/opendht/dht.h
+++ b/include/opendht/dht.h
@@ -78,6 +78,7 @@ struct Node {
         return print_addr(ss, sslen);
     }
     bool isExpired(time_point now) const;
+    bool isExpired() const { return isExpired(clock::now()); }
     bool isGood(time_point now) const;
     bool isMessagePending(time_point now) const;
     NodeExport exportNode() const { return NodeExport {id, ss, sslen}; }
@@ -584,7 +585,7 @@ private:
 
         bool removeExpiredNode(time_point now);
 
-        std::vector<std::shared_ptr<Node>> getNodes(time_point now) const;
+        std::vector<std::shared_ptr<Node>> getNodes() const;
     };
 
     struct ValueStorage {
diff --git a/src/dht.cpp b/src/dht.cpp
index 1b95ce7b1b8fd38e318b04f9da79d310138f9bf1..1279386d52682e7136c7e16543d86f47fae27a26 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -760,18 +760,12 @@ Dht::Search::insertNode(std::shared_ptr<Node> node, time_point now, const Blob&
 }
 
 std::vector<std::shared_ptr<Node>>
-Dht::Search::getNodes(time_point now) const
+Dht::Search::getNodes() const
 {
     std::vector<std::shared_ptr<Node>> ret {};
-    ret.reserve(TARGET_NODES);
-    //size_t i = 0;
-    for (const auto& sn : nodes) {
-        if (not sn.node->isExpired(now) and sn.isSynced(now)) {
-            ret.emplace_back(sn.node);
-            /*if (++i == TARGET_NODES)
-                break;*/
-        }
-    }
+    ret.reserve(nodes.size());
+    for (const auto& sn : nodes)
+        ret.emplace_back(sn.node);
     return ret;
 }
 
@@ -839,7 +833,7 @@ Dht::searchStep(Search& sr)
             for (auto b = sr.callbacks.begin(); b != sr.callbacks.end();) {
                 if (sr.isDone(*b, now)) {
                     if (b->done_cb)
-                        b->done_cb(true, sr.getNodes(now));
+                        b->done_cb(true, sr.getNodes());
                     b = sr.callbacks.erase(b);
                 }
                 else
@@ -2336,7 +2330,7 @@ Dht::processMessage(const uint8_t *buf, size_t buflen, const sockaddr *from, soc
                     if (!a.callback || !a.value || a.value->id != value_id)
                         continue;
                     if (sr->isAnnounced(value_id, getType(a.value->type), now)) {
-                        a.callback(true, sr->getNodes(now));
+                        a.callback(true, sr->getNodes());
                         a.callback = nullptr;
                     }
                 }
diff --git a/tools/python/opendht.pyx b/tools/python/opendht.pyx
index 9478f6f659b89212dee003d0ce08a775c2cf5991..8f4f8787e82d1a51c20ec4a9b1ae4ad3a47720be 100644
--- a/tools/python/opendht.pyx
+++ b/tools/python/opendht.pyx
@@ -72,6 +72,7 @@ cdef extern from "opendht/dht.h" namespace "dht":
         Node() except +
         InfoHash getId() const
         string getAddrStr() const
+        bool isExpired() const
     ctypedef bool (*GetCallbackRaw)(shared_ptr[Value] values, void *user_data)
     ctypedef void (*DoneCallbackRaw)(bool done, vector[shared_ptr[Node]]* nodes, void *user_data)
     cdef cppclass Dht:
@@ -141,6 +142,8 @@ cdef class PyNode(_WithID):
         return h
     def getAddr(self):
         return self._node.get().getAddrStr()
+    def isExpired(self):
+        return self._node.get().isExpired()
 
 cdef class PyNodeEntry(_WithID):
     cdef pair[InfoHash, shared_ptr[Node]] _v