Index: code/branches/objecthierarchy2/src/orxonox/objects/EventTarget.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/EventTarget.cc	(revision 2365)
+++ code/branches/objecthierarchy2/src/orxonox/objects/EventTarget.cc	(revision 2369)
@@ -48,4 +48,6 @@
     void EventTarget::changedName()
     {
+        SUPER(EventTarget, changedName);
+
         for (ObjectList<BaseObject>::iterator it = ObjectList<BaseObject>::begin(); it != ObjectList<BaseObject>::end(); ++it)
             if (it->getName() == this->getName())
Index: code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc	(revision 2365)
+++ code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc	(revision 2369)
@@ -169,19 +169,24 @@
         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)
-                {
-                    // force spawn at spawnpoint with default pawn
-                    ControllableEntity* entity = this->defaultControllableEntity_.fabricate(spawn);
-                    spawn->spawn(entity);
-                    it->first->startControl(entity);
-                    it->second = PlayerState::Dead;
-                }
-                else
-                {
-                    COUT(1) << "Error: No SpawnPoints in current Gametype" << std::endl;
-                    abort();
+            if (!it->first->getControllableEntity())
+            {
+                it->second = PlayerState::Dead;
+
+                if (!it->first->isReadyToSpawn() || !this->bStarted_)
+                {
+                    SpawnPoint* spawn = this->getBestSpawnPoint(it->first);
+                    if (spawn)
+                    {
+                        // force spawn at spawnpoint with default pawn
+                        ControllableEntity* entity = this->defaultControllableEntity_.fabricate(spawn);
+                        spawn->spawn(entity);
+                        it->first->startControl(entity);
+                        it->second = PlayerState::Dead;
+                    }
+                    else
+                    {
+                        COUT(1) << "Error: No SpawnPoints in current Gametype" << std::endl;
+                        abort();
+                    }
                 }
             }
@@ -211,10 +216,13 @@
                 {
                     bool allplayersready = true;
+                    bool hashumanplayers = false;
                     for (std::map<PlayerInfo*, PlayerState::Enum>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
                     {
                         if (!it->first->isReadyToSpawn())
                             allplayersready = false;
-                    }
-                    if (allplayersready)
+                        if (it->first->isHumanPlayer())
+                            hashumanplayers = true;
+                    }
+                    if (allplayersready && hashumanplayers)
                     {
                         this->startCountdown_ = this->initialStartCountdown_;
Index: code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2365)
+++ code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2369)
@@ -77,4 +77,6 @@
     void PlayerInfo::changedName()
     {
+        SUPER(PlayerInfo, changedName);
+
         if (this->isInitialized() && this->getGametype())
             this->getGametype()->playerChangedName(this);
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.cc	(revision 2365)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.cc	(revision 2369)
@@ -54,5 +54,5 @@
     {
         RegisterObject(Camera);
-
+COUT(0) << this << ": created camera" << std::endl;
         if (!this->getScene() || !this->getScene()->getSceneManager())
             ThrowException(AbortLoading, "Can't create Camera, no scene or no scene manager given.");
@@ -70,5 +70,5 @@
         this->configvaluecallback_changedNearClipDistance();
 
-        this->requestFocus(); // ! HACK ! REMOVE THIS !
+//        this->requestFocus(); // ! HACK ! REMOVE THIS !
     }
 
@@ -80,4 +80,5 @@
             this->getScene()->getSceneManager()->destroyCamera(this->camera_);
         }
+COUT(0) << this << ": destroyed camera" << std::endl;
     }
 
@@ -122,4 +123,5 @@
     void Camera::removeFocus()
     {
+COUT(0) << this << ": remove focus" << std::endl;
         this->bHasFocus_ = false;
     }
@@ -142,4 +144,5 @@
         this->bHasFocus_ = true;
         viewport->setCamera(this->camera_);
+COUT(0) << this << ": set focus" << std::endl;
 
         // reactivate all visible compositors
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Pawn.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Pawn.cc	(revision 2365)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Pawn.cc	(revision 2369)
@@ -33,4 +33,5 @@
 #include "core/XMLPort.h"
 #include "util/Math.h"
+#include "PawnManager.h"
 #include "objects/infos/PlayerInfo.h"
 #include "objects/gametypes/Gametype.h"
@@ -45,5 +46,7 @@
         RegisterObject(Pawn);
 
-        this->bAlive_ = false;
+        PawnManager::touch();
+
+        this->bAlive_ = true;
 
         this->health_ = 0;
@@ -70,4 +73,9 @@
     Pawn::~Pawn()
     {
+        if (this->isInitialized())
+        {
+            for (ObjectList<PawnListener>::iterator it = ObjectList<PawnListener>::begin(); it != ObjectList<PawnListener>::end(); ++it)
+                it->destroyedPawn(this);
+        }
     }
 
@@ -76,5 +84,5 @@
         SUPER(Pawn, XMLPort, xmlelement, mode);
 
-        XMLPortParam(Pawn, "health", setHealth, getHealht, xmlelement, mode).defaultValues(100);
+        XMLPortParam(Pawn, "health", setHealth, getHealth, xmlelement, mode).defaultValues(100);
         XMLPortParam(Pawn, "maxhealth", setMaxHealth, getMaxHealth, xmlelement, mode).defaultValues(200);
         XMLPortParam(Pawn, "initialhealth", setInitialHealth, getInitialHealth, xmlelement, mode).defaultValues(100);
@@ -85,4 +93,5 @@
         REGISTERDATA(this->bAlive_, direction::toclient);
         REGISTERDATA(this->health_, direction::toclient);
+        REGISTERDATA(this->initialHealth_, direction::toclient);
     }
 
@@ -90,4 +99,6 @@
     {
         SUPER(Pawn, tick, dt);
+
+        this->health_ -= 15 * dt * rnd();
 
         if (this->health_ <= 0)
@@ -129,11 +140,14 @@
     void Pawn::death()
     {
+        // Set bAlive_ to false and wait for PawnManager to do the destruction
         this->bAlive_ = false;
+
         if (this->getGametype())
             this->getGametype()->pawnKilled(this, this->lastHitOriginator_);
+
+        this->setDestroyWhenPlayerLeft(false);
+
         if (this->getPlayer())
             this->getPlayer()->stopControl(this);
-
-        delete this;
 
         // play death effect
@@ -151,3 +165,11 @@
         this->spawn();
     }
+
+    ///////////////////
+    // Pawn Listener //
+    ///////////////////
+    PawnListener::PawnListener()
+    {
+        RegisterRootObject(PawnListener);
+    }
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Pawn.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Pawn.h	(revision 2365)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Pawn.h	(revision 2369)
@@ -55,5 +55,5 @@
             inline void removeHealth(float health)
                 { this->setHealth(this->health_ - health); }
-            inline float getHealht() const
+            inline float getHealth() const
                 { return this->health_; }
 
@@ -96,4 +96,16 @@
             WeaponSystem* weaponSystem_;
     };
+
+    class _OrxonoxExport PawnListener : public OrxonoxClass
+    {
+        friend class Pawn;
+
+        public:
+            PawnListener();
+            virtual ~PawnListener() {}
+
+        protected:
+            virtual void destroyedPawn(Pawn* pawn) = 0;
+    };
 }
 
