Index: code/branches/pickup2/src/orxonox/graphics/Billboard.cc
===================================================================
--- code/branches/pickup2/src/orxonox/graphics/Billboard.cc	(revision 5942)
+++ code/branches/pickup2/src/orxonox/graphics/Billboard.cc	(revision 6412)
@@ -42,5 +42,4 @@
         RegisterObject(Billboard);
 
-        this->material_ = "";
         this->colour_ = ColourValue::White;
 //        this->rotation_ = 0;
@@ -76,5 +75,5 @@
     void Billboard::changedMaterial()
     {
-        if (this->material_ == "")
+        if (this->material_.empty())
             return;
 
@@ -99,5 +98,5 @@
         {
 /*
-            if (this->getScene() && GameMode::showsGraphics() && (this->material_ != ""))
+            if (this->getScene() && GameMode::showsGraphics() && !this->material_.empty())
             {
                 this->billboard_.setBillboardSet(this->getScene()->getSceneManager(), this->material_, this->colour_, 1);
Index: code/branches/pickup2/src/orxonox/graphics/BlinkingBillboard.cc
===================================================================
--- code/branches/pickup2/src/orxonox/graphics/BlinkingBillboard.cc	(revision 5942)
+++ code/branches/pickup2/src/orxonox/graphics/BlinkingBillboard.cc	(revision 6412)
@@ -81,5 +81,5 @@
                 this->setScale(this->amplitude_ * static_cast<float>(square(sin((6.2831853 * this->time_ + this->phase_.valueRadians()) * this->frequency_))));
             else
-                this->setScale(this->amplitude_ * static_cast<float>(sin((6.2831853 * this->time_ + this->phase_.valueRadians()) * this->frequency_)));
+                this->setScale(this->amplitude_ * static_cast<float>(fabs(sin((6.2831853 * this->time_ + this->phase_.valueRadians()) * this->frequency_))));
         }
     }
Index: code/branches/pickup2/src/orxonox/graphics/Camera.cc
===================================================================
--- code/branches/pickup2/src/orxonox/graphics/Camera.cc	(revision 5942)
+++ code/branches/pickup2/src/orxonox/graphics/Camera.cc	(revision 6412)
@@ -42,4 +42,5 @@
 #include "Scene.h"
 #include "CameraManager.h"
+#include "sound/SoundManager.h"
 
 namespace orxonox
@@ -61,4 +62,5 @@
 
         this->camera_ = this->getScene()->getSceneManager()->createCamera(getUniqueNumberString());
+        this->camera_->setUserObject(this);
         this->cameraNode_ = this->getScene()->getRootSceneNode()->createChildSceneNode();
         this->attachNode(this->cameraNode_);
@@ -68,4 +70,5 @@
         this->bDrag_ = false;
         this->nearClipDistance_ = 1;
+        this->lastDtLagged_ = false;
 
         this->setSyncMode(0x0);
@@ -111,11 +114,39 @@
         {
             // this stuff here may need some adjustments
-            float coeff = std::min(1.0f, 15.0f * dt);
+            float poscoeff = 15.0f * dt / this->getTimeFactor();
+            float anglecoeff = 7.0f * dt / this->getTimeFactor();
+            // Only clamp if fps rate is actually falling. Occasional high dts should
+            // not be clamped to reducing lagging effects.
+            if (poscoeff > 1.0f)
+            {
+                if (this->lastDtLagged_)
+                    poscoeff = 1.0f;
+                else
+                    this->lastDtLagged_ = true;
+            }
+            else
+                this->lastDtLagged_ = false;
+
+            if (anglecoeff > 1.0f)
+            {
+                if (this->lastDtLagged_)
+                    anglecoeff = 1.0f;
+                else
+                    this->lastDtLagged_ = true;
+            }
+            else
+                this->lastDtLagged_ = false;
 
             Vector3 offset = this->getWorldPosition() - this->cameraNode_->_getDerivedPosition();
-            this->cameraNode_->translate(coeff * offset);
+            this->cameraNode_->translate(poscoeff * offset);
 
-            this->cameraNode_->setOrientation(Quaternion::Slerp(coeff, this->cameraNode_->_getDerivedOrientation(), this->getWorldOrientation(), true));
-            //this->cameraNode_->setOrientation(this->getWorldOrientation());
+            this->cameraNode_->setOrientation(Quaternion::Slerp(anglecoeff, this->cameraNode_->_getDerivedOrientation(), this->getWorldOrientation(), true));
+        }
+
+        // Update sound listener transformation
+        if (GameMode::playsSound() && this->bHasFocus_)
+        {
+            SoundManager::getInstance().setListenerPosition(this->getWorldPosition());
+            SoundManager::getInstance().setListenerOrientation(this->getWorldOrientation());
         }
     }
Index: code/branches/pickup2/src/orxonox/graphics/Camera.h
===================================================================
--- code/branches/pickup2/src/orxonox/graphics/Camera.h	(revision 5942)
+++ code/branches/pickup2/src/orxonox/graphics/Camera.h	(revision 6412)
@@ -34,9 +34,10 @@
 #include "util/OgreForwardRefs.h"
 #include "tools/interfaces/Tickable.h"
+#include "tools/interfaces/TimeFactorListener.h"
 #include "worldentities/StaticEntity.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport Camera : public StaticEntity, public Tickable
+    class _OrxonoxExport Camera : public StaticEntity, public Tickable, public TimeFactorListener
     {
         friend class CameraManager;
@@ -51,4 +52,7 @@
             void requestFocus();
             void releaseFocus();
+
+            inline Ogre::Camera* getOgreCamera()
+               { return this->camera_; }
 
             inline bool hasFocus()
@@ -69,4 +73,5 @@
             bool             bHasFocus_;
             bool             bDrag_;
+            bool             lastDtLagged_;
     };
 }
