diff --git a/libi2pd/Streaming.cpp b/libi2pd/Streaming.cpp
index f91bb552..aad39db8 100644
--- a/libi2pd/Streaming.cpp
+++ b/libi2pd/Streaming.cpp
@@ -427,17 +427,18 @@ namespace stream
 					}
 				}
 				auto sentPacket = *it;
-				uint64_t rtt = ts - sentPacket->sendTime;
-				if(ts < sentPacket->sendTime)
-				{
-					LogPrint(eLogError, "Streaming: Packet ", seqn, "sent from the future, sendTime=", sentPacket->sendTime);
-					rtt = 1;
-				}
-				if (seqn)
+				int64_t rtt = (int64_t)ts - (int64_t)sentPacket->sendTime;
+				if (rtt < 0)
+					LogPrint (eLogError, "Streaming: Packet ", seqn, "sent from the future, sendTime=", sentPacket->sendTime);
+				bool rttUpdated = true;
+				if (!seqn)
+					m_RTT = rtt < 0 ? 1 : rtt;
+				else if (!sentPacket->resent && rtt >= 0)
 					m_RTT = RTT_EWMA_ALPHA * rtt + (1.0 - RTT_EWMA_ALPHA) * m_RTT;
 				else
-					m_RTT = rtt;
-				m_RTO = m_RTT*1.5; // TODO: implement it better
+					rttUpdated = false;
+				if (rttUpdated)
+					m_RTO = m_RTT * 1.5; // TODO: implement it better
 				LogPrint (eLogDebug, "Streaming: Packet ", seqn, " acknowledged rtt=", rtt, " sentTime=", sentPacket->sendTime);
 				m_SentPackets.erase (it++);
 				m_LocalDestination.DeletePacket (sentPacket);
@@ -989,6 +990,7 @@ namespace stream
 			{
 				if (ts >= it->sendTime + m_RTO)
 				{
+					it->resent = true;
 					it->sendTime = ts;
 					packets.push_back (it);
 				}
diff --git a/libi2pd/Streaming.h b/libi2pd/Streaming.h
index d67cf37a..9865ba95 100644
--- a/libi2pd/Streaming.h
+++ b/libi2pd/Streaming.h
@@ -71,8 +71,9 @@ namespace stream
 		size_t len, offset;
 		uint8_t buf[MAX_PACKET_SIZE];
 		uint64_t sendTime;
+		bool resent;
 
-		Packet (): len (0), offset (0), sendTime (0) {};
+		Packet (): len (0), offset (0), sendTime (0), resent (false) {};
 		uint8_t * GetBuffer () { return buf + offset; };
 		size_t GetLength () const { return len - offset; };