Index: /code/branches/objecthierarchy2/bin/def_keybindings.ini
===================================================================
--- /code/branches/objecthierarchy2/bin/def_keybindings.ini	(revision 2477)
+++ /code/branches/objecthierarchy2/bin/def_keybindings.ini	(revision 2478)
@@ -54,5 +54,5 @@
 KeyLeftAlt=
 KeyLeftBracket=
-KeyLeftControl=
+KeyLeftControl=mouseLook
 KeyLeftShift=
 KeyLeftWindows=
Index: /code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.cc
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.cc	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.cc	(revision 2478)
@@ -50,4 +50,5 @@
     SetConsoleCommand(HumanController, use,           true);
     SetConsoleCommand(HumanController, switchCamera,  true);
+    SetConsoleCommand(HumanController, mouseLook,     true);
     SetConsoleCommand(HumanController, suicide,       true);
     SetConsoleCommand(HumanController, addBots,       true).defaultValues(1);
@@ -142,4 +143,10 @@
     }
 
+    void HumanController::mouseLook()
+    {
+        if (HumanController::localController_s && HumanController::localController_s->controllableEntity_)
+            HumanController::localController_s->controllableEntity_->mouseLook();
+    }
+
     void HumanController::suicide()
     {
Index: /code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.h
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.h	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.h	(revision 2478)
@@ -58,4 +58,5 @@
             static void use();
             static void switchCamera();
+            static void mouseLook();
 
             static void suicide();
Index: /code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.cc
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.cc	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.cc	(revision 2478)
@@ -31,4 +31,5 @@
 
 #include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
 #include "core/XMLPort.h"
 #include "objects/Scene.h"
@@ -63,4 +64,5 @@
         this->boostBlur_ = 0;
 
+        this->setConfigValues();
         this->registerVariables();
     }
@@ -95,4 +97,9 @@
     }
 
+    void Engine::setConfigValues()
+    {
+        SetConfigValue(blurStrength_, 3.0f);
+    }
+
     void Engine::registerVariables()
     {
@@ -197,5 +204,5 @@
 
         if (this->boostBlur_ && this->maxSpeedFront_ != 0 && this->boostFactor_ != 1)
-            this->boostBlur_->setParameter("Ogre/Compositor/Radial_Blur", 0, 0, "sampleStrength", 5.0f * clamp((-velocity.z - this->maxSpeedFront_) / ((this->boostFactor_ - 1) * this->maxSpeedFront_), 0.0f, 1.0f));
+            this->boostBlur_->setParameter("Ogre/Compositor/Radial_Blur", 0, 0, "sampleStrength", this->blurStrength_ * clamp((-velocity.z - this->maxSpeedFront_) / ((this->boostFactor_ - 1) * this->maxSpeedFront_), 0.0f, 1.0f));
     }
 
Index: /code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.h
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.h	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.h	(revision 2478)
@@ -46,4 +46,5 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
             void registerVariables();
+            void setConfigValues();
 
             virtual void tick(float dt);
@@ -127,4 +128,5 @@
 
             Shader* boostBlur_;
+            float blurStrength_;
     };
 }
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.cc
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.cc	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.cc	(revision 2478)
@@ -51,9 +51,12 @@
         RegisterObject(Camera);
 
-        if (!this->getScene() || !this->getScene()->getSceneManager())
-            ThrowException(AbortLoading, "Can't create Camera, no scene or no scene manager given.");
+        if (!this->getScene())
+            ThrowException(AbortLoading, "Can't create Camera, no scene.");
+        if (!this->getScene()->getSceneManager())
+            ThrowException(AbortLoading, "Can't create Camera, no scene-manager given.");
 
         this->camera_ = this->getScene()->getSceneManager()->createCamera(getUniqueNumberString());
-        this->getNode()->attachObject(this->camera_);
+        this->cameraNode_ = this->getNode()->createChildSceneNode();
+        this->cameraNode_->attachObject(this->camera_);
 
         this->bHasFocus_ = false;
@@ -72,5 +75,13 @@
         {
             this->releaseFocus();
+
+            this->cameraNode_->detachAllObjects();
             this->getScene()->getSceneManager()->destroyCamera(this->camera_);
+
+            if (this->bDrag_)
+                this->detachNode(this->cameraNode_);
+
+            if (this->getScene()->getSceneManager())
+                this->getScene()->getSceneManager()->destroySceneNode(this->cameraNode_->getName());
         }
     }
@@ -89,13 +100,16 @@
     {
         SUPER(Camera, tick, dt);
-/*
-        // this stuff here may need some adjustments
-        float coeff = (this->bDrag_) ? min(1.0f, 15.0f * dt) : (1.0f);
 
-        Vector3 offset = this->getNode()->getWorldPosition() - this->cameraNode_->getWorldPosition();
-        this->cameraNode_->translate(coeff * offset);
+        if (this->bDrag_)
+        {
+            // this stuff here may need some adjustments
+            float coeff = min(1.0f, 15.0f * dt);
 
-        this->cameraNode_->setOrientation(Quaternion::Slerp(coeff, this->cameraNode_->getWorldOrientation(), this->getWorldOrientation(), false));
-*/
+            Vector3 offset = this->getNode()->getWorldPosition() - this->cameraNode_->getWorldPosition();
+            this->cameraNode_->translate(coeff * offset);
+
+            this->cameraNode_->setOrientation(Quaternion::Slerp(coeff, this->cameraNode_->getWorldOrientation(), this->getWorldOrientation(), false));
+            //this->cameraNode_->setOrientation(this->getWorldOrientation());
+        }
     }
 
@@ -124,3 +138,24 @@
         CameraManager::getInstance().useCamera(this->camera_);
     }
+
+    void Camera::setDrag(bool bDrag)
+    {
+        if (bDrag != this->bDrag_)
+        {
+            this->bDrag_ = bDrag;
+
+            if (!bDrag)
+            {
+                this->attachNode(this->cameraNode_);
+                this->cameraNode_->setPosition(Vector3::ZERO);
+                this->cameraNode_->setOrientation(Quaternion::IDENTITY);
+            }
+            else
+            {
+                this->detachNode(this->cameraNode_);
+                this->cameraNode_->setPosition(this->getWorldPosition());
+                this->cameraNode_->setOrientation(this->getWorldOrientation());
+            }
+        }
+    }
 }
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.h
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.h	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.h	(revision 2478)
@@ -55,6 +55,5 @@
                 { return this->bHasFocus_; }
 
-            inline void setDrag(bool bDrag)
-                { this->bDrag_ = bDrag; }
+            void setDrag(bool bDrag);
             inline bool getDrag() const
                 { return this->bDrag_; }
@@ -65,8 +64,9 @@
             void configvaluecallback_changedNearClipDistance();
 
-            Ogre::Camera*   camera_;
-            float           nearClipDistance_;
-            bool            bHasFocus_;
-            bool            bDrag_;
+            Ogre::Camera*    camera_;
+            Ogre::SceneNode* cameraNode_;
+            float            nearClipDistance_;
+            bool             bHasFocus_;
+            bool             bDrag_;
     };
 }
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/CameraPosition.cc
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/CameraPosition.cc	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/CameraPosition.cc	(revision 2478)
@@ -43,4 +43,5 @@
 
         this->bDrag_ = false;
+        this->bAllowMouseLook_ = false;
 
         this->setObjectMode(0x0);
@@ -56,10 +57,16 @@
 
         XMLPortParam(CameraPosition, "drag", setDrag, getDrag, xmlelement, mode).defaultValues(false);
+        XMLPortParam(CameraPosition, "mouselook", setAllowMouseLook, getAllowMouseLook, xmlelement, mode).defaultValues(false);
     }
 
     void CameraPosition::attachCamera(Camera* camera)
     {
-        camera->setDrag(this->bDrag_);
+        if (!this->bDrag_)
+            camera->setDrag(false);
+
         this->attach(camera);
+
+        if (this->bDrag_)
+            camera->setDrag(true);
     }
 }
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/CameraPosition.h
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/CameraPosition.h	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/CameraPosition.h	(revision 2478)
@@ -49,8 +49,14 @@
                 { return this->bDrag_; }
 
+            inline void setAllowMouseLook(bool bAllow)
+                { this->bAllowMouseLook_ = bAllow; }
+            inline bool getAllowMouseLook() const
+                { return this->bAllowMouseLook_; }
+
             void attachCamera(Camera* camera);
 
         private:
             bool bDrag_;
+            bool bAllowMouseLook_;
     };
 }
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2478)
@@ -30,9 +30,13 @@
 #include "ControllableEntity.h"
 
+#include <OgreSceneManager.h>
+
 #include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
 #include "core/Core.h"
 #include "core/XMLPort.h"
 #include "core/Template.h"
 
+#include "objects/Scene.h"
 #include "objects/infos/PlayerInfo.h"
 #include "objects/worldentities/Camera.h"
@@ -59,4 +63,7 @@
         this->camera_ = 0;
         this->bDestroyWhenPlayerLeft_ = false;
+        this->cameraPositionRootNode_ = this->node_->createChildSceneNode();
+        this->bMouseLook_ = false;
+        this->mouseLookSpeed_ = 200;
 
         this->gtinfo_ = 0;
@@ -74,4 +81,5 @@
         this->client_orientation_ = Quaternion::IDENTITY;
 
+        this->setConfigValues();
         this->registerVariables();
     }
@@ -94,4 +102,10 @@
             if (this->camera_)
                 delete this->camera_;
+
+            for (std::list<CameraPosition*>::const_iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
+                delete (*it);
+
+            if (this->getScene()->getSceneManager())
+                this->getScene()->getSceneManager()->destroySceneNode(this->cameraPositionRootNode_->getName());
         }
     }
@@ -107,4 +121,9 @@
     }
 
+    void ControllableEntity::setConfigValues()
+    {
+        SetConfigValue(mouseLookSpeed_, 3.0f);
+    }
+
     void ControllableEntity::changedGametype()
     {
@@ -124,5 +143,8 @@
     void ControllableEntity::addCameraPosition(CameraPosition* position)
     {
-        this->attach(position);
+        if (position->getAllowMouseLook())
+            position->attachToNode(this->cameraPositionRootNode_);
+        else
+            this->attach(position);
         this->cameraPositions_.push_back(position);
     }
@@ -165,7 +187,33 @@
             else
             {
-                this->attach(this->camera_);
-            }
-        }
+                this->camera_->attachToNode(this->cameraPositionRootNode_);
+            }
+        }
+    }
+
+    void ControllableEntity::mouseLook()
+    {
+        this->bMouseLook_ = !this->bMouseLook_;
+
+        if (!this->bMouseLook_)
+            this->cameraPositionRootNode_->setOrientation(Quaternion::IDENTITY);
+    }
+
+    void ControllableEntity::rotateYaw(const Vector2& value)
+    {
+        if (this->bMouseLook_)
+            this->cameraPositionRootNode_->yaw(Radian(value.y * this->mouseLookSpeed_), Ogre::Node::TS_LOCAL);
+    }
+
+    void ControllableEntity::rotatePitch(const Vector2& value)
+    {
+        if (this->bMouseLook_)
+            this->cameraPositionRootNode_->pitch(Radian(value.y * this->mouseLookSpeed_), Ogre::Node::TS_LOCAL);
+    }
+
+    void ControllableEntity::rotateRoll(const Vector2& value)
+    {
+        if (this->bMouseLook_)
+            this->cameraPositionRootNode_->roll(Radian(value.y * this->mouseLookSpeed_), Ogre::Node::TS_LOCAL);
     }
 
@@ -243,5 +291,5 @@
                 this->cameraPositions_.front()->attachCamera(this->camera_);
             else
-                this->attach(this->camera_);
+                this->camera_->attachToNode(this->cameraPositionRootNode_);
         }
 
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.h
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2478)
@@ -46,4 +46,5 @@
             virtual void tick(float dt);
             void registerVariables();
+            void setConfigValues();
 
             virtual void changedGametype();
@@ -63,7 +64,7 @@
             virtual void moveUpDown(const Vector2& value) {}
 
-            virtual void rotateYaw(const Vector2& value) {}
-            virtual void rotatePitch(const Vector2& value) {}
-            virtual void rotateRoll(const Vector2& value) {}
+            virtual void rotateYaw(const Vector2& value);
+            virtual void rotatePitch(const Vector2& value);
+            virtual void rotateRoll(const Vector2& value);
 
             inline void moveFrontBack(float value)
@@ -88,4 +89,5 @@
             virtual void use() {}
             virtual void switchCamera();
+            virtual void mouseLook();
 
             inline const Vector3& getVelocity() const
@@ -148,4 +150,9 @@
                 { return this->gtinfo_; }
 
+            inline bool isInMouseLook() const
+                { return this->bMouseLook_; }
+            inline float getMouseLookSpeed() const
+                { return this->mouseLookSpeed_; }
+
         protected:
             virtual void startLocalHumanControl();
@@ -179,4 +186,5 @@
             bool bHasLocalController_;
             bool bHasHumanController_;
+            bool bDestroyWhenPlayerLeft_;
 
             Vector3 server_position_;
@@ -189,9 +197,12 @@
             PlayerInfo* player_;
             unsigned int playerID_;
+
             std::string hudtemplate_;
             OverlayGroup* hud_;
+
             Camera* camera_;
-            bool bDestroyWhenPlayerLeft_;
-
+            bool bMouseLook_;
+            float mouseLookSpeed_;
+            Ogre::SceneNode* cameraPositionRootNode_;
             std::list<CameraPosition*> cameraPositions_;
             std::string cameraPositionTemplate_;
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/WorldEntity.cc
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2478)
@@ -79,4 +79,6 @@
                 this->detachFromParent();
 
+            this->node_->removeAllChildren();
+
             if (this->getScene()->getSceneManager())
                 this->getScene()->getSceneManager()->destroySceneNode(this->node_->getName());
@@ -125,4 +127,32 @@
     }
 
+    void WorldEntity::attachNode(Ogre::SceneNode* node)
+    {
+        Ogre::Node* parent = node->getParent();
+        if (parent)
+            parent->removeChild(node);
+        this->node_->addChild(node);
+    }
+
+    void WorldEntity::detachNode(Ogre::SceneNode* node)
+    {
+        this->node_->removeChild(node);
+//        this->getScene()->getRootSceneNode()->addChild(node);
+    }
+
+    void WorldEntity::attachToNode(Ogre::SceneNode* node)
+    {
+        Ogre::Node* parent = this->node_->getParent();
+        if (parent)
+            parent->removeChild(this->node_);
+        node->addChild(this->node_);
+    }
+
+    void WorldEntity::detachFromNode(Ogre::SceneNode* node)
+    {
+        node->removeChild(this->node_);
+//        this->getScene()->getRootSceneNode()->addChild(this->node_);
+    }
+
     void WorldEntity::attach(WorldEntity* object)
     {
@@ -135,12 +165,7 @@
         if (object->getParent())
             object->detachFromParent();
-        else
-        {
-            Ogre::Node* parent = object->node_->getParent();
-            if (parent)
-                parent->removeChild(object->node_);
-        }
 
-        this->node_->addChild(object->node_);
+        this->attachNode(object->node_);
+
         this->children_.insert(object);
         object->parent_ = this;
@@ -150,10 +175,8 @@
     void WorldEntity::detach(WorldEntity* object)
     {
-        this->node_->removeChild(object->node_);
+        this->detachNode(object->node_);
         this->children_.erase(object);
         object->parent_ = 0;
         object->parentID_ = OBJECTID_UNKNOWN;
-
-//        this->getScene()->getRootSceneNode()->addChild(object->node_);
     }
 
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/WorldEntity.h
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/WorldEntity.h	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/WorldEntity.h	(revision 2478)
@@ -147,4 +147,9 @@
                 { return this->parent_; }
 
+            void attachNode(Ogre::SceneNode* node);
+            void detachNode(Ogre::SceneNode* node);
+            void attachToNode(Ogre::SceneNode* node);
+            void detachFromNode(Ogre::SceneNode* node);
+
         protected:
             Ogre::SceneNode* node_;
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/SpaceShip.cc
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/SpaceShip.cc	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/SpaceShip.cc	(revision 2478)
@@ -134,10 +134,13 @@
         if (this->hasLocalController())
         {
-            this->yaw(this->yawRotation_ * dt);
-            if (this->bInvertYAxis_)
-                this->pitch(Degree(-this->pitchRotation_ * dt));
-            else
-                this->pitch(Degree( this->pitchRotation_ * dt));
-            this->roll(this->rollRotation_ * dt);
+            if (!this->isInMouseLook())
+            {
+                this->yaw(this->yawRotation_ * dt);
+                if (this->bInvertYAxis_)
+                    this->pitch(Degree(-this->pitchRotation_ * dt));
+                else
+                    this->pitch(Degree( this->pitchRotation_ * dt));
+                this->roll(this->rollRotation_ * dt);
+            }
 
             this->yawRotation_   = this->zeroDegree_;
@@ -170,4 +173,6 @@
             temp = -this->maxRotation_;
         this->yawRotation_ = Degree(temp);
+
+        Pawn::rotateYaw(value);
     }
 
@@ -180,4 +185,6 @@
             temp = -this->maxRotation_;
         this->pitchRotation_ = Degree(temp);
+
+        Pawn::rotatePitch(value);
     }
 
@@ -190,4 +197,6 @@
             temp = -this->maxRotation_;
         this->rollRotation_ = Degree(temp);
+
+        Pawn::rotateRoll(value);
     }
 
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.cc
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 2478)
@@ -51,5 +51,4 @@
 
         this->speed_ = 200;
-        this->rotationSpeed_ = 3;
 
         this->yaw_ = 0;
@@ -88,5 +87,4 @@
     {
         SetConfigValue(speed_, 200.0f);
-        SetConfigValue(rotationSpeed_, 3.0f);
     }
 
@@ -116,7 +114,10 @@
             this->setVelocity(velocity * this->speed_);
 
-            this->yaw(Radian(this->yaw_ * this->rotationSpeed_));
-            this->pitch(Radian(this->pitch_ * this->rotationSpeed_));
-            this->roll(Radian(this->roll_ * this->rotationSpeed_));
+            if (!this->isInMouseLook())
+            {
+                this->yaw(Radian(this->yaw_ * this->getMouseLookSpeed()));
+                this->pitch(Radian(this->pitch_ * this->getMouseLookSpeed()));
+                this->roll(Radian(this->roll_ * this->getMouseLookSpeed()));
+            }
 
             this->yaw_ = this->pitch_ = this->roll_ = 0;
@@ -161,4 +162,6 @@
     {
         this->yaw_ = value.y;
+
+        ControllableEntity::rotateYaw(value);
     }
 
@@ -166,4 +169,6 @@
     {
         this->pitch_ = value.y;
+
+        ControllableEntity::rotatePitch(value);
     }
 
@@ -171,4 +176,6 @@
     {
         this->roll_ = value.y;
+
+        ControllableEntity::rotateRoll(value);
     }
 
Index: /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.h
===================================================================
--- /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 2477)
+++ /code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 2478)
@@ -69,5 +69,4 @@
 
             float speed_;
-            float rotationSpeed_;
 
             float yaw_;
