diff --git a/SSU.cpp b/SSU.cpp
index 7a58692f..cc125ae0 100644
--- a/SSU.cpp
+++ b/SSU.cpp
@@ -807,22 +807,6 @@ namespace ssu
 		Send (buf, 80);
 	}	
 
-	void SSUSession::SendMsgAck (uint32_t msgID)
-	{
-		uint8_t buf[48 + 18]; // actual length is 44 = 37 + 7 but pad it to multiple of 16
-		uint8_t * payload = buf + sizeof (SSUHeader);
-		*payload = DATA_FLAG_EXPLICIT_ACKS_INCLUDED; // flag
-		payload++;
-		*payload = 1; // number of ACKs
-		payload++;
-		*(uint32_t *)(payload) = htobe32 (msgID); // msgID	
-		payload += 4;
-		*payload = 0; // number of fragments
-
-		// encrypt message with session key
-		FillHeaderAndEncrypt (PAYLOAD_TYPE_DATA, buf, 48);
-		Send (buf, 48);
-	}
 
 	void SSUSession::SendSesionDestroyed ()
 	{
diff --git a/SSU.h b/SSU.h
index 80260d99..e39a4e2e 100644
--- a/SSU.h
+++ b/SSU.h
@@ -97,7 +97,6 @@ namespace ssu
 			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); // Charlie to Alice
 			void ProcessData (uint8_t * buf, size_t len);		
-			void SendMsgAck (uint32_t msgID);
 			void SendSesionDestroyed ();
 			void Send (uint8_t type, const uint8_t * payload, size_t len); // with session key
 			void Send (const uint8_t * buf, size_t size); 
diff --git a/SSUData.cpp b/SSUData.cpp
index 2683fb79..a1b8163b 100644
--- a/SSUData.cpp
+++ b/SSUData.cpp
@@ -113,7 +113,7 @@ namespace ssu
 					m_IncomleteMessages[msgID] = new IncompleteMessage (msg);
 				if (isLast)
 				{
-					m_Session.SendMsgAck (msgID);
+					SendMsgAck (msgID);
 					msg->FromSSU (msgID);
 					if (m_Session.GetState () == eSessionStateEstablished)
 						i2p::HandleI2NPMessage (msg);
@@ -183,6 +183,23 @@ namespace ssu
 		}	
 		DeleteI2NPMessage (msg);
 	}		
+
+	void SSUData::SendMsgAck (uint32_t msgID)
+	{
+		uint8_t buf[48 + 18]; // actual length is 44 = 37 + 7 but pad it to multiple of 16
+		uint8_t * payload = buf + sizeof (SSUHeader);
+		*payload = DATA_FLAG_EXPLICIT_ACKS_INCLUDED; // flag
+		payload++;
+		*payload = 1; // number of ACKs
+		payload++;
+		*(uint32_t *)(payload) = htobe32 (msgID); // msgID	
+		payload += 4;
+		*payload = 0; // number of fragments
+
+		// encrypt message with session key
+		m_Session.FillHeaderAndEncrypt (PAYLOAD_TYPE_DATA, buf, 48);
+		m_Session.Send (buf, 48);
+	}
 }
 }
 
diff --git a/SSUData.h b/SSUData.h
index 188ff07b..71273dc2 100644
--- a/SSUData.h
+++ b/SSUData.h
@@ -29,6 +29,10 @@ namespace ssu
 			void ProcessMessage (uint8_t * buf, size_t len);
 			void Send (i2p::I2NPMessage * msg);
 
+		private:
+
+			void SendMsgAck (uint32_t msgID);
+
 		private:
 
 			struct IncompleteMessage