diff --git a/SSU.cpp b/SSU.cpp
index d83ec7ad..137a2f99 100644
--- a/SSU.cpp
+++ b/SSU.cpp
@@ -23,7 +23,8 @@ namespace ssu
 		m_NumSentBytes (0), m_NumReceivedBytes (0)
 	{
 		m_DHKeysPair = i2p::transports.GetNextDHKeysPair ();
-		ScheduleTermination ();
+		if (!router) // incoming session
+			ScheduleConnectTimer ();
 	}
 
 	SSUSession::~SSUSession ()
@@ -584,13 +585,19 @@ namespace ssu
 		if (m_State == eSessionStateUnknown)
 		{	
 			// set connect timer
-			m_Timer.expires_from_now (boost::posix_time::seconds(SSU_CONNECT_TIMEOUT));
-			m_Timer.async_wait (boost::bind (&SSUSession::HandleConnectTimer,
-				this, boost::asio::placeholders::error));	
+			ScheduleConnectTimer ();
 			SendSessionRequest ();
 		}	
 	}
 
+	void SSUSession::ScheduleConnectTimer ()
+	{
+		m_Timer.cancel ();
+		m_Timer.expires_from_now (boost::posix_time::seconds(SSU_CONNECT_TIMEOUT));
+		m_Timer.async_wait (boost::bind (&SSUSession::HandleConnectTimer,
+			this, boost::asio::placeholders::error));	
+}
+
 	void SSUSession::HandleConnectTimer (const boost::system::error_code& ecode)
 	{
 		if (!ecode)
diff --git a/SSU.h b/SSU.h
index d1e56c72..aacbde8b 100644
--- a/SSU.h
+++ b/SSU.h
@@ -97,6 +97,7 @@ namespace ssu
 			void ProcessRelayIntro (uint8_t * buf, size_t len);
 			void Established ();
 			void Failed ();
+			void ScheduleConnectTimer ();
 			void HandleConnectTimer (const boost::system::error_code& ecode);
 			void ProcessPeerTest (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint);
 			void SendPeerTest (uint32_t nonce, uint32_t address, uint16_t port, uint8_t * introKey, bool toAddress = true);