diff --git a/src/dht.cpp b/src/dht.cpp
index 0ea8af1420ab4266c239c9f1ca1389329ae4f957..afc03f8233df9550007ae6d2bbacda47f47c5435 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -815,15 +815,31 @@ Dht::trySearchInsert(const std::shared_ptr<Node>& node)
     const auto& now = scheduler.time();
     if (not node) return false;
 
-    bool inserted = false;
-    auto family = node->getFamily();
-    auto& srs = family == AF_INET ? searches4 : searches6;
-    for (auto& srp : srs) {
-        auto& s = *srp.second;
+    auto& srs = searches(node->getFamily());
+    auto closest = srs.lower_bound(node->id);
+    bool inserted {false};
+
+    // insert forward
+    auto it = closest;
+    while (it != srs.end()) {
+        auto& s = *it->second;
         if (s.insertNode(node, now)) {
             inserted = true;
             scheduler.edit(s.nextSearchStep, s.getNextStepTime(now));
-        }
+        } else
+            break;
+        ++it;
+    }
+    // insert backward
+    it = closest;
+    while (it != srs.begin()) {
+        --it;
+        auto& s = *it->second;
+        if (s.insertNode(node, now)) {
+            inserted = true;
+            scheduler.edit(s.nextSearchStep, s.getNextStepTime(now));
+        } else
+            break;
     }
     return inserted;
 }