Index: /code/branches/tutoriallevel3/src/orxonox/gametypes/Gametype.cc
===================================================================
--- /code/branches/tutoriallevel3/src/orxonox/gametypes/Gametype.cc	(revision 8633)
+++ /code/branches/tutoriallevel3/src/orxonox/gametypes/Gametype.cc	(revision 8634)
@@ -58,6 +58,4 @@
 
         this->defaultControllableEntity_ = Class(Spectator);
-
-        this->bFirstTick_ = true;
         
         this->bAutoStart_ = false;
@@ -114,11 +112,4 @@
         SUPER(Gametype, tick, dt);
 
-        // Activate the GametypeInfo.
-        if(this->bFirstTick_)
-        {
-            this->gtinfo_->setActive(true);
-            this->bFirstTick_ = false;
-        }
-
         //count timer
         if (timerIsActive_)
@@ -134,5 +125,14 @@
 
         if (!this->gtinfo_->hasStarted())
+        {
+            for (std::map<PlayerInfo*, Player>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
+            {
+                // Inform the GametypeInfo that the player is ready to spawn.
+                if(it->first->isHumanPlayer() && it->first->isReadyToSpawn())
+                    this->gtinfo_->playerReadyToSpawn(it->first);
+            }
+                    
             this->checkStart();
+        }
         else if (!this->gtinfo_->hasEnded())
             this->spawnDeadPlayersIfRequested();
@@ -182,4 +182,5 @@
     {
         this->players_[player].state_ = PlayerState::Joined;
+        this->gtinfo_->playerEntered(player);
     }
 
@@ -396,9 +397,4 @@
                         if (it->first->isHumanPlayer())
                             hashumanplayers = true;
-
-                        // Inform the GametypeInfo that the player is ready to spawn.
-                        // TODO: Can it happen, that that changes?
-                        if(it->first->isHumanPlayer() && it->first->isReadyToSpawn())
-                            this->gtinfo_->playerReadyToSpawn(it->first);
                     }
                     if (allplayersready && hashumanplayers)
Index: /code/branches/tutoriallevel3/src/orxonox/gametypes/Gametype.h
===================================================================
--- /code/branches/tutoriallevel3/src/orxonox/gametypes/Gametype.h	(revision 8633)
+++ /code/branches/tutoriallevel3/src/orxonox/gametypes/Gametype.h	(revision 8634)
@@ -167,6 +167,4 @@
 
             SmartPtr<GametypeInfo> gtinfo_;
-
-            bool bFirstTick_; //!< Whether this is the first tick or not.
             
             bool bAutoStart_;
Index: /code/branches/tutoriallevel3/src/orxonox/infos/GametypeInfo.cc
===================================================================
--- /code/branches/tutoriallevel3/src/orxonox/infos/GametypeInfo.cc	(revision 8633)
+++ /code/branches/tutoriallevel3/src/orxonox/infos/GametypeInfo.cc	(revision 8634)
@@ -40,4 +40,5 @@
 #include "util/Convert.h"
 
+#include "controllers/HumanController.h"
 #include "interfaces/GametypeMessageListener.h"
 #include "interfaces/NotificationListener.h"
@@ -55,4 +56,7 @@
     registerMemberNetworkFunction(GametypeInfo, dispatchFadingMessage);
 
+    registerMemberNetworkFunction(GametypeInfo, changedReadyToSpawn);
+    registerMemberNetworkFunction(GametypeInfo, changedSpawned);
+
     /*static*/ const std::string GametypeInfo::NOTIFICATION_SENDER("gameinfo");
 
@@ -64,6 +68,4 @@
     {
         RegisterObject(GametypeInfo);
-
-        this->bActive_ = false; // At first the GametypeInfo is inactive.
         
         this->bStarted_ = false;
@@ -72,4 +74,6 @@
         this->bStartCountdownRunning_ = false;
         this->counter_ = 0;
+        this->spawned_ = false;
+        this->readyToSpawn_ = false;
 
         this->registerVariables();
@@ -92,17 +96,4 @@
     /**
     @brief
-        Is called when the activity has changed.
-    */
-    void GametypeInfo::changedActivity(void)
-    {
-        SUPER(GametypeInfo, changedActivity);
-
-        // If the GametypeInfo has become active the "Press [Fire] to start the match" notification is sent.
-        if(this->isActive())
-            NotificationListener::sendNotification("Press [Fire] to start the match", GametypeInfo::NOTIFICATION_SENDER);
-    }
-
-    /**
-    @brief
         Is called when the game has changed to started.
     */
@@ -129,9 +120,6 @@
     void GametypeInfo::changedStartCountdownRunning(void)
     {
-        // Clear the notifications if the countdown has stopped running.
-        if(!this->hasStarted() && !this->isStartCountdownRunning() && !this->hasEnded())
-            NotificationListener::sendCommand("clear", GametypeInfo::NOTIFICATION_SENDER);
         // Send first countdown notification if the countdown has started.
-        if(!this->hasStarted() && this->isStartCountdownRunning() && !this->hasEnded())
+        if(this->isReadyToSpawn() && !this->hasStarted() && this->isStartCountdownRunning() && !this->hasEnded())
             NotificationListener::sendNotification(multi_cast<std::string>(this->counter_), GametypeInfo::NOTIFICATION_SENDER);
     }
@@ -144,5 +132,5 @@
     {
         // Send countdown notification if the counter has gone down.
-        if(!this->hasStarted() && this->isStartCountdownRunning() && !this->hasEnded())
+        if(this->isReadyToSpawn() &&  !this->hasStarted() && this->isStartCountdownRunning() && !this->hasEnded())
             NotificationListener::sendNotification(multi_cast<std::string>(this->counter_), GametypeInfo::NOTIFICATION_SENDER);
     }
@@ -150,16 +138,21 @@
     /**
     @brief
-        Is called when a player has become ready to spawn.
-    @param player
-        The player that has become ready to spawn.
-    */
-    void GametypeInfo::changedReadyToSpawn(PlayerInfo* player)
-    {
-        // Send "Waiting for other players" over the network to the right player if a player has become ready to spawn.
-        if(!this->hasStarted() && !this->isStartCountdownRunning() && !this->hasEnded())
-            NotificationListener::sendNotification("Waiting for other players", GametypeInfo::NOTIFICATION_SENDER, notificationMessageType::info, notificationSendMode::network, player->getClientID());
-        // Clear the notifications if the player has respawned.
-        if(this->hasStarted() && !this->hasEnded())
-            NotificationListener::sendCommand("clear", GametypeInfo::NOTIFICATION_SENDER, notificationSendMode::network, player->getClientID());
+        Inform the GametypeInfo that the local player has changed its ready to spawn status.
+    @param ready
+        Whether the player has become ready to spawn or not.
+    */
+    void GametypeInfo::changedReadyToSpawn(bool ready)
+    {
+        if(this->readyToSpawn_ == ready)
+            return;
+
+        this->readyToSpawn_ = ready;
+
+        // Send "Waiting for other players" if the player is ready to spawn but the game has not yet started nor is the countdown running.
+        if(this->readyToSpawn_ && !this->hasStarted() && !this->isStartCountdownRunning() && !this->hasEnded())
+            NotificationListener::sendNotification("Waiting for other players", GametypeInfo::NOTIFICATION_SENDER);
+        // Send current countdown if the player is ready to spawn and the countdown has already started.
+        else if(this->readyToSpawn_ && !this->hasStarted() && this->isStartCountdownRunning() && !this->hasEnded())
+            NotificationListener::sendNotification(multi_cast<std::string>(this->counter_), GametypeInfo::NOTIFICATION_SENDER);
     }
 
@@ -241,9 +234,12 @@
     void GametypeInfo::startStartCountdown(void)
     {
-        if(this->bStartCountdownRunning_)
-            return;
-        
-        this->bStartCountdownRunning_ = true;
-        this->changedStartCountdownRunning();
+        if(GameMode::isMaster())
+        {
+            if(this->bStartCountdownRunning_)
+                return;
+
+            this->bStartCountdownRunning_ = true;
+            this->changedStartCountdownRunning();
+        }
     }
 
@@ -254,9 +250,12 @@
     void GametypeInfo::stopStartCountdown(void)
     {
-        if(!this->bStartCountdownRunning_)
-            return;
-        
-        this->bStartCountdownRunning_ = false;
-        this->changedStartCountdownRunning();
+        if(GameMode::isMaster())
+        {
+            if(!this->bStartCountdownRunning_)
+                return;
+
+            this->bStartCountdownRunning_ = false;
+            this->changedStartCountdownRunning();
+        }
     }
 
@@ -269,10 +268,13 @@
     void GametypeInfo::playerReadyToSpawn(PlayerInfo* player)
     {
-        // If the player has spawned already.
-        if(this->spawned_.find(player) != this->spawned_.end())
-            return;
-
-        this->spawned_.insert(player);
-        this->changedReadyToSpawn(player);
+        if(GameMode::isMaster())
+        {
+            // If the player has spawned already.
+            if(this->spawnedPlayers_.find(player) != this->spawnedPlayers_.end())
+                return;
+
+            this->spawnedPlayers_.insert(player);
+            this->setReadyToSpawnHelper(player, true);
+        }
     }
 
@@ -285,7 +287,12 @@
     void GametypeInfo::pawnKilled(PlayerInfo* player)
     {
-        NotificationListener::sendNotification("Press [Fire] to respawn", GametypeInfo::NOTIFICATION_SENDER, notificationMessageType::info, notificationSendMode::network, player->getClientID());
-        // Remove the player from the list of players that have spawned, since it currently is not.
-        this->spawned_.erase(player);
+        if(GameMode::isMaster())
+        {
+            NotificationListener::sendNotification("Press [Fire] to respawn", GametypeInfo::NOTIFICATION_SENDER, notificationMessageType::info, notificationSendMode::network, player->getClientID());
+            // Remove the player from the list of players that have spawned, since it currently is not.
+            this->spawnedPlayers_.erase(player);
+            this->setReadyToSpawnHelper(player, false);
+            this->setSpawnedHelper(player, false);
+        }
     }
 
@@ -298,7 +305,90 @@
     void GametypeInfo::playerSpawned(PlayerInfo* player)
     {
-        if(this->hasStarted() && !this->hasEnded())
-            NotificationListener::sendCommand("clear", GametypeInfo::NOTIFICATION_SENDER, notificationSendMode::network, player->getClientID());
-    }
+        if(GameMode::isMaster())
+        {
+            if(this->hasStarted() && !this->hasEnded())
+            {
+                //NotificationListener::sendCommand("clear", GametypeInfo::NOTIFICATION_SENDER, notificationSendMode::network, player->getClientID());
+                this->setSpawnedHelper(player, true);
+            }
+        }
+    }
+
+    /**
+    @brief
+        Inform the GametypeInfo that the local player has changed its spawned status.
+    @param spawned
+        Whether the local player has changed to spawned or to not spawned.
+    */
+    void GametypeInfo::changedSpawned(bool spawned)
+    {
+        if(this->spawned_ == spawned)
+            return;
+        
+        this->spawned_ = spawned;
+        // Clear the notifications if the Player has spawned.
+        if(this->spawned_ && !this->hasEnded())
+            NotificationListener::sendCommand("clear", GametypeInfo::NOTIFICATION_SENDER);
+    }
+
+    /**
+    @brief
+        Inform the GametypeInfo about a player that has entered,
+    @param player
+        The player that has entered.
+    */
+    void GametypeInfo::playerEntered(PlayerInfo* player)
+    {
+        if(GameMode::isMaster())
+        {
+            // Display "Press [Fire] to start the match" if the game has not yet ended.
+            if(!this->hasEnded())
+                NotificationListener::sendNotification("Press [Fire] to start the match", GametypeInfo::NOTIFICATION_SENDER, notificationMessageType::info, notificationSendMode::network, player->getClientID());
+            // Else display "Game has ended".
+            else
+                NotificationListener::sendNotification("Game has ended", GametypeInfo::NOTIFICATION_SENDER, notificationMessageType::info, notificationSendMode::network, player->getClientID());
+        }
+    }
+
+    /**
+    @brief
+        Helper method. Sends changedReadyToSpawn notifiers over the network.
+    @param player
+        The player that has changed its ready to spawn status.
+    @param ready
+        The new ready to spawn status.
+    */
+    void GametypeInfo::setReadyToSpawnHelper(PlayerInfo* player, bool ready)
+    {
+        if(GameMode::isMaster())
+        {
+            if(player->getClientID() == CLIENTID_SERVER)
+                this->changedReadyToSpawn(ready);
+            else
+                callMemberNetworkFunction(GametypeInfo, changedReadyToSpawn, this->getObjectID(), player->getClientID(), ready);
+        }
+    }
+
+    /**
+    @brief
+        Helper method. Sends changedSpawned notifiers over the network.
+    @param player
+        The player that has changed its spawned status.
+    @param ready
+        The new spawned status.
+    */
+    void GametypeInfo::setSpawnedHelper(PlayerInfo* player, bool spawned)
+    {
+        if(GameMode::isMaster())
+        {
+            if(player->getClientID() == CLIENTID_SERVER)
+                    this->changedSpawned(spawned);
+            else
+                callMemberNetworkFunction(GametypeInfo, changedSpawned, this->getObjectID(), player->getClientID(), spawned);
+        }
+    }
+
+    // Announce messages.
+    // TODO: Replace with notifications.
 
     void GametypeInfo::sendAnnounceMessage(const std::string& message)
Index: /code/branches/tutoriallevel3/src/orxonox/infos/GametypeInfo.h
===================================================================
--- /code/branches/tutoriallevel3/src/orxonox/infos/GametypeInfo.h	(revision 8633)
+++ /code/branches/tutoriallevel3/src/orxonox/infos/GametypeInfo.h	(revision 8634)
@@ -61,6 +61,4 @@
             virtual ~GametypeInfo();
 
-            virtual void changedActivity(void); // Is called when the activity has changed.
-
             /**
             @brief Get whether the game has started yet.
@@ -103,4 +101,20 @@
             void changedCountdownCounter(void); // Is called when the start countdown counter has changed.
 
+            /**
+            @brief Get whether the local player is ready to spawn.
+            @return Returns true if the player is ready to spawn, false if not.
+            */
+            inline bool isReadyToSpawn() const
+                { return this->readyToSpawn_; }
+            void changedReadyToSpawn(bool ready); // Inform the GametypeInfo that the local player has changed its spawned status.
+            
+            /**
+            @brief Get whether the local player is spawned.
+            @return Returns true if the local player is currently spawned, false if not.
+            */
+            inline bool isSpawned() const
+                { return this->spawned_; }
+            void changedSpawned(bool spawned); // Inform the GametypeInfo that the local player has changed its spawned status.
+
             inline const std::string& getHUDTemplate() const
                 { return this->hudtemplate_; }
@@ -120,6 +134,4 @@
             
         protected:
-            void changedReadyToSpawn(PlayerInfo* player); // Is called when a player has become ready to spawn.
-            
             void start(void); // Inform the GametypeInfo that the game has started.
             void end(void); // Inform the GametypeInfo that the game has ended.
@@ -132,4 +144,5 @@
             void pawnKilled(PlayerInfo* player); // Inform the GametypeInfo about a player whose Pawn has been killed.
             void playerSpawned(PlayerInfo* player); // Inform the GametypeInfo about a player that has spawned.
+            void playerEntered(PlayerInfo* player); // Inform the GametypeInfo about a player that has entered,
 
             inline void setHUDTemplate(const std::string& templateName)
@@ -138,4 +151,6 @@
         private:
             void registerVariables();
+            void setSpawnedHelper(PlayerInfo* player, bool spawned); // Helper method. Sends changedReadyToSpawn notifiers over the network.
+            void setReadyToSpawnHelper(PlayerInfo* player, bool ready); // Helper method. Sends changedSpawned notifiers over the network.
 
             static const std::string NOTIFICATION_SENDER; //!< The name of the sender for the sending of notifications.
@@ -148,5 +163,7 @@
             std::string hudtemplate_;
             
-            std::set<PlayerInfo*> spawned_; //!< A set of players that are currently spawned.
+            std::set<PlayerInfo*> spawnedPlayers_; //!< A set of players that are currently spawned.
+            bool spawned_; //!< Whether the local Player is currently spawned.
+            bool readyToSpawn_; //!< Whether the local Player is ready to spawn.
     };
 }
Index: /code/branches/tutoriallevel3/src/orxonox/interfaces/NotificationListener.cc
===================================================================
--- /code/branches/tutoriallevel3/src/orxonox/interfaces/NotificationListener.cc	(revision 8633)
+++ /code/branches/tutoriallevel3/src/orxonox/interfaces/NotificationListener.cc	(revision 8634)
@@ -82,10 +82,10 @@
         else if(GameMode::isServer() && sendMode == notificationSendMode::network && Host::getPlayerID() != clientId)
         {
-            callStaticNetworkFunction(NotificationListener::sendHelper, clientId, message, sender, (unsigned int)messageType);
+            callStaticNetworkFunction(NotificationListener::sendHelper, clientId, message, sender, isCommand, (unsigned int)messageType);
         }
         else if(GameMode::isServer() && sendMode == notificationSendMode::broadcast)
         {
             // TODO: Works as intended?
-            callStaticNetworkFunction(NotificationListener::sendHelper, NETWORK_PEER_ID_BROADCAST, message, sender, (unsigned int)messageType);
+            callStaticNetworkFunction(NotificationListener::sendHelper, NETWORK_PEER_ID_BROADCAST, message, sender, isCommand, (unsigned int)messageType);
         }
     }
