Index: common/MessageProcessor.cpp
===================================================================
--- common/MessageProcessor.cpp	(revision 9b5d30bd77df410865678bf12cc80310383b1346)
+++ common/MessageProcessor.cpp	(revision 198cf2d5aadb5e6ed8898c41b1243d444f18bdac)
@@ -2,4 +2,6 @@
 
 #include <iostream>
+
+#include "Common.h"
 
 MessageProcessor::MessageProcessor() {
@@ -30,5 +32,10 @@
    // add id to the NETWORK_MSG struct
    if (msg->type == MSG_TYPE_ACK) {
-      sentMessages.erase(msg->id);
+      if (!sentMessages[msg->id].isAcked) {
+         sentMessages[msg->id].isAcked = true;
+         sentMessages[msg->id].timeAcked = getCurrentMillis();
+      }
+
+      return -1; // don't do any further processing
    }else {
       NETWORK_MSG ack;
@@ -50,4 +57,9 @@
 
 void MessageProcessor::cleanAckedMessages() {
-   // shouldn't be needed since I can just remove messages when I get their ACKs
+   map<int, MessageContainer>::iterator it;
+
+   for(it = sentMessages.begin(); it != sentMessages.end(); it++) {
+      if (it->second.isAcked && (getCurrentMillis() - it->second.timeAcked) > 1000)
+         sentMessages.erase(it);
+   }
 }
Index: common/MessageProcessor.h
===================================================================
--- common/MessageProcessor.h	(revision 9b5d30bd77df410865678bf12cc80310383b1346)
+++ common/MessageProcessor.h	(revision 198cf2d5aadb5e6ed8898c41b1243d444f18bdac)
@@ -73,4 +73,6 @@
       NETWORK_MSG msg;
       struct sockaddr_in clientAddr;
+      bool isAcked;
+      unsigned long long timeAcked;
    };
 
