Index: /code/branches/objecthierarchy/src/network/Synchronisable.cc
===================================================================
--- /code/branches/objecthierarchy/src/network/Synchronisable.cc	(revision 2040)
+++ /code/branches/objecthierarchy/src/network/Synchronisable.cc	(revision 2041)
@@ -77,7 +77,7 @@
     if (creator)
     {
-        if (creator->isA(Class(Synchronisable)))
+        Synchronisable* synchronisable_creator = dynamic_cast<Synchronisable*>(creator);
+        if (synchronisable_creator && synchronisable_creator->objectMode_)
         {
-            Synchronisable* synchronisable_creator = dynamic_cast<Synchronisable*>(creator);
             this->creatorID = synchronisable_creator->getObjectID();
         }
@@ -147,5 +147,5 @@
     synchronisableHeader *header = (synchronisableHeader *)mem;
 
-    COUT(3) << "fabricating object with id: " << header->objectID << std::endl;
+    COUT(4) << "fabricating object with id: " << header->objectID << std::endl;
 
     orxonox::Identifier* id = ClassByID(header->classID);
@@ -170,5 +170,5 @@
     no->creatorID=header->creatorID; //TODO: remove this
     no->classID=header->classID;
-    COUT(3) << "fabricate objectID: " << no->objectID << " classID: " << no->classID << std::endl;
+    COUT(4) << "fabricate objectID: " << no->objectID << " classID: " << no->classID << std::endl;
           // update data and create object/entity...
     bool b = no->updateData(mem, mode, true);
Index: /code/branches/objecthierarchy/src/network/packet/Gamestate.cc
===================================================================
--- /code/branches/objecthierarchy/src/network/packet/Gamestate.cc	(revision 2040)
+++ /code/branches/objecthierarchy/src/network/packet/Gamestate.cc	(revision 2041)
@@ -254,5 +254,5 @@
   HEADER->compressed = true;
   assert(HEADER->compressed);
-  COUT(3) << "gamestate compress datasize: " << HEADER->datasize << " compsize: " << HEADER->compsize << std::endl;
+  COUT(4) << "gamestate compress datasize: " << HEADER->datasize << " compsize: " << HEADER->compsize << std::endl;
   return true;
 }
@@ -261,5 +261,5 @@
   assert(HEADER);
   assert(HEADER->compressed);
-  COUT(3) << "GameStateClient: uncompressing gamestate. id: " << HEADER->id << ", baseid: " << HEADER->base_id << ", datasize: " << HEADER->datasize << ", compsize: " << HEADER->compsize << std::endl;
+  COUT(4) << "GameStateClient: uncompressing gamestate. id: " << HEADER->id << ", baseid: " << HEADER->base_id << ", datasize: " << HEADER->datasize << ", compsize: " << HEADER->compsize << std::endl;
   unsigned int datasize = HEADER->datasize;
   unsigned int compsize = HEADER->compsize;
Index: /code/branches/objecthierarchy/src/orxonox/LevelManager.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/LevelManager.cc	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/LevelManager.cc	(revision 2041)
@@ -112,4 +112,7 @@
         assert(!this->clients_[clientID]);
         this->clients_[clientID] = player;
+
+        if (this->getActiveLevel())
+            this->getActiveLevel()->playerEntered(player);
     }
 
@@ -121,4 +124,7 @@
         PlayerInfo* player = this->clients_[clientID];
         this->clients_.erase(clientID);
+
+        if (this->getActiveLevel())
+            this->getActiveLevel()->playerLeft(player);
 
         // delete PlayerInfo instance
Index: /code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.h	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.h	(revision 2041)
@@ -48,5 +48,5 @@
 
             virtual inline void setControllableEntity(ControllableEntity* entity)
-                { this->controllableEntity_ = entity; }
+                { COUT(0) << "HC: start controlling entity" << std::endl; this->controllableEntity_ = entity; }
             virtual inline ControllableEntity* getControllableEntity() const
                 { return this->controllableEntity_; }
Index: /code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.cc	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.cc	(revision 2041)
@@ -57,4 +57,6 @@
 
         HumanController::localController_s = this;
+
+        COUT(0) << "HumanController created" << std::endl;
     }
 
Index: /code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2041)
@@ -55,9 +55,35 @@
         this->registerVariables();
 
-        COUT(0) << "HumanPlayer created" << std::endl;
+COUT(0) << this->getObjectID() << ": HumanPlayer created" << std::endl;
+        network::Synchronisable* temp = dynamic_cast<network::Synchronisable*>(creator);
+        if (temp)
+        {
+COUT(0) << this->getObjectID() << ": CreatorID: " << temp->getObjectID() << std::endl;
+        }
+        else
+        {
+COUT(0) << this->getObjectID() << ": Creator is no Synchronisable" << std::endl;
+        }
+    unsigned int creatorID = network::OBJECTID_UNKNOWN;
+    searchcreatorID:
+    if (creator)
+    {
+        if (creator->isA(Class(Synchronisable)))
+        {
+            Synchronisable* synchronisable_creator = dynamic_cast<Synchronisable*>(creator);
+            creatorID = synchronisable_creator->getObjectID();
+        }
+        else if (creator != creator->getCreator())
+        {
+            creator = creator->getCreator();
+            goto searchcreatorID;
+        }
+    }
+COUT(0) << this->getObjectID() << ": ### tranmitted creatorID: " << creatorID << std::endl;
     }
 
     HumanPlayer::~HumanPlayer()
     {
+COUT(0) << this->getObjectID() << ": HumanPlayer destroyed" << std::endl;
     }
 
@@ -94,6 +120,8 @@
     void HumanPlayer::networkcallback_clientIDchanged()
     {
+COUT(0) << this->getObjectID() << ": PI: clientID changed to " << this->clientID_ << std::endl;
         if (this->clientID_ == network::Host::getPlayerID())
         {
+COUT(0) << this->getObjectID() << ": PI: it's my clientID" << std::endl;
             this->bLocalPlayer_ = true;
             this->synchronize_nick_ = this->nick_;
@@ -101,5 +129,8 @@
 
             if (!Core::isMaster())
+            {
                 this->setObjectMode(network::direction::bidirectional);
+COUT(0) << this->getObjectID() << ": PI: set objectmode to bidirectional" << std::endl;
+            }
             else
                 this->setName(this->nick_);
@@ -112,10 +143,15 @@
     {
         this->client_ready_ = true;
+COUT(0) << this->getObjectID() << ": PI: server ready, client set ready too" << std::endl;
     }
 
     void HumanPlayer::networkcallback_client_ready()
     {
+COUT(0) << this->getObjectID() << ": PI: client ready" << std::endl;
         if (this->getGametype())
+        {
+COUT(0) << this->getObjectID() << ": PI: adding client to gametype" << std::endl;
             this->getGametype()->playerEntered(this);
+        }
     }
 
@@ -137,4 +173,5 @@
     void HumanPlayer::setClientID(unsigned int clientID)
     {
+COUT(0) << this->getObjectID() << ": PI: set clientID to " << clientID << std::endl;
         this->clientID_ = clientID;
         this->networkcallback_clientIDchanged();
Index: /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2041)
@@ -71,4 +71,5 @@
         REGISTERSTRING(this->name_,                 network::direction::toclient, new network::NetworkCallback<PlayerInfo>(this, &PlayerInfo::changedName));
         REGISTERDATA  (this->controllableEntityID_, network::direction::toclient, new network::NetworkCallback<PlayerInfo>(this, &PlayerInfo::networkcallback_changedcontrollableentityID));
+        REGISTERDATA  (this->bReadyToSpawn_,        network::direction::toserver);
     }
 
@@ -127,10 +128,10 @@
             this->controllableEntityID_ = network::OBJECTID_UNKNOWN;
         }
-
+COUT(0) << this->getObjectID() << ": PI: start control" << std::endl;
         if (this->controller_)
             this->controller_->setControllableEntity(entity);
     }
 
-    void PlayerInfo::stopControl(ControllableEntity* entity)
+    void PlayerInfo::stopControl(ControllableEntity* entity, bool callback)
     {
         if (entity && this->controllableEntity_ == entity)
@@ -142,5 +143,6 @@
                 this->controller_->setControllableEntity(0);
 
-            entity->removePlayer();
+            if (callback)
+                entity->removePlayer();
         }
     }
Index: /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.h	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.h	(revision 2041)
@@ -66,5 +66,5 @@
 
             void startControl(ControllableEntity* entity);
-            void stopControl(ControllableEntity* entity);
+            void stopControl(ControllableEntity* entity, bool callback = true);
 
             inline ControllableEntity* getControllableEntity() const
Index: /code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2041)
@@ -81,4 +81,7 @@
             if (this->camera_)
                 delete this->camera_;
+
+            if (this->getPlayer() && this->getPlayer()->getControllableEntity() == this)
+                this->getPlayer()->stopControl(this, false);
         }
     }
Index: /code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/SpaceShip.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/SpaceShip.cc	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/SpaceShip.cc	(revision 2041)
@@ -58,4 +58,6 @@
         this->bInvertYAxis_ = false;
 
+        this->setDestroyWhenPlayerLeft(true);
+
         this->setConfigValues();
         this->registerVariables();
@@ -80,4 +82,10 @@
     void SpaceShip::registerVariables()
     {
+        REGISTERDATA(this->maxSpeed_,                network::direction::toclient);
+        REGISTERDATA(this->maxSecondarySpeed_,       network::direction::toclient);
+        REGISTERDATA(this->maxRotation_,             network::direction::toclient);
+        REGISTERDATA(this->translationAcceleration_, network::direction::toclient);
+        REGISTERDATA(this->rotationAcceleration_,    network::direction::toclient);
+        REGISTERDATA(this->translationDamping_,      network::direction::toclient);
     }
 
@@ -89,62 +97,68 @@
     void SpaceShip::tick(float dt)
     {
-        // #####################################
-        // ############# STEERING ##############
-        // #####################################
-
-        Vector3 velocity = this->getVelocity();
-        if (velocity.x > this->maxSecondarySpeed_)
-            velocity.x = this->maxSecondarySpeed_;
-        if (velocity.x < -this->maxSecondarySpeed_)
-            velocity.x = -this->maxSecondarySpeed_;
-        if (velocity.y > this->maxSecondarySpeed_)
-            velocity.y = this->maxSecondarySpeed_;
-        if (velocity.y < -this->maxSecondarySpeed_)
-            velocity.y = -this->maxSecondarySpeed_;
-        if (velocity.z > this->maxSecondarySpeed_)
-            velocity.z = this->maxSecondarySpeed_;
-        if (velocity.z < -this->maxSpeed_)
-            velocity.z = -this->maxSpeed_;
-
-        // normalize velocity and acceleration
-        for (size_t dimension = 0; dimension < 3; ++dimension)
+        if (this->isLocallyControlled())
         {
-            if (this->acceleration_[dimension] == 0)
+            // #####################################
+            // ############# STEERING ##############
+            // #####################################
+
+            Vector3 velocity = this->getVelocity();
+            if (velocity.x > this->maxSecondarySpeed_)
+                velocity.x = this->maxSecondarySpeed_;
+            if (velocity.x < -this->maxSecondarySpeed_)
+                velocity.x = -this->maxSecondarySpeed_;
+            if (velocity.y > this->maxSecondarySpeed_)
+                velocity.y = this->maxSecondarySpeed_;
+            if (velocity.y < -this->maxSecondarySpeed_)
+                velocity.y = -this->maxSecondarySpeed_;
+            if (velocity.z > this->maxSecondarySpeed_)
+                velocity.z = this->maxSecondarySpeed_;
+            if (velocity.z < -this->maxSpeed_)
+                velocity.z = -this->maxSpeed_;
+
+            // normalize velocity and acceleration
+            for (size_t dimension = 0; dimension < 3; ++dimension)
             {
-                if (velocity[dimension] > 0)
+                if (this->acceleration_[dimension] == 0)
                 {
-                    velocity[dimension] -= (this->translationDamping_ * dt);
-                    if (velocity[dimension] < 0)
-                        velocity[dimension] = 0;
-                }
-                else if (velocity[dimension] < 0)
-                {
-                    velocity[dimension] += (this->translationDamping_ * dt);
                     if (velocity[dimension] > 0)
-                        velocity[dimension] = 0;
+                    {
+                        velocity[dimension] -= (this->translationDamping_ * dt);
+                        if (velocity[dimension] < 0)
+                            velocity[dimension] = 0;
+                    }
+                    else if (velocity[dimension] < 0)
+                    {
+                        velocity[dimension] += (this->translationDamping_ * dt);
+                        if (velocity[dimension] > 0)
+                            velocity[dimension] = 0;
+                    }
                 }
             }
+
+            this->setVelocity(velocity);
         }
 
-        this->setVelocity(velocity);
-
 
         SUPER(SpaceShip, tick, dt);
 
 
-        this->yaw(this->yawRotation_ * dt);
-        if (this->bInvertYAxis_)
-            this->pitch(Degree(-this->pitchRotation_ * dt));
-        else
-            this->pitch(Degree( this->pitchRotation_ * dt));
-        this->roll(this->rollRotation_ * dt);
-
-        this->acceleration_.x = 0;
-        this->acceleration_.y = 0;
-        this->acceleration_.z = 0;
-
-        this->yawRotation_   = this->zeroDegree_;
-        this->pitchRotation_ = this->zeroDegree_;
-        this->rollRotation_  = this->zeroDegree_;
+        if (this->isLocallyControlled())
+        {
+            this->yaw(this->yawRotation_ * dt);
+            if (this->bInvertYAxis_)
+                this->pitch(Degree(-this->pitchRotation_ * dt));
+            else
+                this->pitch(Degree( this->pitchRotation_ * dt));
+            this->roll(this->rollRotation_ * dt);
+
+            this->acceleration_.x = 0;
+            this->acceleration_.y = 0;
+            this->acceleration_.z = 0;
+
+            this->yawRotation_   = this->zeroDegree_;
+            this->pitchRotation_ = this->zeroDegree_;
+            this->rollRotation_  = this->zeroDegree_;
+        }
     }
 
Index: /code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 2041)
@@ -56,4 +56,5 @@
         this->roll_ = 0;
         this->setHudTemplate("spectatorhud");
+        this->hudmode_ = 0;
 
         this->setDestroyWhenPlayerLeft(true);
@@ -85,4 +86,5 @@
         REGISTERDATA(this->bGreetingFlareVisible_, network::direction::toclient, new network::NetworkCallback<Spectator>(this, &Spectator::changedFlareVisibility));
         REGISTERDATA(this->bGreeting_,             network::direction::toserver, new network::NetworkCallback<Spectator>(this, &Spectator::changedGreeting));
+        REGISTERDATA(this->hudmode_,               network::direction::toclient);
     }
 
@@ -100,8 +102,8 @@
     void Spectator::tick(float dt)
     {
+        this->updateHUD();
+
         if (this->isLocallyControlled())
         {
-            this->updateHUD();
-
             Vector3 velocity = this->getVelocity();
             velocity.normalise();
@@ -187,8 +189,6 @@
     {
         // <hack>
-        if (this->getHUD())
-        {
-            std::string text;
-
+        if (Core::isMaster())
+        {
             if (this->getPlayer() && this->getGametype())
             {
@@ -196,27 +196,45 @@
                 {
                     if (!this->getPlayer()->isReadyToSpawn())
-                        text = "Press [Fire] to start the match";
+                        this->hudmode_ = 0;
                     else
-                        text = "Waiting for other players";
+                        this->hudmode_ = 1;
                 }
                 else if (!this->getGametype()->hasEnded())
                 {
                     if (this->getGametype()->isStartCountdownRunning())
-                    {
-                        text = convertToString(ceil(this->getGametype()->getStartCountdown()));
-                    }
+                        this->hudmode_ = 2 + 10*ceil(this->getGametype()->getStartCountdown());
                     else
-                    {
-                        text = "Press [Fire] to respawn";
-                    }
+                        this->hudmode_ = 3;
                 }
                 else
-                {
+                    this->hudmode_ = 4;
+            }
+            else
+                return;
+        }
+
+        if (this->getHUD())
+        {
+            std::string text;
+            int hudmode = this->hudmode_ % 10;
+
+            switch (hudmode)
+            {
+                case 0:
+                    text = "Press [Fire] to start the match";
+                    break;
+                case 1:
+                    text = "Waiting for other players";
+                    break;
+                case 2:
+                    text = convertToString((this->hudmode_ - 2) / 10);
+                    break;
+                case 3:
+                    text = "Press [Fire] to respawn";
+                    break;
+                case 4:
                     text = "Game has ended";
-                }
-            }
-            else
-            {
-                return;
+                    break;
+                default:;
             }
 
Index: /code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 2040)
+++ /code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 2041)
@@ -74,4 +74,6 @@
             float pitch_;
             float roll_;
+
+            int hudmode_;
     };
 }
