diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp
index 7e1e78d7..13f4c154 100644
--- a/I2NPProtocol.cpp
+++ b/I2NPProtocol.cpp
@@ -463,9 +463,11 @@ namespace i2p
 		msg->offset += sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader);
 		msg->len = msg->offset + len;
 		LogPrint ("TunnelGateway of ", (int)len, " bytes for tunnel ", (unsigned int)tunnelID, ". Msg type ", (int)msg->GetHeader()->typeID);
-		if (msg->GetHeader()->typeID == eI2NPDatabaseStore)
+		if (msg->GetHeader()->typeID == eI2NPDatabaseStore ||
+		    msg->GetHeader()->typeID == eI2NPDatabaseSearchReply)
 		{
-			// transit DatabaseStore my contain new/updated RI
+			// transit DatabaseStore my contain new/updated RI 
+			// or DatabaseSearchReply with new routers
 			auto ds = NewI2NPMessage ();
 			*ds = *msg;
 			i2p::data::netdb.PostI2NPMsg (ds);
diff --git a/NetDb.cpp b/NetDb.cpp
index 81e7d984..765ec76c 100644
--- a/NetDb.cpp
+++ b/NetDb.cpp
@@ -559,7 +559,19 @@ namespace data
 			}	
 		}
 		else
+		{	
 			LogPrint ("Requested destination for ", key, " not found");
+			// it might contain new routers
+			for (int i = 0; i < num; i++)
+			{
+				IdentHash router (buf + 33 + i*32);
+				if (!FindRouter (router))
+				{	
+					LogPrint ("New router ", router.ToBase64 (), " found. Request it");
+					RequestDestination (router);
+				}	
+			}	
+		}	
 		i2p::DeleteI2NPMessage (msg);
 	}	
 	
diff --git a/TunnelEndpoint.cpp b/TunnelEndpoint.cpp
index 254c56ab..5bb31f07 100644
--- a/TunnelEndpoint.cpp
+++ b/TunnelEndpoint.cpp
@@ -203,9 +203,10 @@ namespace tunnel
 					// to somebody else
 					if (!m_IsInbound) // outbound transit tunnel
 					{
-						if (msg.data->GetHeader()->typeID == eI2NPDatabaseStore)
+						if (msg.data->GetHeader()->typeID == eI2NPDatabaseStore ||
+						    msg.data->GetHeader()->typeID == eI2NPDatabaseSearchReply )
 						{
-							// catch RI
+							// catch RI or reply with new list of routers
 							auto ds = NewI2NPMessage ();
 							*ds = *(msg.data);
 							i2p::data::netdb.PostI2NPMsg (ds);