Index: code/branches/objecthierarchy/src/orxonox/CMakeLists.txt
===================================================================
--- code/branches/objecthierarchy/src/orxonox/CMakeLists.txt	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/CMakeLists.txt	(revision 1993)
@@ -47,4 +47,7 @@
   objects/worldentities/MovableEntity.cc
   objects/worldentities/ControllableEntity.cc
+
+  objects/worldentities/Model.cc
+
 #  objects/Backlight.cc
   objects/Camera.cc
@@ -59,4 +62,9 @@
   objects/Trigger.cc
   objects/DistanceTrigger.cc
+
+  objects/worldentities/pawns/Spectator.cc
+
+  objects/controllers/Controller.cc
+  objects/controllers/HumanController.cc
 
   objects/infos/Info.cc
Index: code/branches/objecthierarchy/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/OrxonoxPrereqs.h	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/OrxonoxPrereqs.h	(revision 1993)
@@ -86,4 +86,11 @@
     class ControllableEntity;
 
+    class Model;
+
+    class Spectator;
+
+    class Controller;
+    class HumanController;
+
     class Backlight;
     class Camera;
Index: code/branches/objecthierarchy/src/orxonox/objects/Camera.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/Camera.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/Camera.cc	(revision 1993)
@@ -47,4 +47,6 @@
 namespace orxonox
 {
+  CreateUnloadableFactory(Camera);
+
   Camera::Camera()
   {
@@ -68,4 +70,6 @@
   void Camera::tick(float dt)
   {
+      SUPER(Camera, tick, dt);
+
       // this stuff here may need some adjustments
       float coeff = (this->bDrag_) ? min(1.0f, 15.0f * dt) : (1.0f);
Index: code/branches/objecthierarchy/src/orxonox/objects/Camera.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/Camera.h	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/Camera.h	(revision 1993)
@@ -36,15 +36,17 @@
 #include "OrxonoxPrereqs.h"
 #include "objects/worldentities/PositionableEntity.h"
+#include "objects/Tickable.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport Camera : public PositionableEntity
+    class _OrxonoxExport Camera : public PositionableEntity//, public Tickable
     {
       friend class CameraHandler;
+
       public:
         Camera();
         virtual ~Camera();
 
-        void tick(float dt);
+        virtual void tick(float dt);
         void update();
 
Index: code/branches/objecthierarchy/src/orxonox/objects/CameraHandler.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/CameraHandler.h	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/CameraHandler.h	(revision 1993)
@@ -44,6 +44,4 @@
 #include "core/BaseObject.h"
 
-#include "Camera.h"
-
 namespace orxonox
 {
Index: code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.cc	(revision 1993)
+++ code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.cc	(revision 1993)
@@ -0,0 +1,49 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "OrxonoxStableHeaders.h"
+#include "Controller.h"
+
+#include "core/CoreIncludes.h"
+
+namespace orxonox
+{
+    CreateUnloadableFactory(Controller);
+
+    Controller::Controller()
+    {
+        RegisterObject(Controller);
+
+        this->player_ = 0;
+        this->pawn_ = 0;
+    }
+
+    Controller::~Controller()
+    {
+    }
+}
Index: code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.h	(revision 1993)
+++ code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.h	(revision 1993)
@@ -0,0 +1,60 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _Controller_H__
+#define _Controller_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "core/BaseObject.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport Controller : public BaseObject
+    {
+        public:
+            Controller();
+            virtual ~Controller();
+
+            inline void setPlayer(PlayerInfo* player)
+                { this->player_ = player; }
+            inline PlayerInfo* getPlayer() const
+                { return this->player_; }
+
+            inline void setPawn(ControllableEntity* pawn)
+                { this->pawn_ = pawn; }
+            inline ControllableEntity* getPawn() const
+                { return this->pawn_; }
+
+        protected:
+            PlayerInfo* player_;
+            ControllableEntity* pawn_;
+    };
+}
+
+#endif /* _Controller_H__ */
Index: code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.cc	(revision 1993)
+++ code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.cc	(revision 1993)
@@ -0,0 +1,131 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "OrxonoxStableHeaders.h"
+#include "HumanController.h"
+
+#include "core/CoreIncludes.h"
+#include "core/ConsoleCommand.h"
+#include "objects/worldentities/ControllableEntity.h"
+
+namespace orxonox
+{
+    SetConsoleCommand(HumanController, moveFrontBack, true).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(HumanController, moveRightLeft, true).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(HumanController, moveUpDown,    true).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(HumanController, rotateYaw,     true).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(HumanController, rotatePitch,   true).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(HumanController, rotateRoll,    true).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(HumanController, fire,          true).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(HumanController, altFire,       true).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(HumanController, greet,         true);
+    SetConsoleCommand(HumanController, use,           true);
+    SetConsoleCommand(HumanController, switchCamera,  true);
+
+    CreateUnloadableFactory(HumanController);
+
+    HumanController* HumanController::localController_s = 0;
+
+    HumanController::HumanController()
+    {
+        RegisterObject(HumanController);
+
+        HumanController::localController_s = this;
+    }
+
+    HumanController::~HumanController()
+    {
+        HumanController::localController_s = 0;
+    }
+
+    void HumanController::moveFrontBack(float value)
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->moveFrontBack(value);
+    }
+
+    void HumanController::moveRightLeft(float value)
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->moveRightLeft(value);
+    }
+
+    void HumanController::moveUpDown(float value)
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->moveUpDown(value);
+    }
+
+    void HumanController::rotateYaw(float value)
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->rotateYaw(value);
+    }
+
+    void HumanController::rotatePitch(float value)
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->rotatePitch(value);
+    }
+
+    void HumanController::rotateRoll(float value)
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->rotateRoll(value);
+    }
+
+    void HumanController::fire()
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->fire();
+    }
+
+    void HumanController::altFire()
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->altFire();
+    }
+
+    void HumanController::greet()
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->greet();
+    }
+
+    void HumanController::use()
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->use();
+    }
+
+    void HumanController::switchCamera()
+    {
+        if (HumanController::localController_s && HumanController::localController_s->pawn_)
+            HumanController::localController_s->pawn_->switchCamera();
+    }
+}
Index: code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.h	(revision 1993)
+++ code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.h	(revision 1993)
@@ -0,0 +1,64 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _HumanController_H__
+#define _HumanController_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "Controller.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport HumanController : public Controller
+    {
+        public:
+            HumanController();
+            virtual ~HumanController();
+
+            static void moveFrontBack(float value);
+            static void moveRightLeft(float value);
+            static void moveUpDown(float value);
+
+            static void rotateYaw(float value);
+            static void rotatePitch(float value);
+            static void rotateRoll(float value);
+
+            static void fire();
+            static void altFire();
+
+            static void greet();
+            static void use();
+            static void switchCamera();
+
+        private:
+            static HumanController* localController_s;
+    };
+}
+
+#endif /* _HumanController_H__ */
Index: code/branches/objecthierarchy/src/orxonox/objects/gametypes/Gametype.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/gametypes/Gametype.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/gametypes/Gametype.cc	(revision 1993)
@@ -33,4 +33,5 @@
 #include "core/ConsoleCommand.h"
 #include "objects/infos/PlayerInfo.h"
+#include "objects/worldentities/pawns/Spectator.h"
 
 #include "network/Host.h"
@@ -46,4 +47,5 @@
         RegisterObject(Gametype);
 
+        this->defaultPawn_ = Class(Spectator);
         this->getConnectedClients();
 
Index: code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc	(revision 1993)
@@ -42,4 +42,5 @@
 #include "objects/gametypes/Gametype.h"
 #include "objects/worldentities/ControllableEntity.h"
+#include "objects/controllers/HumanController.h"
 
 namespace orxonox
@@ -53,5 +54,4 @@
         this->ping_ = -1;
         this->clientID_ = network::CLIENTID_UNKNOWN;
-        this->bLocalPlayer_ = Core::isStandalone();
         this->bLocalPlayer_ = false;
         this->bHumanPlayer_ = false;
@@ -60,17 +60,25 @@
         this->pawn_ = 0;
         this->pawnID_ = network::OBJECTID_UNKNOWN;
+        this->controller_ = 0;
+        this->setDefaultController(Class(HumanController));
 
         this->setConfigValues();
         this->registerVariables();
-
-//COUT(0) << "created PlayerInfo (" << this->getObjectID() << ")" << std::endl;
     }
 
     PlayerInfo::~PlayerInfo()
     {
-        Gametype* gametype = Gametype::getCurrentGametype();
-        if (gametype)
-            gametype->removePlayer(this);
-//COUT(0) << "destroyed PlayerInfo (" << this->getObjectID() << ")" << std::endl;
+        if (this->isInitialized())
+        {
+            Gametype* gametype = Gametype::getCurrentGametype();
+            if (gametype)
+                gametype->removePlayer(this);
+
+            if (this->controller_)
+                delete this->controller_;
+
+            if (this->pawn_)
+                this->pawn_->removePlayer();
+        }
     }
 
@@ -82,5 +90,4 @@
     void PlayerInfo::checkNick()
     {
-//std::cout << "# PI(" << this->getObjectID() << "): checkName: " << this->bLocalPlayer_ << std::endl;
         if (this->bLocalPlayer_)
         {
@@ -94,5 +101,4 @@
     void PlayerInfo::changedName()
     {
-//std::cout << "# PI(" << this->getObjectID() << "): changedName to " << this->getName() << std::endl;
         Gametype* gametype = Gametype::getCurrentGametype();
         if (gametype)
@@ -113,5 +119,4 @@
     void PlayerInfo::clientChangedName()
     {
-//std::cout << "# PI(" << this->getObjectID() << "): clientChangedName() from " << this->getName() << " to " << this->playerName_ << std::endl;
         this->setName(this->playerName_);
     }
@@ -119,23 +124,14 @@
     void PlayerInfo::checkClientID()
     {
-//std::cout << "# PI(" << this->getObjectID() << "): checkClientID()" << std::endl;
         this->bHumanPlayer_ = true;
 
         if (this->clientID_ == network::Host::getPlayerID())
         {
-//std::cout << "# PI(" << this->getObjectID() << "): checkClientID(): it's the client's ID" << std::endl;
-            this->bLocalPlayer_ = true;
-            this->playerName_ = this->nick_;
-//std::cout << "# PI(" << this->getObjectID() << "): checkClientID(): name: " << this->getName() << std::endl;
+            this->takeLocalControl();
 
             if (Core::isClient())
-            {
-//std::cout << "# PI(" << this->getObjectID() << "): checkClientID(): we're on a client: set object mode to bidirectional" << std::endl;
                 this->setObjectMode(network::direction::bidirectional);
-//std::cout << "# PI(" << this->getObjectID() << "): checkClientID(): proposed name: " << this->playerName_ << std::endl;
-            }
             else
             {
-//std::cout << "# PI(" << this->getObjectID() << "): checkClientID(): we're not on a client: finish setup" << std::endl;
                 this->clientChangedName();
                 this->bFinishedSetup_ = true;
@@ -147,20 +143,11 @@
     void PlayerInfo::finishedSetup()
     {
-//std::cout << "# PI(" << this->getObjectID() << "): finishedSetup(): " << this->bFinishedSetup_ << std::endl;
         if (Core::isClient())
-        {
-//std::cout << "# PI(" << this->getObjectID() << "): finishedSetup(): we're a client: finish setup" << std::endl;
             this->bFinishedSetup_ = true;
-        }
         else if (this->bFinishedSetup_)
         {
-//std::cout << "# PI(" << this->getObjectID() << "): finishedSetup(): we're a server: add player" << std::endl;
             Gametype* gametype = Gametype::getCurrentGametype();
             if (gametype)
                 gametype->addPlayer(this);
-        }
-        else
-        {
-//std::cout << "# PI(" << this->getObjectID() << "): finishedSetup(): we're a server: client not yet finished" << std::endl;
         }
     }
@@ -171,4 +158,7 @@
         this->pawn_ = pawn;
         this->pawnID_ = pawn->getObjectID();
+
+        if (this->controller_)
+            this->controller_->setPawn(this->pawn_);
     }
 
@@ -180,4 +170,17 @@
     }
 
+    void PlayerInfo::takeLocalControl()
+    {
+        this->bLocalPlayer_ = true;
+        this->playerName_ = this->nick_;
+        this->createController();
+    }
+
+    void PlayerInfo::createController()
+    {
+        this->controller_ = this->defaultController_.fabricate();
+        this->controller_->setPawn(this->pawn_);
+    }
+
     void PlayerInfo::updatePawn()
     {
Index: code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.h	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.h	(revision 1993)
@@ -33,4 +33,6 @@
 
 #include "Info.h"
+#include "core/Identifier.h"
+#include "objects/controllers/Controller.h"
 
 namespace orxonox
@@ -58,11 +60,23 @@
                 { return this->bLocalPlayer_; }
 
-            void startControl(ControllableEntity* pawn);
-            void stopControl();
+            virtual void startControl(ControllableEntity* pawn);
+            virtual void stopControl();
 
             inline ControllableEntity* getPawn() const
                 { return this->pawn_; }
+/*
+            inline void setController(Controller* controller)
+                { this->controller_ = controller; }
+            inline Controller* getController() const
+                { return this->controller_; }
+*/
+        protected:
+            inline void setDefaultController(Identifier* identifier)
+                { this->defaultController_ = identifier; }
 
         private:
+            virtual void createController();
+            virtual void takeLocalControl();
+
             void checkClientID();
             void finishedSetup();
@@ -82,4 +96,6 @@
             ControllableEntity* pawn_;
             unsigned int pawnID_;
+            Controller* controller_;
+            SubclassIdentifier<Controller> defaultController_;
     };
 }
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 1993)
@@ -53,5 +53,5 @@
         this->hud_ = 0;
         this->camera_ = 0;
-
+        this->bDestroyWhenPlayerLeft_ = false;
 
         this->velocity_ = Vector3::ZERO;
@@ -94,5 +94,8 @@
 
         if (this->bControlled_)
+        {
             this->startLocalControl();
+            this->setObjectMode(network::direction::bidirectional);
+        }
     }
 
@@ -105,24 +108,38 @@
         this->playerID_ = network::OBJECTID_UNKNOWN;
         this->bControlled_ = false;
+        this->setObjectMode(network::direction::toclient);
+
+        if (this->bDestroyWhenPlayerLeft_)
+            delete this;
     }
 
     void ControllableEntity::updatePlayer()
     {
-        this->player_ = dynamic_cast<PlayerInfo*>(network::Synchronisable::getSynchronisable(this->playerID_));
-        if (this->player_ && (this->player_->getPawn() != this))
-            this->player_->startControl(this);
+        if (this->playerID_ != network::OBJECTID_UNKNOWN)
+        {
+            this->player_ = dynamic_cast<PlayerInfo*>(network::Synchronisable::getSynchronisable(this->playerID_));
+            if (this->player_ && (this->player_->getPawn() != this))
+                this->player_->startControl(this);
+        }
     }
 
     void ControllableEntity::startLocalControl()
     {
+        std::cout << "###### start local control" << std::endl;
         this->camera_ = new Camera();
         this->camera_->requestFocus();
-
-        this->hud_ = new OverlayGroup();
-        this->hud_->addTemplate(this->hudtemplate_);
+        this->attach(this->camera_);
+
+        if (this->hudtemplate_ != "")
+        {
+            this->hud_ = new OverlayGroup();
+            this->hud_->addTemplate(this->hudtemplate_);
+        }
     }
 
     void ControllableEntity::stopLocalControl()
     {
+        std::cout << "###### stop local control" << std::endl;
+        this->detach(this->camera_);
         delete this->camera_;
         this->camera_ = 0;
@@ -137,5 +154,5 @@
         {
             this->velocity_ += (dt * this->acceleration_);
-            this->node_->translate(dt * this->velocity_);
+            this->node_->translate(dt * this->velocity_, Ogre::Node::TS_PARENT);
 
             if (Core::isMaster())
@@ -150,6 +167,4 @@
             }
         }
-
-//        std::cout << this->getPosition() << std::endl;
     }
 
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 1993)
@@ -52,4 +52,9 @@
                 { return this->player_; }
 
+            inline void setDestroyWhenPlayerLeft(bool bDestroy)
+                { this->bDestroyWhenPlayerLeft_ = bDestroy; }
+            inline bool getDestroyWhenPlayerLeft() const
+                { return this->bDestroyWhenPlayerLeft_; }
+
             virtual void startLocalControl();
             virtual void stopLocalControl();
@@ -70,4 +75,11 @@
             virtual void switchCamera() {}
 
+            inline const Vector3& getVelocity() const
+                { return this->velocity_; }
+            inline const Vector3& getAcceleration() const
+                { return this->acceleration_; }
+            inline const std::string& getHudTemplate() const
+                { return this->hudtemplate_; }
+
         protected:
             using WorldEntity::setPosition;
@@ -75,4 +87,7 @@
             using WorldEntity::setOrientation;
             using WorldEntity::rotate;
+            using WorldEntity::yaw;
+            using WorldEntity::pitch;
+            using WorldEntity::roll;
             using WorldEntity::lookAt;
             using WorldEntity::setDirection;
@@ -91,6 +106,4 @@
             inline void setVelocity(float x, float y, float z)
                 { this->velocity_.x = x; this->velocity_.y = y; this->velocity_.z = z; }
-            inline const Vector3& getVelocity() const
-                { return this->velocity_; }
 
             inline void setAcceleration(const Vector3& acceleration)
@@ -98,13 +111,9 @@
             inline void setAcceleration(float x, float y, float z)
                 { this->acceleration_.x = x; this->acceleration_.y = y; this->acceleration_.z = z; }
-            inline const Vector3& getAcceleration() const
-                { return this->acceleration_; }
+
+            inline void setHudTemplate(const std::string& name)
+                { this->hudtemplate_ = name; }
 
         private:
-            inline void setHudTemplate(const std::string& name)
-                { this->hudtemplate_ = name; }
-            inline const std::string& getHudTemplate() const
-                { return this->hudtemplate_; }
-
             void overwrite();
             void processOverwrite();
@@ -139,4 +148,5 @@
             OverlayGroup* hud_;
             Camera* camera_;
+            bool bDestroyWhenPlayerLeft_;
     };
 }
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/Model.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/Model.cc	(revision 1993)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/Model.cc	(revision 1993)
@@ -0,0 +1,80 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "OrxonoxStableHeaders.h"
+
+#include "Model.h"
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+
+namespace orxonox
+{
+    CreateFactory(Model);
+
+    Model::Model()
+    {
+        RegisterObject(Model);
+
+        this->registerVariables();
+    }
+
+    Model::~Model()
+    {
+        if (this->isInitialized() && this->mesh_.getEntity())
+            this->getNode()->detachObject(this->mesh_.getEntity());
+    }
+
+    void Model::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(Model, XMLPort, xmlelement, mode);
+
+        XMLPortParam(Model, "mesh", setMeshSource, getMeshSource, xmlelement, mode);
+    }
+
+    void Model::registerVariables()
+    {
+        REGISTERSTRING(this->meshSrc_, network::direction::toclient, new network::NetworkCallback<Model>(this, &Model::changedMesh));
+    }
+
+    void Model::changedMesh()
+    {
+        if (this->mesh_.getEntity())
+            this->getNode()->detachObject(this->mesh_.getEntity());
+
+        this->mesh_.setMeshSource(this->meshSrc_);
+        if (this->mesh_.getEntity())
+            this->getNode()->attachObject(this->mesh_.getEntity());
+    }
+
+    void Model::changedVisibility()
+    {
+        SUPER(Model, changedVisibility);
+
+        this->mesh_.setVisible(this->isVisible());
+    }
+}
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/Model.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/Model.h	(revision 1993)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/Model.h	(revision 1993)
@@ -0,0 +1,64 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _Model_H__
+#define _Model_H__
+
+#include "OrxonoxPrereqs.h"
+#include "PositionableEntity.h"
+#include "tools/Mesh.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport Model : public PositionableEntity
+    {
+        public:
+            Model();
+            virtual ~Model();
+
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            void registerVariables();
+
+            virtual void changedVisibility();
+
+            inline void setMeshSource(const std::string& meshname)
+                { this->meshSrc_ = meshname; this->changedMesh(); }
+            inline const std::string& getMeshSource() const
+                { return this->meshSrc_; }
+            inline const Mesh& getMesh() const
+                { return this->mesh_; }
+
+        private:
+            void changedMesh();
+
+            std::string meshSrc_;
+            Mesh mesh_;
+    };
+}
+
+#endif /* _PositionableEntity_H__ */
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 1993)
@@ -79,6 +79,4 @@
             this->node_->rotate(this->rotationAxis_, this->rotationRate_  * dt);
         }
-
-        std::cout << this->getPosition() << std::endl;
     }
 
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.h	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.h	(revision 1993)
@@ -52,4 +52,7 @@
             using WorldEntity::setOrientation;
             using WorldEntity::rotate;
+            using WorldEntity::yaw;
+            using WorldEntity::pitch;
+            using WorldEntity::roll;
             using WorldEntity::lookAt;
             using WorldEntity::setDirection;
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/PositionableEntity.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/PositionableEntity.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/PositionableEntity.cc	(revision 1993)
@@ -57,3 +57,10 @@
         REGISTERDATA(this->getOrientation().z, network::direction::toclient);
     }
+
+    void PositionableEntity::tick(float dt)
+    {
+        // I don't know why but this has to be done to update the position if attached to another Entity
+        this->node_->translate(Vector3::ZERO);
+        std::cout << this->getWorldPosition() << std::endl;
+    }
 }
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/PositionableEntity.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/PositionableEntity.h	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/PositionableEntity.h	(revision 1993)
@@ -32,8 +32,9 @@
 #include "OrxonoxPrereqs.h"
 #include "WorldEntity.h"
+#include "objects/Tickable.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport PositionableEntity : public WorldEntity
+    class _OrxonoxExport PositionableEntity : public WorldEntity, public Tickable
     {
         public:
@@ -42,4 +43,5 @@
 
             void registerVariables();
+            virtual void tick(float dt);
 
             using WorldEntity::setPosition;
@@ -47,4 +49,7 @@
             using WorldEntity::setOrientation;
             using WorldEntity::rotate;
+            using WorldEntity::yaw;
+            using WorldEntity::pitch;
+            using WorldEntity::roll;
             using WorldEntity::lookAt;
             using WorldEntity::setDirection;
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/WorldEntity.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 1993)
@@ -34,4 +34,5 @@
 #include "core/CoreIncludes.h"
 #include "core/XMLPort.h"
+#include "util/Convert.h"
 
 #include "GraphicsEngine.h"
@@ -110,4 +111,10 @@
         if (object->getParent())
             object->detachFromParent();
+        else
+        {
+            Ogre::Node* parent = object->node_->getParent();
+            if (parent)
+                parent->removeChild(object->node_);
+        }
 
         this->node_->addChild(object->node_);
@@ -123,4 +130,6 @@
         object->parent_ = 0;
         object->parentID_ = (unsigned int)-1;
+
+        GraphicsEngine::getInstance().getLevelSceneManager()->getRootSceneNode()->addChild(object->node_);
     }
 
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 1993)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 1993)
@@ -0,0 +1,118 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "Spectator.h"
+
+#include "core/CoreIncludes.h"
+#include "objects/worldentities/Model.h"
+
+namespace orxonox
+{
+    CreateFactory(Spectator);
+
+    Spectator::Spectator()
+    {
+        RegisterObject(Spectator);
+
+        this->speed_ = 100;
+        this->rotationSpeed_ = 3;
+
+        this->yaw_ = 0;
+        this->pitch_ = 0;
+        this->roll_ = 0;
+        this->setHudTemplate("spectatorhud");
+
+        this->setDestroyWhenPlayerLeft(true);
+
+        Model* temp = new Model;
+        temp->setMeshSource("assff.mesh");
+        this->attach(temp);
+    }
+
+    Spectator::~Spectator()
+    {
+    }
+
+    void Spectator::tick(float dt)
+    {
+        Vector3 velocity = this->getVelocity();
+        velocity.normalise();
+        this->setVelocity(velocity * this->speed_);
+
+        this->yaw(Radian(this->yaw_ * dt * this->rotationSpeed_));
+        this->pitch(Radian(this->pitch_ * dt * this->rotationSpeed_));
+        this->roll(Radian(this->roll_ * dt * this->rotationSpeed_));
+
+        this->yaw_ = this->pitch_ = this->roll_ = 0;
+
+        SUPER(Spectator, tick, dt);
+
+        this->setVelocity(Vector3::ZERO);
+    }
+
+    void Spectator::setPlayer(PlayerInfo* player)
+    {
+        ControllableEntity::setPlayer(player);
+
+        this->setObjectMode(network::direction::toclient);
+    }
+
+    void Spectator::moveFrontBack(float value)
+    {
+        this->setVelocity(this->getVelocity() + value * this->speed_ * WorldEntity::FRONT);
+    }
+
+    void Spectator::moveRightLeft(float value)
+    {
+        this->setVelocity(this->getVelocity() + value * this->speed_ * WorldEntity::RIGHT);
+    }
+
+    void Spectator::moveUpDown(float value)
+    {
+        this->setVelocity(this->getVelocity() + value * this->speed_ * WorldEntity::UP);
+    }
+
+    void Spectator::rotateYaw(float value)
+    {
+        this->yaw_ = value;
+    }
+
+    void Spectator::rotatePitch(float value)
+    {
+        this->pitch_ = value;
+    }
+
+    void Spectator::rotateRoll(float value)
+    {
+        this->roll_ = value;
+    }
+
+    void Spectator::fire()
+    {
+    }
+}
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 1993)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 1993)
@@ -0,0 +1,68 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _Spectator_H__
+#define _Spectator_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "objects/worldentities/ControllableEntity.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport Spectator : public ControllableEntity
+    {
+        public:
+            Spectator();
+            virtual ~Spectator();
+
+            virtual void tick(float dt);
+
+            virtual void setPlayer(PlayerInfo* player);
+
+            virtual void moveFrontBack(float value);
+            virtual void moveRightLeft(float value);
+            virtual void moveUpDown(float value);
+
+            virtual void rotateYaw(float value);
+            virtual void rotatePitch(float value);
+            virtual void rotateRoll(float value);
+
+            virtual void fire();
+
+        private:
+            float speed_;
+            float rotationSpeed_;
+
+            float yaw_;
+            float pitch_;
+            float roll_;
+    };
+}
+
+#endif /* _Spectator_H__ */
Index: code/branches/objecthierarchy/src/orxonox/overlays/OverlayGroup.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/overlays/OverlayGroup.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/overlays/OverlayGroup.cc	(revision 1993)
@@ -100,5 +100,8 @@
         }
         else
+        {
             hudElements_[element->getName()] = element;
+            element->setVisible(this->isVisible());
+        }
     }
 
Index: code/branches/objecthierarchy/src/orxonox/overlays/OverlayText.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/overlays/OverlayText.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/overlays/OverlayText.cc	(revision 1993)
@@ -31,5 +31,4 @@
 
 #include <OgreOverlayManager.h>
-#include <OgreTextAreaOverlayElement.h>
 #include <OgrePanelOverlayElement.h>
 
@@ -68,6 +67,8 @@
 
         XMLPortParam(OverlayText, "font",     setFont,     getFont,     xmlElement, mode).defaultValues("Monofur");
+        XMLPortParam(OverlayText, "colour",   setColour,   getColour,   xmlElement, mode).defaultValues(ColourValue(1.0, 1.0, 1.0, 1.0));
         XMLPortParam(OverlayText, "caption",  setCaption,  getCaption,  xmlElement, mode).defaultValues("");
         XMLPortParam(OverlayText, "textSize", setTextSize, getTextSize, xmlElement, mode).defaultValues(1.0f);
+        XMLPortParamTemplate(OverlayText, "align", setAlignment, getAlignment, xmlElement, mode, const std::string&).defaultValues("left");
     }
 
@@ -84,4 +85,59 @@
         else
             return blankString;
+    }
+
+    void OverlayText::setColour(const ColourValue& colour)
+    {
+        if (this->text_)
+            this->text_->setColour(colour);
+    }
+
+    const ColourValue& OverlayText::getColour() const
+    {
+        if (this->text_)
+            return this->text_->getColour();
+        else
+            return ColourValue::White;
+    }
+
+    void OverlayText::setAlignment(Ogre::TextAreaOverlayElement::Alignment alignment)
+    {
+        if (this->text_)
+            this->text_->setAlignment(alignment);
+    }
+
+    void OverlayText::setAlignment(const std::string& alignment)
+    {
+        if (alignment == "right")
+            this->setAlignment(Ogre::TextAreaOverlayElement::Right);
+        else if (alignment == "center")
+            this->setAlignment(Ogre::TextAreaOverlayElement::Center);
+        else // "left" and default
+            this->setAlignment(Ogre::TextAreaOverlayElement::Left);
+    }
+
+    std::string OverlayText::getAlignment() const
+    {
+        if (this->text_)
+        {
+            Ogre::TextAreaOverlayElement::Alignment alignment = this->text_->getAlignment();
+
+            switch (alignment)
+            {
+                case Ogre::TextAreaOverlayElement::Right:
+                    return "right";
+                case Ogre::TextAreaOverlayElement::Center:
+                    return "center";
+                case Ogre::TextAreaOverlayElement::Left:
+                default:;
+            }
+        }
+        return "left";
+    }
+
+    void OverlayText::setCaption(const std::string& caption)
+    {
+        this->caption_ = caption;
+        this->text_->setCaption(caption);
     }
 
Index: code/branches/objecthierarchy/src/orxonox/overlays/OverlayText.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/overlays/OverlayText.h	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/overlays/OverlayText.h	(revision 1993)
@@ -34,4 +34,5 @@
 #include <string>
 #include <OgrePrerequisites.h>
+#include <OgreTextAreaOverlayElement.h>
 #include "OrxonoxOverlay.h"
 
@@ -49,9 +50,16 @@
         virtual void sizeChanged();
 
-        void setCaption(const std::string& caption) { this->caption_ = caption; }
+        void setCaption(const std::string& caption);
         const std::string& getCaption() const       { return this->caption_; }
 
         void setFont(const std::string& font);
         const std::string& getFont() const;
+
+        void setColour(const ColourValue& colour);
+        const ColourValue& getColour() const;
+
+        void setAlignment(Ogre::TextAreaOverlayElement::Alignment alignment);
+        void setAlignment(const std::string& alignment);
+        std::string getAlignment() const;
 
         void setTextSize(float size) { this->setSize(Vector2(size, size)); }
Index: code/branches/objecthierarchy/src/orxonox/overlays/hud/HUDNavigation.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/overlays/hud/HUDNavigation.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/overlays/hud/HUDNavigation.cc	(revision 1993)
@@ -41,5 +41,4 @@
 #include "core/XMLPort.h"
 #include "objects/Radar.h"
-#include "objects/CameraHandler.h"
 
 namespace orxonox
Index: code/branches/objecthierarchy/src/orxonox/tools/Mesh.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/tools/Mesh.cc	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/tools/Mesh.cc	(revision 1993)
@@ -32,6 +32,9 @@
 #include <sstream>
 #include <OgreSceneManager.h>
+
 #include "core/Core.h"
 #include "GraphicsEngine.h"
+#include "util/Convert.h"
+#include "util/String.h"
 
 namespace orxonox
@@ -39,15 +42,7 @@
     unsigned int Mesh::meshCounter_s = 0;
 
-    Mesh::Mesh() :
-      entity_(0)
+    Mesh::Mesh()
     {
-    }
-
-    void Mesh::setMesh(const std::string& file)
-    {
-        std::ostringstream name;
-        name << (Mesh::meshCounter_s++);
-        if (Core::showsGraphics())
-            this->entity_ = GraphicsEngine::getInstance().getLevelSceneManager()->createEntity("Mesh" + name.str(), file);
+        this->entity_ = 0;
     }
 
@@ -57,3 +52,35 @@
             GraphicsEngine::getInstance().getLevelSceneManager()->destroyEntity(this->entity_);
     }
+
+    void Mesh::setMeshSource(const std::string& meshsource)
+    {
+        if (Core::showsGraphics())
+        {
+            if (this->entity_)
+                GraphicsEngine::getInstance().getLevelSceneManager()->destroyEntity(this->entity_);
+            this->entity_ = GraphicsEngine::getInstance().getLevelSceneManager()->createEntity("Mesh" + convertToString(Mesh::meshCounter_s++), meshsource);
+        }
+    }
+
+    const std::string& Mesh::getName() const
+    {
+        if (this->entity_)
+            return this->entity_->getName();
+        else
+            return blankString;
+    }
+
+    void Mesh::setVisible(bool bVisible)
+    {
+        if (this->entity_)
+            this->entity_->setVisible(bVisible);
+    }
+
+    bool Mesh::isVisible() const
+    {
+        if (this->entity_)
+            return this->entity_->getVisible();
+        else
+            return false;
+    }
 }
Index: code/branches/objecthierarchy/src/orxonox/tools/Mesh.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/tools/Mesh.h	(revision 1990)
+++ code/branches/objecthierarchy/src/orxonox/tools/Mesh.h	(revision 1993)
@@ -33,5 +33,4 @@
 
 #include <string>
-
 #include <OgreEntity.h>
 
@@ -43,16 +42,14 @@
             Mesh();
             ~Mesh();
-            void setMesh(const std::string& file);
+
+            void setMeshSource(const std::string& file);
 
             inline Ogre::Entity* getEntity()
                 { return this->entity_; }
 
-            inline const std::string& getName() const
-                { return this->entity_->getName(); }
+            const std::string& getName() const;
 
-            inline void setVisible(bool visible)
-                { if (this->entity_) this->entity_->setVisible(visible); }
-            inline bool getVisible() const
-                { if (this->entity_) return this->entity_->getVisible(); else return false; }
+            void setVisible(bool bVisible);
+            bool isVisible() const;
 
         private:
