diff --git a/src/dht.cpp b/src/dht.cpp
index 9b1092f0bbaf9a4a6a50c656fc2b633074a9962c..5c1eab8b3a2ee5c254ad728cd3ee81491512de8d 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -1890,8 +1890,13 @@ Dht::cancelListen(const InfoHash& id, size_t token)
                     for (auto& ls : sn.listenStatus)
                         network_engine.cancelRequest(ls.second);
                     sn.listenStatus.clear();
-                } else if (query)
-                    sn.listenStatus.erase(query);
+                } else if (query) {
+                    auto it = sn.listenStatus.find(query);
+                    if (it != sn.listenStatus.end()) {
+                        network_engine.cancelRequest(it->second);
+                        sn.listenStatus.erase(it);
+                    }
+                }
             }
             s->listeners.erase(af_token);
         }
@@ -2350,8 +2355,11 @@ Dht::connectivityChanged(sa_family_t af)
     network_engine.connectivityChanged(af);
     auto& searches = (af == AF_INET) ? searches4 : searches6;
     for (auto& sp : searches)
-        for (auto& sn : sp.second->nodes)
+        for (auto& sn : sp.second->nodes) {
+            for (auto& ls : sn.listenStatus)
+                network_engine.cancelRequest(ls.second);
             sn.listenStatus.clear();
+        }
     reported_addr.erase(std::remove_if(reported_addr.begin(), reported_addr.end(), [&](const ReportedAddr& addr){
         return addr.second.getFamily() == af;
     }), reported_addr.end());
diff --git a/src/network_engine.cpp b/src/network_engine.cpp
index 18ce38c0f6060c153cf03213942dbe0c2d4829b5..f042b45d486188842497f5713cb39c21ff0862ef 100644
--- a/src/network_engine.cpp
+++ b/src/network_engine.cpp
@@ -250,9 +250,12 @@ NetworkEngine::sendRequest(std::shared_ptr<Request>& request)
 {
     request->start = scheduler.time();
     auto e = requests.emplace(request->tid, request);
-    if (!e.second) {
+    if (not e.second) {
+        // Should not happen !
+        // Try to handle this scenario as well as we can
+        e.first->second->setExpired();
+        e.first->second = request;
         DHT_LOG_ERR("Request already existed (tid: %d)!", request->tid);
-        return;
     }
     request->node->requested(request);
     requestStep(request);