Index: common/MessageProcessor.cpp
===================================================================
--- common/MessageProcessor.cpp	(revision 6b641af913b64d36eed341590bb696959ad650c3)
+++ common/MessageProcessor.cpp	(revision 4dbac8711b9d477a88ecf800f8ffa34aa6a46677)
@@ -48,16 +48,19 @@
       return -1; // don't do any further processing
    }else {
-      if (ret > -1) {
-         cout << "Received message" << endl;
-         cout << "id: " << msg->id << endl;
-         cout << "type: " << msg->type << endl;
-         cout << "buffer: " << msg->buffer << endl;
-      }
+      cout << "Received message" << endl;
+      cout << "id: " << msg->id << endl;
+      cout << "type: " << msg->type << endl;
+      cout << "buffer: " << msg->buffer << endl;
 
-      NETWORK_MSG ack;
-      ack.id = msg->id;
-      ack.type = MSG_TYPE_ACK;
+      if (ackedMessages.find(msg->id) != ackedMessages.end()) {
+         ackedMessages[msg->id] = getCurrentMillis();
 
-      sendto(sock, (char*)&ack, sizeof(NETWORK_MSG), 0, (struct sockaddr *)source, sizeof(struct sockaddr_in));
+         NETWORK_MSG ack;
+         ack.id = msg->id;
+         ack.type = MSG_TYPE_ACK;
+
+         sendto(sock, (char*)&ack, sizeof(NETWORK_MSG), 0, (struct sockaddr *)source, sizeof(struct sockaddr_in));
+      }else
+         cout << "Got duplicate ack" << endl;
    }
 
@@ -91,3 +94,12 @@
          it++;
    }
+
+   map<unsigned int, unsigned long long>::iterator it2 = ackedMessages.begin();
+
+   while (it2 != ackedMessages.end()) {
+      if ((getCurrentMillis() - it2->second) > 500)
+         ackedMessages.erase(it2++);
+      else
+         it2++;
+   }
 }
Index: common/MessageProcessor.h
===================================================================
--- common/MessageProcessor.h	(revision 6b641af913b64d36eed341590bb696959ad650c3)
+++ common/MessageProcessor.h	(revision 4dbac8711b9d477a88ecf800f8ffa34aa6a46677)
@@ -79,4 +79,5 @@
    int lastUsedId;
    map<int, MessageContainer> sentMessages;
+   map<unsigned int, unsigned long long> ackedMessages;
 };
 
