diff --git a/src/network_engine.cpp b/src/network_engine.cpp
index c0ebbb32de753264ca7adeb3f568d4d614e8e049..c80e4fd92746ee09575b9b44ee3f09b1a2e6aa2c 100644
--- a/src/network_engine.cpp
+++ b/src/network_engine.cpp
@@ -289,7 +289,7 @@ NetworkEngine::processMessage(const uint8_t *buf, size_t buflen, const sockaddr*
         return;
     }
 
-    if (msg.id == myid) {
+    if (msg.id == myid || msg.id == zeroes) {
         DHT_LOG.DEBUG("Received message from self.");
         return;
     }
@@ -319,14 +319,22 @@ NetworkEngine::processMessage(const uint8_t *buf, size_t buflen, const sockaddr*
         }
         auto req = reqp->second;
 
-        auto node = req->node;//cache.getNode(msg.id, from, fromlen, now, 2);
-        node->received(now, req);
-        if (node->id == zeroes) {
-            // reply to a message sent when we didn't know the node ID.
+        auto node = req->node;
+        if (node->id != msg.id) {
+            bool unknown_node = node->id == zeroes;
             node = cache.getNode(msg.id, from, fromlen, now, 2);
-            req->node = node;
+            if (unknown_node) {
+                // received reply to a message sent when we didn't know the node ID.
+                req->node = node;
+            } else {
+                // received reply from unexpected node
+                node->received(now, req);
+                onNewNode(node, 2);
+                return;
+            }
         } else
             node->update(from, fromlen);
+        node->received(now, req);
 
         onNewNode(node, 2);
         onReportedAddr(msg.id, (sockaddr*)&msg.addr.first, msg.addr.second);
diff --git a/src/node_cache.cpp b/src/node_cache.cpp
index 34aeb18f063c222518d0a7ae12918573cde0a4d2..24372d670701896c74bab45afd757e17d0b7afab 100644
--- a/src/node_cache.cpp
+++ b/src/node_cache.cpp
@@ -28,6 +28,8 @@ NodeCache::getNode(const InfoHash& id, sa_family_t family) {
 
 std::shared_ptr<Node>
 NodeCache::getNode(const InfoHash& id, const sockaddr* sa, socklen_t sa_len, time_point now, int confirm) {
+    if (id == zeroes)
+        return std::make_shared<Node>(id, sa, sa_len);
     return (sa->sa_family == AF_INET ? cache_4 : cache_6).getNode(id, sa, sa_len, now, confirm);
 }