Index: /code/trunk/src/network/Client.cc
===================================================================
--- /code/trunk/src/network/Client.cc	(revision 1768)
+++ /code/trunk/src/network/Client.cc	(revision 1769)
@@ -45,5 +45,5 @@
 #include "core/ConsoleCommand.h"
 #include "packet/Packet.h"
-#include "packet/Acknowledgement.h"
+// #include "packet/Acknowledgement.h"
 
 namespace network
@@ -166,24 +166,10 @@
       assert(packet->process());
     }
-    int gameStateID = gamestate.processGamestates();
-    if(gameStateID==GAMESTATEID_INITIAL)
-      if(gameStateFailure_){
-        packet::Acknowledgement *ack = new packet::Acknowledgement((unsigned int)GAMESTATEID_INITIAL, 0);
-        if(!ack->send())
-          COUT(3) << "could not (negatively) ack gamestate" << std::endl;
-        else
-          COUT(4) << "negatively acked a gamestate" << std::endl;
-        }
-      else
-        gameStateFailure_=true;
-    else if(gameStateID!=0){
-      // ack gamestate and set synched
+    if(gamestate.processGamestates())
+    {
       if(!isSynched_)
         isSynched_=true;
-      gameStateFailure_=false;
-      packet::Acknowledgement *ack = new packet::Acknowledgement(gameStateID, 0);
-      if(!ack->send())
-        COUT(3) << "could not ack gamestate" << std::endl;
-    }// otherwise we had no gamestate to load
+    }else
+      COUT(3) << "gamestate has not been processed sucessfully" << std::endl;
     gamestate.cleanup();
     return;
Index: /code/trunk/src/network/GamestateClient.cc
===================================================================
--- /code/trunk/src/network/GamestateClient.cc	(revision 1768)
+++ /code/trunk/src/network/GamestateClient.cc	(revision 1769)
@@ -35,4 +35,5 @@
 #include "core/Iterator.h"
 #include "Synchronisable.h"
+#include "packet/Acknowledgement.h"
 
 
@@ -70,15 +71,18 @@
   }
 
-  int GamestateClient::processGamestates(){
+  bool GamestateClient::processGamestates(){
     if(tempGamestate_==NULL)
-      return 0;
+      return false;
     int id = GAMESTATEID_INITIAL;
     bool b = saveShipCache();
     packet::Gamestate *processed = processGamestate(tempGamestate_);
-    if(!processed)
-      return GAMESTATEID_INITIAL;
+    if(!processed){
+      if(b)
+        loadShipCache();
+      return false;
+    }
 //    assert(processed);
     //successfully loaded data from gamestate. now save gamestate for diff and delete the old gs
-    tempGamestate_=0;
+    tempGamestate_=NULL;
     gamestateMap_[processed->getID()]=processed;
     last_diff_ = processed->getID();
@@ -86,6 +90,6 @@
       loadShipCache();
     id = processed->getID();
-    cleanup();
-    return id;
+    sendAck(id);
+    return true;
   }
 
@@ -129,4 +133,16 @@
     COUT(4) << std::endl;
 
+  }
+  
+  bool GamestateClient::sendAck(unsigned int gamestateID){
+    packet::Acknowledgement *ack = new packet::Acknowledgement(gamestateID, 0);
+    if(!ack->send()){
+      COUT(3) << "could not ack gamestate: " << gamestateID << std::endl;
+      return false;
+    }
+    else{
+      COUT(3) << "acked a gamestate: " << gamestateID << std::endl;
+      return true;
+    }
   }
 
@@ -169,6 +185,8 @@
     if(gs->isDiffed()){
       packet::Gamestate *base = gamestateMap_[gs->getBaseID()];
-      if(!base)
+      if(!base){
+        delete gs;
         return 0;
+      }
 //      assert(base); //TODO: fix this
       packet::Gamestate *undiffed = gs->undiff(base);
Index: /code/trunk/src/network/GamestateClient.h
===================================================================
--- /code/trunk/src/network/GamestateClient.h	(revision 1768)
+++ /code/trunk/src/network/GamestateClient.h	(revision 1769)
@@ -62,5 +62,5 @@
     bool ack(int gamestateID, int clientID);
 
-    int processGamestates();
+    bool processGamestates();
     packet::Gamestate *getGamestate();
     void cleanup();
@@ -69,4 +69,5 @@
     void removeObject(orxonox::ObjectListIterator<Synchronisable> &it);
     void printGamestateMap();
+    bool sendAck(unsigned int gamestateID);
     bool saveShipCache();
     bool loadShipCache();
Index: /code/trunk/src/network/GamestateManager.cc
===================================================================
--- /code/trunk/src/network/GamestateManager.cc	(revision 1768)
+++ /code/trunk/src/network/GamestateManager.cc	(revision 1769)
@@ -157,5 +157,5 @@
     int curid = temp->getGamestateID();
     
-    if(gamestateID == GAMESTATEID_INITIAL){
+    if(gamestateID == 0){
       temp->setGamestateID(GAMESTATEID_INITIAL);
       if(curid!=GAMESTATEID_INITIAL){
@@ -163,9 +163,10 @@
         --(gamestateUsed.find(curid)->second);
       }
-      return false;
-    }
-    if(curid > gamestateID)
+      return true;
+    }
+    //if(curid > gamestateID)
+    assert(curid<gamestateID);
       // the network packets got messed up 
-      return true;
+      //return true;
     COUT(4) << "acking gamestate " << gamestateID << " for clientid: " << clientID << " curid: " << curid << std::endl;
     // decrease usage of gamestate and save it
Index: /code/trunk/src/network/packet/Acknowledgement.cc
===================================================================
--- /code/trunk/src/network/packet/Acknowledgement.cc	(revision 1768)
+++ /code/trunk/src/network/packet/Acknowledgement.cc	(revision 1769)
@@ -31,4 +31,5 @@
 #include "network/Host.h"
 #include "network/GamestateHandler.h"
+#include "core/CoreIncludes.h"
 
 namespace network {
@@ -63,5 +64,5 @@
 
 bool Acknowledgement::process(){
-  bool b = GamestateHandler::ackGamestate(data_[_ACKID], clientID_);
+  bool b = GamestateHandler::ackGamestate(getAckID(), clientID_);
   delete this;
   return b;
@@ -69,5 +70,5 @@
 
 unsigned int Acknowledgement::getAckID(){
-  return *(unsigned int *)&data_[ _ACKID ];
+  return *(unsigned int *)(data_ + _ACKID);
 }
 
Index: /code/trunk/src/orxonox/objects/Model.cc
===================================================================
--- /code/trunk/src/orxonox/objects/Model.cc	(revision 1768)
+++ /code/trunk/src/orxonox/objects/Model.cc	(revision 1769)
@@ -52,6 +52,4 @@
         RegisterObject(Model);
         registerAllVariables();
-        if(this->isExactlyA(Class(Model)))
-           setObjectFrequency(1);
     }
 
@@ -87,4 +85,6 @@
         COUT(4) << "Loader (Model.cc): Created model" << std::endl;
       }
+      if(this->isExactlyA(Class(Model)))
+        setObjectFrequency(300); //sync all 10 seconds (this only applies to asteroids and other isExactlyA(Model)
       return true;
     }
