Index: code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.h	(revision 2041)
+++ code/branches/objecthierarchy/src/orxonox/objects/controllers/Controller.h	(revision 2042)
@@ -48,5 +48,5 @@
 
             virtual inline void setControllableEntity(ControllableEntity* entity)
-                { COUT(0) << "HC: start controlling entity" << std::endl; this->controllableEntity_ = entity; }
+                { 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 2041)
+++ code/branches/objecthierarchy/src/orxonox/objects/controllers/HumanController.cc	(revision 2042)
@@ -57,6 +57,4 @@
 
         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 2041)
+++ code/branches/objecthierarchy/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2042)
@@ -54,36 +54,8 @@
         this->setConfigValues();
         this->registerVariables();
-
-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;
     }
 
@@ -120,8 +92,6 @@
     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_;
@@ -129,8 +99,5 @@
 
             if (!Core::isMaster())
-            {
                 this->setObjectMode(network::direction::bidirectional);
-COUT(0) << this->getObjectID() << ": PI: set objectmode to bidirectional" << std::endl;
-            }
             else
                 this->setName(this->nick_);
@@ -143,15 +110,10 @@
     {
         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);
-        }
     }
 
@@ -173,5 +135,4 @@
     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 2041)
+++ code/branches/objecthierarchy/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2042)
@@ -128,5 +128,5 @@
             this->controllableEntityID_ = network::OBJECTID_UNKNOWN;
         }
-COUT(0) << this->getObjectID() << ": PI: start control" << std::endl;
+
         if (this->controller_)
             this->controller_->setControllableEntity(entity);
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/CameraPosition.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/CameraPosition.cc	(revision 2042)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/CameraPosition.cc	(revision 2042)
@@ -0,0 +1,65 @@
+/*
+ *   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 "CameraPosition.h"
+
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+#include "Camera.h"
+
+namespace orxonox
+{
+    CreateFactory(CameraPosition);
+
+    CameraPosition::CameraPosition(BaseObject* creator) : PositionableEntity(creator)
+    {
+        RegisterObject(CameraPosition);
+
+        this->bDrag_ = false;
+
+        this->setObjectMode(0x0);
+    }
+
+    CameraPosition::~CameraPosition()
+    {
+    }
+
+    void CameraPosition::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(CameraPosition, XMLPort, xmlelement, mode);
+
+        XMLPortParam(CameraPosition, "drag", setDrag, getDrag, xmlelement, mode).defaultValues(false);
+    }
+
+    void CameraPosition::attachCamera(Camera* camera)
+    {
+        camera->setDrag(this->bDrag_);
+        this->attach(camera);
+    }
+}
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/CameraPosition.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/CameraPosition.h	(revision 2042)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/CameraPosition.h	(revision 2042)
@@ -0,0 +1,58 @@
+/*
+ *   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 _CameraPosition_H__
+#define _CameraPosition_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "objects/worldentities/PositionableEntity.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport CameraPosition : public PositionableEntity
+    {
+        public:
+            CameraPosition(BaseObject* creator);
+            virtual ~CameraPosition();
+
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+
+            inline void setDrag(bool bDrag)
+                { this->bDrag_ = bDrag; }
+            inline bool getDrag() const
+                { return this->bDrag_; }
+
+            void attachCamera(Camera* camera);
+
+        private:
+            bool bDrag_;
+    };
+}
+
+#endif /* _CameraPosition_H__ */
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2041)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2042)
@@ -37,4 +37,5 @@
 #include "objects/infos/PlayerInfo.h"
 #include "objects/worldentities/Camera.h"
+#include "objects/worldentities/CameraPosition.h"
 #include "overlays/OverlayGroup.h"
 
@@ -92,4 +93,55 @@
 
         XMLPortParam(ControllableEntity, "hudtemplate", setHudTemplate, getHudTemplate, xmlelement, mode);
+        XMLPortParam(ControllableEntity, "camerapositiontemplate", setCameraPositionTemplate, getCameraPositionTemkplate, xmlelement, mode);
+
+        XMLPortObject(ControllableEntity, WorldEntity, "camerapositions", addCameraPosition, getCameraPosition, xmlelement, mode);
+    }
+
+    void ControllableEntity::addCameraPosition(CameraPosition* position)
+    {
+        this->attach(position);
+        this->cameraPositions_.push_back(position);
+    }
+
+    CameraPosition* ControllableEntity::getCameraPosition(unsigned int index) const
+    {
+        unsigned int i = 0;
+        for (std::list<CameraPosition*>::const_iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
+        {
+            if (i == index)
+                return (*it);
+            ++i;
+        }
+        return 0;
+    }
+
+    void ControllableEntity::switchCamera()
+    {
+        if (this->camera_)
+        {
+            if (this->camera_->getParent() == this && this->cameraPositions_.size() > 0)
+            {
+                this->cameraPositions_.front()->attachCamera(this->camera_);
+            }
+            else if (this->cameraPositions_.size() > 0)
+            {
+                for (std::list<CameraPosition*>::const_iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
+                {
+                    if ((*it) == this->camera_->getParent())
+                    {
+                        ++it;
+                        if (it != this->cameraPositions_.end())
+                            (*it)->attachCamera(this->camera_);
+                        else
+                            (*this->cameraPositions_.begin())->attachCamera(this->camera_);
+                        break;
+                    }
+                }
+            }
+            else
+            {
+                this->attach(this->camera_);
+            }
+        }
     }
 
@@ -105,5 +157,4 @@
         this->playerID_ = player->getObjectID();
         this->bControlled_ = (player->isLocalPlayer() && player->isHumanPlayer());
-
         if (this->bControlled_)
         {
@@ -111,5 +162,8 @@
 
             if (!Core::isMaster())
+            {
+COUT(0) << "CE: bidirectional synchronization" << std::endl;
                 this->setObjectMode(network::direction::bidirectional);
+            }
         }
     }
@@ -145,5 +199,10 @@
         this->camera_ = new Camera(this);
         this->camera_->requestFocus();
-        this->attach(this->camera_);
+        if (this->cameraPositionTemplate_ != "")
+            this->addTemplate(this->cameraPositionTemplate_);
+        if (this->cameraPositions_.size() > 0)
+            this->cameraPositions_.front()->attachCamera(this->camera_);
+        else
+            this->attach(this->camera_);
 
         if (this->hudtemplate_ != "")
@@ -157,5 +216,5 @@
     {
         std::cout << "###### stop local control" << std::endl;
-        this->detach(this->camera_);
+        this->camera_->detachFromParent();
         delete this->camera_;
         this->camera_ = 0;
@@ -187,4 +246,6 @@
     void ControllableEntity::registerVariables()
     {
+        REGISTERSTRING(this->cameraPositionTemplate_, network::direction::toclient);
+
         REGISTERDATA(this->server_position_,    network::direction::toclient, new network::NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerPosition));
         REGISTERDATA(this->server_velocity_,    network::direction::toclient, new network::NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerVelocity));
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2041)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2042)
@@ -70,5 +70,5 @@
             virtual void greet() {}
             virtual void use() {}
-            virtual void switchCamera() {}
+            virtual void switchCamera();
 
             inline const Vector3& getVelocity() const
@@ -112,4 +112,14 @@
             inline OverlayGroup* getHUD() const
                 { return this->hud_; }
+
+            void addCameraPosition(CameraPosition* position);
+            CameraPosition* getCameraPosition(unsigned int index) const;
+            inline const std::list<CameraPosition*>& getCameraPositions() const
+                { return this->cameraPositions_; }
+
+            inline void setCameraPositionTemplate(const std::string& name)
+                { this->cameraPositionTemplate_ = name; }
+            inline const std::string& getCameraPositionTemkplate() const
+                { return this->cameraPositionTemplate_; }
 
         protected:
@@ -158,4 +168,7 @@
             Camera* camera_;
             bool bDestroyWhenPlayerLeft_;
+
+            std::list<CameraPosition*> cameraPositions_;
+            std::string cameraPositionTemplate_;
     };
 }
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/WorldEntity.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2041)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2042)
@@ -136,5 +136,5 @@
         object->parentID_ = (unsigned int)-1;
 
-        this->getScene()->getRootSceneNode()->addChild(object->node_);
+//        this->getScene()->getRootSceneNode()->addChild(object->node_);
     }
 
