diff --git a/include/opendht/dht.h b/include/opendht/dht.h
index 600e5c246c4d397159311338831857da3b7cce20..fe3e3ef9035da10983018d0719e45b4c46ae8266 100644
--- a/include/opendht/dht.h
+++ b/include/opendht/dht.h
@@ -245,7 +245,12 @@ public:
      * This will cause the DHT to assume a public IP address change.
      * The DHT will recontact neighbor nodes, re-register for listen ops etc.
      */
-    void connectivityChanged();
+    void connectivityChanged(sa_family_t);
+    void connectivityChanged() {
+        reported_addr.clear();
+        connectivityChanged(AF_INET);
+        connectivityChanged(AF_INET6);
+    }
 
     /**
      * Get the list of good nodes for local storage saving purposes
diff --git a/include/opendht/network_engine.h b/include/opendht/network_engine.h
index daa48e3f0d495be89ab68ec9a54ffad20d406078..a24e7ff7033f636c15fd1d15ec44257ac2cecc38 100644
--- a/include/opendht/network_engine.h
+++ b/include/opendht/network_engine.h
@@ -169,7 +169,7 @@ public:
      */
     void cancelRequest(std::shared_ptr<Request>& req);
 
-    void connectivityChanged();
+    void connectivityChanged(sa_family_t);
 
 private:
 
diff --git a/src/dht.cpp b/src/dht.cpp
index 25ff7bfdd1b9a0bb5cff235ffb0907cbecf8e01c..6b719650951580ad7fd61e8a0f26f39f6ce1eee1 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -1412,7 +1412,7 @@ Dht::searchStep(std::shared_ptr<Search> sr)
     {
         DHT_LOG.WARN("[search %s IPv%c] expired", sr->id.toString().c_str(), sr->af == AF_INET ? '4' : '6');
         sr->expire();
-        connectivityChanged();
+        connectivityChanged(sr->af);
     }
 
     /* dumpSearch(*sr, std::cout); */
@@ -2321,21 +2321,20 @@ Dht::Storage::expire(const std::map<ValueType::Id, ValueType>& types, time_point
 }
 
 void
-Dht::connectivityChanged()
+Dht::connectivityChanged(sa_family_t af)
 {
     const auto& now = scheduler.time();
     scheduler.edit(nextNodesConfirmation, now);
-    mybucket_grow_time = now;
-    mybucket6_grow_time = now;
-    reported_addr.clear();
-    network_engine.connectivityChanged();
-    auto stop_listen = [&](std::map<InfoHash, std::shared_ptr<Search>> srs) {
-        for (auto& sp : srs)
-            for (auto& sn : sp.second->nodes)
-                sn.listenStatus.clear();
-    };
-    stop_listen(searches4);
-    stop_listen(searches6);
+    auto& bucket_grow_time = (af == AF_INET) ? mybucket_grow_time : mybucket6_grow_time;
+    bucket_grow_time = now;
+    reported_addr.erase(std::remove_if(reported_addr.begin(), reported_addr.end(), [&](const ReportedAddr& addr){
+        return addr.second.getFamily() == af;
+    }));
+    network_engine.connectivityChanged(af);
+    auto& searches = (af == AF_INET) ? searches4 : searches6;
+    for (auto& sp : searches)
+        for (auto& sn : sp.second->nodes)
+            sn.listenStatus.clear();
 }
 
 void
@@ -2701,8 +2700,8 @@ Dht::neighbourhoodMaintenance(RoutingTable& list)
 
     auto n = q->randomNode();
     if (n) {
-        DHT_LOG.DEBUG("[find %s IPv%c] sending find for neighborhood maintenance.",
-                id.toString().c_str(), q->af == AF_INET6 ? '6' : '4');
+        DHT_LOG.DEBUG("[node %s] sending [find %s] for neighborhood maintenance.",
+                n->toString().c_str(), id.toString().c_str());
         /* Since our node-id is the same in both DHTs, it's probably
            profitable to query both families. */
         network_engine.sendFindNode(n, id, network_engine.want(), nullptr, nullptr);
diff --git a/src/network_engine.cpp b/src/network_engine.cpp
index 60fa56ea259fce23542adb0f4ac73f0e17e0b6e0..abfa056973e99d68b5af8a0356f165131d03248e 100644
--- a/src/network_engine.cpp
+++ b/src/network_engine.cpp
@@ -88,7 +88,7 @@ struct ParsedMessage {
     Blob nodes4_raw, nodes6_raw;
     std::vector<std::shared_ptr<Node>> nodes4, nodes6;
     /* values to store or retreive request */
-    std::vector<std::shared_ptr<Value>> values;           
+    std::vector<std::shared_ptr<Value>> values;
     /* index for fields values */
     std::vector<std::shared_ptr<FieldValueIndex>> fields;
     /** When part of the message header: {index -> (total size, {})}
@@ -199,9 +199,9 @@ NetworkEngine::clear()
 }
 
 void
-NetworkEngine::connectivityChanged()
+NetworkEngine::connectivityChanged(sa_family_t af)
 {
-    cache.clearBadNodes();
+    cache.clearBadNodes(af);
 }
 
 void