Index: common/MessageContainer.cpp
===================================================================
--- common/MessageContainer.cpp	(revision 46d64695d8d9b46a9adea74da159caae18698af6)
+++ common/MessageContainer.cpp	(revision 46d64695d8d9b46a9adea74da159caae18698af6)
@@ -0,0 +1,49 @@
+#include "MessageContainer.h"
+
+#include <iostream>
+
+#include "Compiler.h"
+
+using namespace std;
+
+MessageContainer::MessageContainer() {
+}
+
+MessageContainer::MessageContainer(const MessageContainer& mc) {
+   this->msg = mc.msg;
+   this->clientAddr = mc.clientAddr;
+   this->isAcked = mc.isAcked;
+   this->timeAcked = mc.timeAcked;
+}
+
+MessageContainer::MessageContainer(NETWORK_MSG msg, struct sockaddr_in clientAddr) {
+   this->clientAddr = clientAddr;
+   this->msg = msg;
+   this->isAcked = false;
+   this->timeAcked = 0;
+}
+
+MessageContainer::~MessageContainer() {
+}
+
+bool MessageContainer::getAcked() {
+   return this->isAcked;
+}
+
+unsigned long long MessageContainer::getTimeAcked() {
+   return this->timeAcked;
+}
+
+NETWORK_MSG* MessageContainer::getMessage() {
+   return &msg;
+}
+
+void MessageContainer::setAcked(bool acked) {
+   cout << "acked before: " << this->isAcked << endl;
+   this->isAcked = acked;
+   cout << "acked after: " << this->isAcked << endl;
+}
+
+void MessageContainer::setTimeAcked(unsigned long long time) {
+   this->timeAcked = time;
+}
Index: common/MessageContainer.h
===================================================================
--- common/MessageContainer.h	(revision 46d64695d8d9b46a9adea74da159caae18698af6)
+++ common/MessageContainer.h	(revision 46d64695d8d9b46a9adea74da159caae18698af6)
@@ -0,0 +1,58 @@
+#ifndef _MESSAGE_CONTAINER_H
+#define _MESSAGE_CONTAINER_H
+
+#include "Compiler.h"
+
+#if defined WINDOWS
+   #include <winsock2.h>
+   #include <WS2tcpip.h>
+#elif defined LINUX
+   #include <netinet/in.h>
+#endif
+
+#define MSG_TYPE_ACK               1
+#define MSG_TYPE_REGISTER          2
+#define MSG_TYPE_LOGIN             3
+#define MSG_TYPE_LOGOUT            4
+#define MSG_TYPE_CHAT              5
+#define MSG_TYPE_PLAYER            6  // server sends this to update player positions
+#define MSG_TYPE_PLAYER_MOVE       7  // client sends this when a player wants to move
+#define MSG_TYPE_OBJECT            8
+#define MSG_TYPE_REMOVE_OBJECT     9
+#define MSG_TYPE_PICKUP_FLAG       10
+#define MSG_TYPE_DROP_FLAG         11
+#define MSG_TYPE_SCORE             12
+#define MSG_TYPE_START_ATTACK      13
+#define MSG_TYPE_ATTACK            14
+#define MSG_TYPE_PROJECTILE        15
+#define MSG_TYPE_REMOVE_PROJECTILE 16
+
+typedef struct
+{
+   unsigned int id;
+   unsigned short type;
+   char buffer[256];
+} NETWORK_MSG;
+
+class MessageContainer {
+private:
+   NETWORK_MSG msg;
+   struct sockaddr_in clientAddr;
+   bool isAcked;
+   unsigned long long timeAcked;
+
+public:
+   MessageContainer();
+   MessageContainer(const MessageContainer& mc);
+   MessageContainer(NETWORK_MSG msg, struct sockaddr_in clientAddr);
+   ~MessageContainer();
+
+   bool getAcked();
+   unsigned long long getTimeAcked();
+   NETWORK_MSG* getMessage();
+
+   void setAcked(bool acked);
+   void setTimeAcked(unsigned long long time);
+};
+
+#endif
Index: common/MessageProcessor.cpp
===================================================================
--- common/MessageProcessor.cpp	(revision 411c1ae8b7592c4f51fb6168977bdf3a224ce16a)
+++ common/MessageProcessor.cpp	(revision 46d64695d8d9b46a9adea74da159caae18698af6)
@@ -13,16 +13,13 @@
 
 int MessageProcessor::sendMessage(NETWORK_MSG *msg, int sock, struct sockaddr_in *dest) {
+   cout << "Sending message of type " << msg->type << endl;
+
    msg->id = ++lastUsedId;
    MessageContainer message(*msg, *dest);
    sentMessages[msg->id][dest->sin_addr.s_addr] = message;
 
-   cout << "Sending message" << endl;
-   cout << "id: " << msg->id << endl;
-   cout << "type: " << msg->type << endl;
-   cout << "buffer: " << msg->buffer << endl;
+   sentMessages[msg->id][dest->sin_addr.s_addr] = message;
 
    int ret =  sendto(sock, (char*)msg, sizeof(NETWORK_MSG), 0, (struct sockaddr *)dest, sizeof(struct sockaddr_in));
-
-   cout << "Send a message of type " << msg->type << endl;
 
    return ret;
@@ -38,13 +35,9 @@
       return ret;
 
-   cout << "Received message" << endl;
-
    // add id to the NETWORK_MSG struct
    if (msg->type == MSG_TYPE_ACK) {
-      cout << "Received ack" << endl;
-      if (!sentMessages[msg->id][source->sin_addr.s_addr].isAcked) {
-         cout << "Received new ack" << endl;
-         sentMessages[msg->id][source->sin_addr.s_addr].isAcked = true;
-         sentMessages[msg->id][source->sin_addr.s_addr].timeAcked = getCurrentMillis();
+      if (!sentMessages[msg->id][source->sin_addr.s_addr].getAcked()) {
+         sentMessages[msg->id][source->sin_addr.s_addr].setAcked(true);
+         sentMessages[msg->id][source->sin_addr.s_addr].setTimeAcked(getCurrentMillis());
       }
 
@@ -52,9 +45,4 @@
    }else {
       bool isDuplicate = false;
-
-      cout << "Received real message" << endl;
-      cout << "id: " << msg->id << endl;
-      cout << "type: " << msg->type << endl;
-      cout << "buffer: " << msg->buffer << endl;
 
       if (ackedMessages.find(msg->id) != ackedMessages.end())
@@ -84,5 +72,7 @@
       sentMsg = it->second;
       for (it2 = sentMsg.begin(); it2 != sentMsg.end(); it2++) {
-         sendto(sock, (char*)&it2->second.msg, sizeof(NETWORK_MSG), 0, (struct sockaddr *)&it2->first, sizeof(struct sockaddr_in));
+         if (!(it2->second.getAcked())) {
+            sendto(sock, it2->second.getMessage(), sizeof(NETWORK_MSG), 0, (struct sockaddr *)&it2->first, sizeof(struct sockaddr_in));
+         }
       }
    }
@@ -95,7 +85,7 @@
    while (it != sentMessages.end()) {
       it2 = it->second.begin();
-      while (it2 != it->second.begin()) {
-         if (it2->second.isAcked) {
-            if ((getCurrentMillis() - it2->second.timeAcked) > 1000)
+      while (it2 != it->second.end()) {
+         if (it2->second.getAcked()) {
+            if ((getCurrentMillis() - it2->second.getTimeAcked()) > 1000)
                it->second.erase(it2++);
             else
@@ -114,8 +104,7 @@
 
    while (it3 != ackedMessages.end()) {
-      if ((getCurrentMillis() - it3->second) > 500) {
+      if ((getCurrentMillis() - it3->second) > 500)
          ackedMessages.erase(it3++);
-         cout << "Deleting ack record" << endl;
-      }else
+      else
          it3++;
    }
Index: common/MessageProcessor.h
===================================================================
--- common/MessageProcessor.h	(revision 411c1ae8b7592c4f51fb6168977bdf3a224ce16a)
+++ common/MessageProcessor.h	(revision 46d64695d8d9b46a9adea74da159caae18698af6)
@@ -4,40 +4,20 @@
 #include <map>
 
-#include "Compiler.h"
-
-#if defined WINDOWS
-   #include <winsock2.h>
-   #include <WS2tcpip.h>
-#elif defined LINUX
-   #include <netinet/in.h>
-#endif
-
-#define MSG_TYPE_ACK               1
-#define MSG_TYPE_REGISTER          2
-#define MSG_TYPE_LOGIN             3
-#define MSG_TYPE_LOGOUT            4
-#define MSG_TYPE_CHAT              5
-#define MSG_TYPE_PLAYER            6  // server sends this to update player positions
-#define MSG_TYPE_PLAYER_MOVE       7  // client sends this when a player wants to move
-#define MSG_TYPE_OBJECT            8
-#define MSG_TYPE_REMOVE_OBJECT     9
-#define MSG_TYPE_PICKUP_FLAG       10
-#define MSG_TYPE_DROP_FLAG         11
-#define MSG_TYPE_SCORE             12
-#define MSG_TYPE_START_ATTACK      13
-#define MSG_TYPE_ATTACK            14
-#define MSG_TYPE_PROJECTILE        15
-#define MSG_TYPE_REMOVE_PROJECTILE 16
-
-typedef struct
-{
-   unsigned int id;
-   unsigned short type;
-   char buffer[256];
-} NETWORK_MSG;
+#include "MessageContainer.h"
 
 using namespace std;
 
 class MessageProcessor {
+private:
+   int lastUsedId;
+
+   // map from message ids to maps from player addresses to message info
+   map<int, map<unsigned long, MessageContainer> > sentMessages;
+
+   // map from message ids to the time each mesage was acked
+   map<unsigned int, unsigned long long> ackedMessages;
+
+   unsigned long pid;
+
 public:
    MessageProcessor();
@@ -48,38 +28,4 @@
    void resendUnackedMessages(int sock);
    void cleanAckedMessages();
-
-private:
-   // this should eventually just replace the Message struct
-   class MessageContainer {
-   public:
-      MessageContainer() {
-      }
-
-      MessageContainer(const MessageContainer& mc) {
-         this->msg = mc.msg;
-         this->clientAddr = mc.clientAddr;
-      }
-
-      MessageContainer(NETWORK_MSG msg, struct sockaddr_in clientAddr) {
-         this->clientAddr = clientAddr;
-         this->msg = msg;
-      }
-
-      ~MessageContainer() {
-      }
-
-      NETWORK_MSG msg;
-      struct sockaddr_in clientAddr;
-      bool isAcked;
-      unsigned long long timeAcked;
-   };
-
-   int lastUsedId;
-
-   // map from message ids to maps from player addresses to message info
-   map<int, map<unsigned long, MessageContainer> > sentMessages;
-
-   // map from message ids to the time each mesage was acked
-   map<unsigned int, unsigned long long> ackedMessages;
 };
 
Index: server/makefile
===================================================================
--- server/makefile	(revision 411c1ae8b7592c4f51fb6168977bdf3a224ce16a)
+++ server/makefile	(revision 46d64695d8d9b46a9adea74da159caae18698af6)
@@ -3,5 +3,5 @@
 FLAGS = $(LIB_FLAGS)
 COMMON_PATH = ../common
-DEPENDENCIES = Common.o MessageProcessor.o Player.o WorldMap.o DataAccess.o Projectile.o
+DEPENDENCIES = Common.o MessageContainer.o MessageProcessor.o Player.o WorldMap.o DataAccess.o Projectile.o
 
 server : server.cpp $(DEPENDENCIES)
@@ -9,4 +9,7 @@
 
 Common.o : $(COMMON_PATH)/Common.cpp
+	$(CC) -c -o $@ $?
+
+MessageContainer.o : $(COMMON_PATH)/MessageContainer.cpp
 	$(CC) -c -o $@ $?
 
