Index: common/MessageProcessor.cpp
===================================================================
--- common/MessageProcessor.cpp	(revision 8271c78c085cf1aced499458d814982503a48182)
+++ common/MessageProcessor.cpp	(revision f9cb9fb6fdacb1a49b3026e84a4faeec1a0405ca)
@@ -50,8 +50,11 @@
    }else {
       bool isDuplicate = false;
+      map<unsigned int, unsigned long long>& ackedPlayerMessages = ackedMessages[source->sin_addr.s_addr];
 
-      if (ackedMessages.find(msg->id) != ackedMessages.end()) {
+      if (ackedPlayerMessages.find(msg->id) != ackedPlayerMessages.end()) {
          isDuplicate = true;
          cout << "Got duplicate of type " << msg->type << endl;
+         if (outputLog)
+            (*outputLog) << "Received duplicate (id " << msg->id << ") of type " << MessageContainer::getMsgTypeString(msg->type) << endl;
       }else {
          cout << "Got message of type " << msg->type << endl;
@@ -60,7 +63,5 @@
       }
 
-      ackedMessages[msg->id] = MessageContainer(*msg, *source);
-      ackedMessages[msg->id].setAcked(true);
-      ackedMessages[msg->id].setTimeAcked(getCurrentMillis());
+      ackedPlayerMessages[msg->id] = getCurrentMillis();
 
       NETWORK_MSG ack;
@@ -116,14 +117,18 @@
    }
 
-   /*
-   map<unsigned int, unsigned long long>::iterator it3 = ackedMessages.begin();
+   map<unsigned long, map<unsigned int, unsigned long long> >::iterator it3 = ackedMessages.begin();
+   map<unsigned int, unsigned long long>::iterator it4;
 
+   // somehow want to delete the inner map once that player logs out
    while (it3 != ackedMessages.end()) {
-      if ((getCurrentMillis() - it3->second) > 500)
-         ackedMessages.erase(it3++);
-      else
-         it3++;
+      it4 = it3->second.begin();
+      while (it4 != it3->second.end()) {
+         if ((getCurrentMillis() - it4->second) > 500)
+            it3->second.erase(it4++);
+         else
+            it4++;
+      }
+      it3++;
    }
-   */
 }
 
@@ -132,5 +137,5 @@
 }
 
-map<unsigned int, MessageContainer>& MessageProcessor::getAckedMessages() {
+map<unsigned long, map<unsigned int, unsigned long long> >& MessageProcessor::getAckedMessages() {
    return this->ackedMessages;
 }
Index: common/MessageProcessor.h
===================================================================
--- common/MessageProcessor.h	(revision 8271c78c085cf1aced499458d814982503a48182)
+++ common/MessageProcessor.h	(revision f9cb9fb6fdacb1a49b3026e84a4faeec1a0405ca)
@@ -15,6 +15,6 @@
    map<unsigned int, map<unsigned long, MessageContainer> > sentMessages;
 
-   // map from message ids to the time each mesage was acked
-   map<unsigned int, MessageContainer> ackedMessages;
+   // map from player address to map from message id to time accked
+   map<unsigned long, map<unsigned int, unsigned long long> > ackedMessages;
 
    unsigned long pid;
@@ -30,5 +30,5 @@
 
    map<unsigned int, map<unsigned long, MessageContainer> >& getSentMessages();
-   map<unsigned int, MessageContainer>& getAckedMessages();
+   map<unsigned long, map<unsigned int, unsigned long long> >& getAckedMessages();
 };
 
