Index: /code/branches/objecthierarchy/src/orxonox/objects/gametypes/Gametype.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/gametypes/Gametype.cc	(revision 2159)
+++ /code/branches/objecthierarchy/src/orxonox/objects/gametypes/Gametype.cc	(revision 2160)
@@ -67,7 +67,8 @@
         if (!this->bStarted_)
             this->checkStart();
+        else
+            this->spawnDeadPlayersIfRequested();
 
         this->assignDefaultPawnsIfNeeded();
-        this->spawnDeadPlayersIfRequested();
     }
 
@@ -88,5 +89,5 @@
     void Gametype::playerEntered(PlayerInfo* player)
     {
-        this->players_.insert(player);
+        this->players_[player] = PlayerState::Joined;
 
         std::string message = player->getName() + " entered the game";
@@ -97,5 +98,5 @@
     void Gametype::playerLeft(PlayerInfo* player)
     {
-        std::set<PlayerInfo*>::iterator it = this->players_.find(player);
+        std::map<PlayerInfo*, PlayerState::Enum>::iterator it = this->players_.find(player);
         if (it != this->players_.end())
         {
@@ -165,11 +166,11 @@
     }
 
-    void Gametype::assignDefaultPawnsIfNeeded() const
-    {
-        for (std::set<PlayerInfo*>::const_iterator it = this->players_.begin(); it != this->players_.end(); ++it)
-        {
-            if (!(*it)->getControllableEntity() && (!(*it)->isReadyToSpawn() || !this->bStarted_))
-            {
-                SpawnPoint* spawn = this->getBestSpawnPoint(*it);
+    void Gametype::assignDefaultPawnsIfNeeded()
+    {
+        for (std::map<PlayerInfo*, PlayerState::Enum>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
+        {
+            if (!it->first->getControllableEntity() && (!it->first->isReadyToSpawn() || !this->bStarted_))
+            {
+                SpawnPoint* spawn = this->getBestSpawnPoint(it->first);
                 if (spawn)
                 {
@@ -177,5 +178,6 @@
                     ControllableEntity* entity = this->defaultControllableEntity_.fabricate(spawn);
                     spawn->spawn(entity);
-                    (*it)->startControl(entity);
+                    it->first->startControl(entity);
+                    it->second = PlayerState::Dead;
                 }
                 else
@@ -210,7 +212,7 @@
                 {
                     bool allplayersready = true;
-                    for (std::set<PlayerInfo*>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
+                    for (std::map<PlayerInfo*, PlayerState::Enum>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
                     {
-                        if (!(*it)->isReadyToSpawn())
+                        if (!it->first->isReadyToSpawn())
                             allplayersready = false;
                     }
@@ -227,15 +229,15 @@
     void Gametype::spawnPlayersIfRequested()
     {
-        for (std::set<PlayerInfo*>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
-            if ((*it)->isReadyToSpawn() || this->bForceSpawn_)
-                this->spawnPlayer(*it);
+        for (std::map<PlayerInfo*, PlayerState::Enum>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
+            if (it->first->isReadyToSpawn() || this->bForceSpawn_)
+                this->spawnPlayer(it->first);
     }
 
     void Gametype::spawnDeadPlayersIfRequested()
     {
-        for (std::set<PlayerInfo*>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
-            if (!(*it)->getControllableEntity())
-                if ((*it)->isReadyToSpawn() || this->bForceSpawn_)
-                    this->spawnPlayer(*it);
+        for (std::map<PlayerInfo*, PlayerState::Enum>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
+            if (it->second == PlayerState::Dead)
+                if (it->first->isReadyToSpawn() || this->bForceSpawn_)
+                    this->spawnPlayer(it->first);
     }
 
@@ -246,4 +248,5 @@
         {
             player->startControl(spawnpoint->spawn());
+            this->players_[player] = PlayerState::Alive;
         }
         else
Index: /code/branches/objecthierarchy/src/orxonox/objects/gametypes/Gametype.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/gametypes/Gametype.h	(revision 2159)
+++ /code/branches/objecthierarchy/src/orxonox/objects/gametypes/Gametype.h	(revision 2160)
@@ -41,4 +41,15 @@
 namespace orxonox
 {
+    namespace PlayerState
+    {
+        enum Enum
+        {
+            Uninitialized,
+            Joined,
+            Alive,
+            Dead
+        };
+    }
+
     class _OrxonoxExport Gametype : public BaseObject, public Tickable
     {
@@ -70,5 +81,5 @@
             virtual void pawnPostSpawn(Pawn* pawn);
 
-            inline const std::set<PlayerInfo*>& getPlayers() const
+            inline const std::map<PlayerInfo*, PlayerState::Enum>& getPlayers() const
                 { return this->players_; }
 
@@ -87,5 +98,5 @@
             void removePlayer(PlayerInfo* player);
 
-            void assignDefaultPawnsIfNeeded() const;
+            void assignDefaultPawnsIfNeeded();
             void checkStart();
             void spawnPlayer(PlayerInfo* player);
@@ -102,5 +113,5 @@
             bool bStartCountdownRunning_;
 
-            std::set<PlayerInfo*> players_;
+            std::map<PlayerInfo*, PlayerState::Enum> players_;
             std::set<SpawnPoint*> spawnpoints_;
             SubclassIdentifier<ControllableEntity> defaultControllableEntity_;
Index: /code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2159)
+++ /code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2160)
@@ -46,6 +46,6 @@
         RegisterObject(HumanPlayer);
 
-        this->server_ready_ = Core::isMaster();
-        this->client_ready_ = false;
+        this->server_initialized_ = Core::isMaster();
+        this->client_initialized_ = false;
 
         this->bHumanPlayer_ = true;
@@ -70,6 +70,6 @@
 
         REGISTERDATA(this->clientID_,     direction::toclient, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_clientIDchanged));
-        REGISTERDATA(this->server_ready_, direction::toclient, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_server_ready));
-        REGISTERDATA(this->client_ready_, direction::toserver, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_client_ready));
+        REGISTERDATA(this->server_initialized_, direction::toclient, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_server_initialized));
+        REGISTERDATA(this->client_initialized_, direction::toserver, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_client_initialized));
     }
 
@@ -96,5 +96,5 @@
             this->bLocalPlayer_ = true;
             this->synchronize_nick_ = this->nick_;
-            this->client_ready_ = true;
+            this->client_initialized_ = true;
 
             if (!Core::isMaster())
@@ -107,10 +107,10 @@
     }
 
-    void HumanPlayer::networkcallback_server_ready()
+    void HumanPlayer::networkcallback_server_initialized()
     {
-        this->client_ready_ = true;
+        this->client_initialized_ = true;
     }
 
-    void HumanPlayer::networkcallback_client_ready()
+    void HumanPlayer::networkcallback_client_initialized()
     {
         if (this->getGametype())
@@ -118,7 +118,7 @@
     }
 
-    bool HumanPlayer::isReady() const
+    bool HumanPlayer::isInitialized() const
     {
-        return (this->server_ready_ && this->client_ready_);
+        return (this->server_initialized_ && this->client_initialized_);
     }
 
Index: /code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.h	(revision 2159)
+++ /code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.h	(revision 2160)
@@ -47,5 +47,5 @@
             void setConfigValues();
 
-            bool isReady() const;
+            bool isInitialized() const;
             float getPing() const;
             float getPacketLossRatio() const;
@@ -57,11 +57,11 @@
             void networkcallback_changednick();
             void networkcallback_clientIDchanged();
-            void networkcallback_server_ready();
-            void networkcallback_client_ready();
+            void networkcallback_server_initialized();
+            void networkcallback_client_initialized();
 
             std::string nick_;
             std::string synchronize_nick_;
-            bool server_ready_;
-            bool client_ready_;
+            bool server_initialized_;
+            bool client_initialized_;
     };
 }
Index: /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2159)
+++ /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2160)
@@ -55,5 +55,5 @@
     PlayerInfo::~PlayerInfo()
     {
-        if (this->isInitialized())
+        if (this->BaseObject::isInitialized())
         {
             this->stopControl(this->controllableEntity_);
@@ -76,5 +76,5 @@
     void PlayerInfo::changedName()
     {
-        if (this->isReady() && this->getGametype())
+        if (this->isInitialized() && this->getGametype())
             this->getGametype()->playerChangedName(this);
     }
@@ -82,5 +82,5 @@
     void PlayerInfo::changedGametype()
     {
-        if (this->isReady())
+        if (this->isInitialized())
         {
             if (this->getOldGametype())
Index: /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.h	(revision 2159)
+++ /code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.h	(revision 2160)
@@ -55,8 +55,6 @@
             inline unsigned int getClientID() const
                 { return this->clientID_; }
-            inline bool isReadyToSpawn() const
-                { return this->bReadyToSpawn_; }
 
-            virtual bool isReady() const = 0;
+            virtual bool isInitialized() const = 0;
             virtual float getPing() const = 0;
             virtual float getPacketLossRatio() const = 0;
@@ -64,4 +62,6 @@
             inline void setReadyToSpawn(bool bReady)
                 { this->bReadyToSpawn_ = bReady; }
+            inline bool isReadyToSpawn() const
+                { return this->bReadyToSpawn_; }
 
             void startControl(ControllableEntity* entity);
