diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp
index 8b5b7321..c2ae6d3b 100644
--- a/I2NPProtocol.cpp
+++ b/I2NPProtocol.cpp
@@ -238,12 +238,11 @@ namespace i2p
 			router = &context.GetRouterInfo ();
 
 		I2NPMessage * m = NewI2NPShortMessage ();
-		I2NPDatabaseStoreMsg msg;
+		I2NPDatabaseStoreMsg * msg = (I2NPDatabaseStoreMsg *)m->GetPayload ();		
 
-		memcpy (msg.key, router->GetIdentHash (), 32);
-		msg.type = 0;
-		msg.replyToken = 0;
-		memcpy(m->GetPayload (),&msg,sizeof(I2NPDatabaseStoreMsg));
+		memcpy (msg->key, router->GetIdentHash (), 32);
+		msg->type = 0;
+		msg->replyToken = 0;
 		
 		CryptoPP::Gzip compressor;
 		compressor.Put (router->GetBuffer (), router->GetBufferLen ());
@@ -265,10 +264,10 @@ namespace i2p
 		if (!leaseSet) return nullptr;
 		I2NPMessage * m = NewI2NPShortMessage ();
 		uint8_t * payload = m->GetPayload ();	
-		I2NPDatabaseStoreMsg msg;
-		memcpy (msg.key, leaseSet->GetIdentHash (), 32);
-		msg.type = 1; // LeaseSet
-		msg.replyToken = htobe32 (replyToken);
+		I2NPDatabaseStoreMsg * msg = (I2NPDatabaseStoreMsg *)payload;
+		memcpy (msg->key, leaseSet->GetIdentHash (), 32);
+		msg->type = 1; // LeaseSet
+		msg->replyToken = htobe32 (replyToken);
 		size_t size = sizeof (I2NPDatabaseStoreMsg);
 		if (replyToken)
 		{
@@ -281,9 +280,8 @@ namespace i2p
 				size += 32; // reply tunnel gateway
 			}
 			else
-				msg.replyToken = 0;
+				msg->replyToken = 0;
 		}
-		memcpy(payload,&msg,sizeof (I2NPDatabaseStoreMsg));
 		memcpy (payload + size, leaseSet->GetBuffer (), leaseSet->GetBufferLen ());
 		size += leaseSet->GetBufferLen ();
 		m->len += size;
@@ -333,7 +331,6 @@ namespace i2p
 			
 				i2p::crypto::ElGamalDecrypt (i2p::context.GetEncryptionPrivateKey (), records[i].encrypted, (uint8_t *)&clearText);
 				// replace record to reply
-				//HACK: Ugly but since all is uint8_t should work
 				I2NPBuildResponseRecord * reply = (I2NPBuildResponseRecord *)(records + i);				
 				if (i2p::context.AcceptsTunnels ())
 				{	
@@ -389,7 +386,6 @@ namespace i2p
 		}
 		else
 		{
-			//HACK: Ugly but since all is uint8_t should work
 			I2NPBuildRequestRecordElGamalEncrypted * records = (I2NPBuildRequestRecordElGamalEncrypted *)(buf+1); 
 			I2NPBuildRequestRecordClearText clearText;	
 			if (HandleBuildRequestRecords (num, records, clearText))
@@ -412,7 +408,6 @@ namespace i2p
 	void HandleTunnelBuildMsg (uint8_t * buf, size_t len)
 	{
 		I2NPBuildRequestRecordClearText clearText;	
-		//HACK: Ugly but since all is uint8_t should work
 		if (HandleBuildRequestRecords (NUM_TUNNEL_BUILD_RECORDS, (I2NPBuildRequestRecordElGamalEncrypted *)buf, clearText))
 		{
 			if (clearText.flag & 0x40) // we are endpoint of outbound tunnel
@@ -475,10 +470,9 @@ namespace i2p
 	I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len)
 	{
 		I2NPMessage * msg = NewI2NPMessage (len);
-		TunnelGatewayHeader header;
-		header.tunnelID = htobe32 (tunnelID);
-		header.length = htobe16 (len);
-		memcpy (msg->GetPayload (), &header, sizeof (TunnelGatewayHeader));
+		TunnelGatewayHeader * header = (TunnelGatewayHeader *)msg->GetPayload ();
+		header->tunnelID = htobe32 (tunnelID);
+		header->length = htobe16 (len);
 		memcpy (msg->GetPayload () + sizeof (TunnelGatewayHeader), buf, len);
 		msg->len += sizeof (TunnelGatewayHeader) + len;
 		FillI2NPMessageHeader (msg, eI2NPTunnelGateway);
@@ -490,11 +484,10 @@ namespace i2p
 		if (msg->offset >= sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader))
 		{
 			// message is capable to be used without copying
-			TunnelGatewayHeader header;
-			header.tunnelID = htobe32 (tunnelID);
+			TunnelGatewayHeader * header = (TunnelGatewayHeader *)(msg->GetBuffer () - sizeof (TunnelGatewayHeader));
+			header->tunnelID = htobe32 (tunnelID);
 			int len = msg->GetLength ();
-			header.length = htobe16 (len);
-			memcpy (msg->GetBuffer () - sizeof (TunnelGatewayHeader), &header, sizeof (TunnelGatewayHeader));
+			header->length = htobe16 (len);
 			msg->offset -= (sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader));
 			msg->len = msg->offset + sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader) +len;
 			FillI2NPMessageHeader (msg, eI2NPTunnelGateway);
@@ -520,21 +513,18 @@ namespace i2p
 		FillI2NPMessageHeader (msg, msgType, replyMsgID); // create content message
 		len = msg->GetLength ();
 		msg->offset -= gatewayMsgOffset;
-		TunnelGatewayHeader header;
-		header.tunnelID = htobe32 (tunnelID);
-		header.length = htobe16 (len);
-		memcpy (msg->GetPayload (), &header, sizeof (TunnelGatewayHeader));
+		TunnelGatewayHeader * header = (TunnelGatewayHeader *)msg->GetPayload ();
+		header->tunnelID = htobe32 (tunnelID);
+		header->length = htobe16 (len);
 		FillI2NPMessageHeader (msg, eI2NPTunnelGateway); // gateway message
 		return msg;
 	}	
 	
 	void HandleTunnelGatewayMsg (I2NPMessage * msg)
 	{		
-		TunnelGatewayHeader header;
-		uint32_t tunnelID = be32toh(header.tunnelID);
-		uint16_t len = be16toh(header.length);
-		memcpy (msg->GetPayload (), &header, sizeof (TunnelGatewayHeader));
-		
+		TunnelGatewayHeader * header = (TunnelGatewayHeader *)msg->GetPayload ();
+		uint32_t tunnelID = be32toh(header->tunnelID);
+		uint16_t len = be16toh(header->length);
 		// we make payload as new I2NP message to send
 		msg->offset += sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader);
 		msg->len = msg->offset + len;
@@ -561,19 +551,18 @@ namespace i2p
 	size_t GetI2NPMessageLength (const uint8_t * msg)
 	{
 		I2NPHeader * header = (I2NPHeader *)msg;
-		return bufbe16toh (&(header->size)) + sizeof (I2NPHeader);
+		return be16toh (header->size) + sizeof (I2NPHeader);
 	}	
 	
 	void HandleI2NPMessage (uint8_t * msg, size_t len)
 	{
-		I2NPHeader header;
-		memcpy (&header,msg,sizeof(I2NPHeader));
-		uint32_t msgID = be32toh (header.msgID);	
-		LogPrint ("I2NP msg received len=", len,", type=", (int)header.typeID, ", msgID=", (unsigned int)msgID);
+		I2NPHeader * header = (I2NPHeader *)msg;
+		uint32_t msgID = be32toh (header->msgID);	
+		LogPrint ("I2NP msg received len=", len,", type=", (int)header->typeID, ", msgID=", (unsigned int)msgID);
 
 		uint8_t * buf = msg + sizeof (I2NPHeader);
-		int size = be16toh (header.size);
-		switch (header.typeID)
+		int size = be16toh (header->size);
+		switch (header->typeID)
 		{	
 			case eI2NPVariableTunnelBuild:
 				LogPrint ("VariableTunnelBuild");
@@ -592,7 +581,7 @@ namespace i2p
 				// TODO:
 			break;	
 			default:
-				LogPrint ("Unexpected message ", (int)header.typeID);
+				LogPrint ("Unexpected message ", (int)header->typeID);
 		}	
 	}
 
diff --git a/I2NPProtocol.h b/I2NPProtocol.h
index a9665508..9d3fa79b 100644
--- a/I2NPProtocol.h
+++ b/I2NPProtocol.h
@@ -114,7 +114,6 @@ namespace tunnel
 		I2NPMessage (): buf (nullptr),len (sizeof (I2NPHeader) + 2), 
 			offset(2), maxLen (0), from (nullptr) {}; 
 		// reserve 2 bytes for NTCP header
-		//TODO: This is VERY likely to cause alignment problems and I'm not willing to fix it now
 		I2NPHeader * GetHeader () { return (I2NPHeader *)GetBuffer (); };
 		uint8_t * GetPayload () { return GetBuffer () + sizeof(I2NPHeader); };
 		uint8_t * GetBuffer () { return buf + offset; };
@@ -139,7 +138,6 @@ namespace tunnel
 		}	
 
 		// for SSU only
-		//TODO: This is VERY likely to cause alignment problems and I'm not willing to fix it now
 		uint8_t * GetSSUHeader () { return buf + offset + sizeof(I2NPHeader) - sizeof(I2NPHeaderShort); };	
 		void FromSSU (uint32_t msgID) // we have received SSU message and convert it to regular
 		{