diff --git a/libi2pd/TransportSession.h b/libi2pd/TransportSession.h
index 3ad146cb..87c730f4 100644
--- a/libi2pd/TransportSession.h
+++ b/libi2pd/TransportSession.h
@@ -113,7 +113,8 @@ namespace transport
 			virtual uint32_t GetRelayTag () const { return 0; };
 			virtual void SendLocalRouterInfo (bool update = false) { SendI2NPMessages ({ CreateDatabaseStoreMsg () }); };
 			virtual void SendI2NPMessages (const std::vector<std::shared_ptr<I2NPMessage> >& msgs) = 0;
-
+			virtual bool IsEstablished () const = 0;
+			
 		protected:
 
 			std::shared_ptr<const i2p::data::IdentityEx> m_RemoteIdentity;
diff --git a/libi2pd/Transports.cpp b/libi2pd/Transports.cpp
index 0256e3d9..34fcc065 100644
--- a/libi2pd/Transports.cpp
+++ b/libi2pd/Transports.cpp
@@ -743,7 +743,12 @@ namespace transport
 			auto ts = i2p::util::GetSecondsSinceEpoch ();
 			for (auto it = m_Peers.begin (); it != m_Peers.end (); )
 			{
-				if (it->second.sessions.empty () && ts > it->second.creationTime + SESSION_CREATION_TIMEOUT)
+				it->second.sessions.remove_if (
+					[](std::shared_ptr<TransportSession> session)->bool
+				    {
+						return !session || !session->IsEstablished ();
+					});
+ 				if (it->second.sessions.empty () && ts > it->second.creationTime + SESSION_CREATION_TIMEOUT)
 				{
 					LogPrint (eLogWarning, "Transports: Session to peer ", it->first.ToBase64 (), " has not been created in ", SESSION_CREATION_TIMEOUT, " seconds");
 					auto profile = i2p::data::GetRouterProfile(it->first);