Index: code/branches/pickup/src/modules/objects/collisionshapes/BoxCollisionShape.cc
===================================================================
--- code/branches/pickup/src/modules/objects/collisionshapes/BoxCollisionShape.cc	(revision 8381)
+++ code/branches/pickup/src/modules/objects/collisionshapes/BoxCollisionShape.cc	(revision 8422)
@@ -27,4 +27,9 @@
  */
 
+/**
+    @file BoxCollisionShape.cc
+    @brief Implementation of the BoxCollisionShape class.
+*/
+
 #include "BoxCollisionShape.h"
 
@@ -39,4 +44,8 @@
     CreateFactory(BoxCollisionShape);
 
+    /**
+    @brief
+        Constructor. Registers and initializes the object.
+    */
     BoxCollisionShape::BoxCollisionShape(BaseObject* creator) : CollisionShape(creator)
     {
@@ -44,5 +53,5 @@
 
         this->halfExtents_ = Vector3(1, 1, 1);
-        updateShape();
+        this->updateShape();
 
         this->registerVariables();
@@ -51,4 +60,5 @@
     BoxCollisionShape::~BoxCollisionShape()
     {
+        // TODO: Move to CollisionShape?
         if (this->isInitialized())
             delete this->collisionShape_;
@@ -70,4 +80,30 @@
     }
 
+    /**
+    @brief
+        Is called when the scale of the BoxCollisionShape has changed.
+    */
+    void BoxCollisionShape::changedScale()
+    {
+        CollisionShape::changedScale();
+
+        // Resize the internal collision shape
+        // TODO: Assuming setLocalScaling works.
+        // this->collisionShape_->setLocalScaling(multi_cast<btVector3>(this->getScale3D()));
+        if(!this->hasUniformScaling())
+        {
+            CCOUT(1) << "Error: Non-uniform scaling is not yet supported." << endl;
+            return;
+        }
+
+        this->setHalfExtents(this->halfExtents_ * this->getScale());
+    }
+
+    /**
+    @brief
+        Creates a new internal collision shape for the BoxCollisionShape.
+    @return
+        Returns a pointer to the newly created btBoxShape.
+    */
     btCollisionShape* BoxCollisionShape::createNewShape() const
     {
Index: code/branches/pickup/src/modules/objects/collisionshapes/BoxCollisionShape.h
===================================================================
--- code/branches/pickup/src/modules/objects/collisionshapes/BoxCollisionShape.h	(revision 8381)
+++ code/branches/pickup/src/modules/objects/collisionshapes/BoxCollisionShape.h	(revision 8422)
@@ -43,4 +43,14 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for the bullet box collision shape class btBoxShape.
+
+    @author
+        Reto Grieder
+
+    @ingroup Collisionshapes
+    */
     class _ObjectsExport BoxCollisionShape : public CollisionShape
     {
@@ -51,30 +61,73 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
 
-            inline void setHalfExtents(const Vector3& extents)
-                { this->halfExtents_ = extents; updateShape(); }
+            /**
+            @brief Set the half extents of the BoxCollisionShape.
+                   If the half extent changes, this causes the internal collision shape to be recreated.
+            @param extents A vector with the half extents.
+                   The x-component is half the length, the y-component is half the height and the z-component is half the width.
+            @return Returns true if the half extent has changed, false if not.
+            */
+            inline bool setHalfExtents(const Vector3& extents)
+                { if(this->halfExtents_ == extents) return false; this->halfExtents_ = extents; updateShape(); return true; }
+            /**
+            @brief Get the half extents of the BoxCollisionShape.
+            @return Returns a vector containing the half extents.
+            */
             inline const Vector3& getHalfExtents() const
                 { return halfExtents_;}
 
-            inline void setWidth(float value)
-                { this->halfExtents_.z = value / 2; updateShape(); }
+            /**
+            @brief Set the width of the BoxCollisionShape.
+                   If the width changes, this causes the internal collision shape to be recreated.
+            @param value The width to be set.
+            @return Returns true if the width has changed, false if not.
+            */
+            inline bool setWidth(float value)
+                { if(this->halfExtents_.z == value/2.0f) return false; this->halfExtents_.z = value / 2.0f; updateShape(); return true; }
+            /**
+            @brief Get the width of the BoxCollisionShape.
+            @return Returns the width of the BoxCollisionShape.
+            */
             inline float getWidth() const
-                { return this->halfExtents_.z * 2; }
+                { return this->halfExtents_.z * 2.0f; }
 
-            inline void setHeight(float value)
-                { this->halfExtents_.y = value / 2; updateShape(); }
+            /**
+            @brief Set the height of the BoxCollisionShape.
+                   If the height changes, this causes the internal collision shape to be recreated.
+            @param value The height to be set.
+            @return Returns true if the height has changed, false if not.
+            */
+            inline bool setHeight(float value)
+                { if(this->halfExtents_.y == value/2.0f) return false; this->halfExtents_.y = value / 2.0f; updateShape(); return true; }
+            /**
+            @brief Get the height of the BoxCollisionShape.
+            @return Returns the height of the BoxCollisionShape.
+            */
             inline float getHeight() const
-                { return this->halfExtents_.y * 2; }
+                { return this->halfExtents_.y * 2.0f; }
 
-            inline void setLength(float value)
-                { this->halfExtents_.x = value / 2; updateShape(); }
+            /**
+            @brief Set the length of the BoxCollisionShape.
+                   If the length changes, this causes the internal collision shape to be recreated.
+            @param value The length to be set.
+            @return Returns true if the length has changed, false if not.
+            */
+            inline bool setLength(float value)
+                { if(this->halfExtents_.x == value/2.0f) return false; this->halfExtents_.x = value / 2.0f; updateShape(); return true; }
+            /**
+            @brief Get the length of the BoxCollisionShape.
+            @return Returns the length of the BoxCollisionShape.
+            */
             inline float getLength() const
-                { return this->halfExtents_.x * 2; }
+                { return this->halfExtents_.x * 2.0f; }
+
+            virtual void changedScale(); // Is called when the scale of the BoxCollisionShape has changed.
 
         private:
             void registerVariables();
 
-            btCollisionShape* createNewShape() const;
+            btCollisionShape* createNewShape() const; // Creates a new internal collision shape for the BoxCollisionShape.
 
-            Vector3 halfExtents_;
+            Vector3 halfExtents_; //!< The half extents of the BoxCollisionShape. The x-component is half the length, the y-component is half the height and the z-component is half the width.
      };
 }
Index: code/branches/pickup/src/modules/objects/collisionshapes/ConeCollisionShape.cc
===================================================================
--- code/branches/pickup/src/modules/objects/collisionshapes/ConeCollisionShape.cc	(revision 8381)
+++ code/branches/pickup/src/modules/objects/collisionshapes/ConeCollisionShape.cc	(revision 8422)
@@ -27,4 +27,9 @@
  */
 
+/**
+    @file ConeCollisionShape.cc
+    @brief Implementation of the ConeCollisionShape class.
+*/
+
 #include "ConeCollisionShape.h"
 
@@ -33,4 +38,5 @@
 #include "core/CoreIncludes.h"
 #include "core/XMLPort.h"
+#include "tools/BulletConversions.h"
 
 namespace orxonox
@@ -38,4 +44,8 @@
     CreateFactory(ConeCollisionShape);
 
+    /**
+    @brief
+        Constructor. Registers and initializes the object.
+    */
     ConeCollisionShape::ConeCollisionShape(BaseObject* creator) : CollisionShape(creator)
     {
@@ -69,4 +79,32 @@
     }
 
+    /**
+    @brief
+        Is called when the scale of the ConeCollisionShape has changed.
+    */
+    void ConeCollisionShape::changedScale()
+    {
+        CollisionShape::changedScale();
+
+        // Resize the internal collision shape
+        // TODO: Assuming setLocalScaling works.
+        //this->collisionShape_->setLocalScaling(multi_cast<btVector3>(this->getScale3D()));
+        if(!this->hasUniformScaling())
+        {
+            CCOUT(1) << "Error: Non-uniform scaling is not yet supported." << endl;
+            return;
+        }
+
+        this->radius_ *= this->getScale();
+        this->height_ *= this->getScale();
+        this->updateShape();
+    }
+
+    /**
+    @brief
+        Creates a new internal collision shape for the ConeCollisionShape.
+    @return
+        Returns a pointer to the newly created btConeShape.
+    */
     btCollisionShape* ConeCollisionShape::createNewShape() const
     {
Index: code/branches/pickup/src/modules/objects/collisionshapes/ConeCollisionShape.h
===================================================================
--- code/branches/pickup/src/modules/objects/collisionshapes/ConeCollisionShape.h	(revision 8381)
+++ code/branches/pickup/src/modules/objects/collisionshapes/ConeCollisionShape.h	(revision 8422)
@@ -41,4 +41,14 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for the bullet cone collision shape class btConeShape.
+
+    @author
+        Reto Grieder
+
+    @ingroup Collisionshapes.
+    */
     class _ObjectsExport ConeCollisionShape : public CollisionShape
     {
@@ -49,21 +59,43 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
 
-            inline void setRadius(float value)
-                { this->radius_ = value; updateShape(); }
+            /**
+            @brief Set the radius of the ConeCollisionShape.
+                   If the radius changes, this causes the internal collision shape to be recreated.
+            @param value The radius to be set.
+            @return Returns true if the radius has changed, false if not.
+            */
+            inline bool setRadius(float value)
+                { if(this->radius_ == value) return false; this->radius_ = value; updateShape(); return true; }
+            /**
+            @brief Get the radius of the ConeCollisionShape.
+            @return Returns the radius of the ConeCollisionShape.
+            */
             inline float getRadius() const
                 { return radius_; }
 
-            inline void setHeight(float value)
-                { this->height_ = value; updateShape(); }
+            /**
+            @brief Set the height of the ConeCollisionShape.
+                   If the height changes, this causes the internal collision shape to be recreated.
+            @param value The height to be set.
+            @return Returns true if the height has changed, false if not.
+            */
+            inline bool setHeight(float value)
+                { if(this->height_ == value) return false; this->height_ = value; updateShape(); return true; }
+            /**
+            @brief Get the height of the ConeCollisionShape.
+            @return Returns the height of the ConeCollisionShape.
+            */
             inline float getHeight() const
                 { return this->height_; }
+
+            virtual void changedScale(); // Is called when the scale of the ConeCollisionShape has changed.
 
         private:
             void registerVariables();
 
-            btCollisionShape* createNewShape() const;
+            btCollisionShape* createNewShape() const; // Creates a new internal collision shape for the ConeCollisionShape.
 
-            float radius_;
-            float height_;
+            float radius_; //!< The radius of the ConeCollisionShape.
+            float height_; //!< The height of the ConeCollisionShape.
      };
 }
Index: code/branches/pickup/src/modules/objects/collisionshapes/PlaneCollisionShape.cc
===================================================================
--- code/branches/pickup/src/modules/objects/collisionshapes/PlaneCollisionShape.cc	(revision 8381)
+++ code/branches/pickup/src/modules/objects/collisionshapes/PlaneCollisionShape.cc	(revision 8422)
@@ -27,4 +27,9 @@
  */
 
+/**
+    @file PlaneCollisionShape.cc
+    @brief Implementation of the PlaneCollisionShape class.
+*/
+
 #include "PlaneCollisionShape.h"
 
@@ -39,4 +44,8 @@
     CreateFactory(PlaneCollisionShape);
 
+    /**
+    @brief
+        Constructor. Registers and initializes the object.
+    */
     PlaneCollisionShape::PlaneCollisionShape(BaseObject* creator) : CollisionShape(creator)
     {
@@ -70,4 +79,30 @@
     }
 
+    /**
+    @brief
+        Is called when the scale of the PlaneCollisionShape has changed.
+    */
+    void PlaneCollisionShape::changedScale()
+    {
+        CollisionShape::changedScale();
+
+        // Resize the internal collision shape
+        // TODO: Assuming setLocalScaling works.
+        //this->collisionShape_->setLocalScaling(multi_cast<btVector3>(this->getScale3D()));
+        if(!this->hasUniformScaling())
+        {
+            CCOUT(1) << "Error: Non-uniform scaling is not yet supported." << endl;
+            return;
+        }
+
+        this->setOffset(this->offset_*this->getScale());
+    }
+
+    /**
+    @brief
+        Creates a new internal collision shape for the PlaneCollisionShape.
+    @return
+        Returns a pointer to the newly created btStaticPlaneShape.
+    */
     btCollisionShape* PlaneCollisionShape::createNewShape() const
     {
Index: code/branches/pickup/src/modules/objects/collisionshapes/PlaneCollisionShape.h
===================================================================
--- code/branches/pickup/src/modules/objects/collisionshapes/PlaneCollisionShape.h	(revision 8381)
+++ code/branches/pickup/src/modules/objects/collisionshapes/PlaneCollisionShape.h	(revision 8422)
@@ -43,4 +43,14 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for the bullet plane collision shape class btStaticPlaneShape.
+
+    @author
+        Martin Stypinski
+
+    @ingroup Collisionshapes
+    */
     class _ObjectsExport PlaneCollisionShape : public CollisionShape
     {
@@ -51,21 +61,43 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
 
-            inline void setNormal(const Vector3& normal)
-                { this->normal_ = normal; updateShape(); }
-            inline const Vector3& getNormal()
+            /**
+            @brief Set the normal of the PlaneCollisionShape.
+                   If the normal changes, this causes the internal collision shape to be recreated.
+            @param normal The normal vector to be set.
+            @return Returns true if the normal has changed, false if not.
+            */
+            inline bool setNormal(const Vector3& normal)
+                { if(this->normal_ == normal) return false; this->normal_ = normal; updateShape(); return true; }
+            /**
+            @brief Get the normal of the PlaneCollisionShape.
+            @return Returns the normal vector of the PlaneCollisionShape.
+            */
+            inline const Vector3& getNormal() const
                 { return normal_;}
 
-            inline void setOffset(float offset)
-                { this->offset_ = offset; updateShape(); }
-            inline float getOffset()
+            /**
+            @brief Set the offset of the PlaneCollisionShape.
+                   If the offset changes, this causes the internal collision shape to be recreated.
+            @param offset The offset to be set.
+            @return Returns true if the offset has changed, false if not.
+            */
+            inline bool setOffset(float offset)
+                { if(this->offset_ == offset) return false; this->offset_ = offset; updateShape(); return true; }
+            /**
+            @brief Get the offset of the PlaneCollisionShape.
+            @return Returns the offset of the PlaneCollisionShape.
+            */
+            inline float getOffset() const
                 { return this->offset_;}
+
+            virtual void changedScale(); // Is called when the scale of the PlaneCollisionShape has changed.
 
         private:
             void registerVariables();
 
-            btCollisionShape* createNewShape()const;
+            btCollisionShape* createNewShape() const; // Creates a new internal collision shape for the PlaneCollisionShape.
 
-            Vector3 normal_;
-            float   offset_;
+            Vector3 normal_; //!< The normal vector of the PlaneCollisionShape.
+            float   offset_; //!< The offset of the PlaneCollisionShape.
      };
 }
Index: code/branches/pickup/src/modules/objects/collisionshapes/SphereCollisionShape.cc
===================================================================
--- code/branches/pickup/src/modules/objects/collisionshapes/SphereCollisionShape.cc	(revision 8381)
+++ code/branches/pickup/src/modules/objects/collisionshapes/SphereCollisionShape.cc	(revision 8422)
@@ -27,4 +27,9 @@
  */
 
+/**
+    @file SphereCollisionShape.cc
+    @brief Implementation of the SphereCollisionShape class.
+*/
+
 #include "SphereCollisionShape.h"
 
@@ -33,4 +38,5 @@
 #include "core/CoreIncludes.h"
 #include "core/XMLPort.h"
+#include "tools/BulletConversions.h"
 
 namespace orxonox
@@ -38,4 +44,8 @@
     CreateFactory(SphereCollisionShape);
 
+    /**
+    @brief
+        Constructor. registers and initializes the object.
+    */
     SphereCollisionShape::SphereCollisionShape(BaseObject* creator) : CollisionShape(creator)
     {
@@ -66,4 +76,30 @@
     }
 
+    /**
+    @brief
+        Is called when the scale of the SphereCollisionShape has changed.
+    */
+    void SphereCollisionShape::changedScale()
+    {
+        CollisionShape::changedScale();
+
+        // Resize the internal collision shape
+        // TODO: Assuming setLocalScaling works.
+        //this->collisionShape_->setLocalScaling(multi_cast<btVector3>(this->getScale3D()));
+        if(!this->hasUniformScaling())
+        {
+            CCOUT(1) << "Error: Non-uniform scaling is not yet supported." << endl;
+            return;
+        }
+
+        this->setRadius(this->radius_*this->getScale());
+    }
+
+    /**
+    @brief
+        Creates a new internal collision shape for the SphereCollisionShape.
+    @return
+        Returns a pointer to the newly created btSphereShape.
+    */
     btCollisionShape* SphereCollisionShape::createNewShape() const
     {
Index: code/branches/pickup/src/modules/objects/collisionshapes/SphereCollisionShape.h
===================================================================
--- code/branches/pickup/src/modules/objects/collisionshapes/SphereCollisionShape.h	(revision 8381)
+++ code/branches/pickup/src/modules/objects/collisionshapes/SphereCollisionShape.h	(revision 8422)
@@ -41,4 +41,14 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for the bullet sphere collision shape class btSphereShape.
+
+    @author
+        Reto Grieder
+
+    @ingroup Collisionshapes
+    */
     class _ObjectsExport SphereCollisionShape : public CollisionShape
     {
@@ -49,8 +59,20 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
 
-            inline void setRadius(float radius)
-                { this->radius_ = radius; updateShape(); }
+            /**
+            @brief Set the radius of the SphereCollisionShape.
+                   If the radius changes, this causes the internal collision shape to be recreated.
+            @param radius The radius to be set.
+            @return Returns true if the radius has changed, false if not.
+            */
+            inline bool setRadius(float radius)
+                { if(this->radius_ == radius) return false; this->radius_ = radius; updateShape(); return true; }
+            /**
+            @brief Get the radius of the SphereCollisionShape.
+            @return Returns the radius of the SphereCollisionShape.
+            */
             inline float getRadius() const
                 { return this->radius_; }
+
+            virtual void changedScale(); // Is called when the scale of the SphereCollisionShape has changed.
 
         private:
@@ -59,5 +81,5 @@
             btCollisionShape* createNewShape() const;
 
-            float radius_;
+            float radius_; //!< The radius of the SphereCollisionShape.
     };
 }
Index: code/branches/pickup/src/orxonox/collisionshapes/CollisionShape.cc
===================================================================
--- code/branches/pickup/src/orxonox/collisionshapes/CollisionShape.cc	(revision 8381)
+++ code/branches/pickup/src/orxonox/collisionshapes/CollisionShape.cc	(revision 8422)
@@ -26,4 +26,9 @@
  *
  */
+
+/**
+    @file CollisionShape.cc
+    @brief Implementation of the CollisionShape class.
+*/
 
 #include "CollisionShape.h"
@@ -39,4 +44,9 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Constructor. Registers and initializes the object.
+    */
     CollisionShape::CollisionShape(BaseObject* creator)
         : BaseObject(creator)
@@ -51,11 +61,16 @@
         this->orientation_ = Quaternion::IDENTITY;
         this->scale_ = Vector3::UNIT_SCALE;
+        this->uniformScale_ = true;
 
         this->registerVariables();
     }
 
+    /**
+    @brief
+        Destructor. Detaches the CollisionShape from its parent.
+    */
     CollisionShape::~CollisionShape()
     {
-        // Detach from parent
+        // Detach from parent CompoundCollisionShape.
         if (this->isInitialized() && this->parent_)
             this->parent_->detach(this);
@@ -75,19 +90,82 @@
     }
 
+    /**
+    @brief
+        Register variables that need synchronizing over the network.
+    */
     void CollisionShape::registerVariables()
     {
+        // Keep the shape's parent (can be either a CompoundCollisionShape or a WorldEntity) consistent over the network.
         registerVariable(this->parentID_, VariableDirection::ToClient, new NetworkCallback<CollisionShape>(this, &CollisionShape::parentChanged));
     }
 
+    /**
+    @brief
+        Notifies the CollisionShape of being attached to a CompoundCollisionShape.
+    @param newParent
+        A pointer to the CompoundCollisionShape the CollisionShape was attached to.
+    @return
+        Returns 
+    */
+    bool CollisionShape::notifyBeingAttached(CompoundCollisionShape* newParent)
+    {
+        // If the CollisionShape is attached to a CompoundCollisionShapes, detach it.
+        if (this->parent_)
+            this->parent_->detach(this);
+
+        this->parent_ = newParent;
+
+        // If the new parent is a WorldEntityCollisionShape, the parentID is set to the objectID of the WorldEntity that is its owner.
+        // TODO: Why?
+        WorldEntityCollisionShape* parentWECCS = orxonox_cast<WorldEntityCollisionShape*>(newParent);
+        if (parentWECCS)
+            this->parentID_ = parentWECCS->getWorldEntityOwner()->getObjectID();
+        // Else it is set to the objectID of the CompoundCollisionShape.
+        else
+            this->parentID_ = newParent->getObjectID();
+
+        return true;
+    }
+
+    /**
+    @brief
+        Notifies the CollisionShape of being detached from a CompoundCollisionShape.
+    */
+    void CollisionShape::notifyDetached()
+    {
+        this->parent_ = 0;
+        this->parentID_ = OBJECTID_UNKNOWN;
+    }
+
+    /**
+    @brief
+        Updates the CompoundCollisionShape the CollisionShape belongs to (if it belongs to one), after the CollisionShape has changed.
+    */
+    void CollisionShape::updateParent()
+    {
+        if (this->parent_)
+            this->parent_->updateAttachedShape(this);
+    }
+
+    /**
+    @brief
+        Is called when the parentID of the CollisionShape has changed.
+        Attaches it to the object with the changed parentID, which can either be a CompoundCollisionShape or a WorldEntity.
+    */
     void CollisionShape::parentChanged()
     {
+        // Get the parent object from the network.
         Synchronisable* parent = Synchronisable::getSynchronisable(this->parentID_);
+
         // Parent can either be a WorldEntity or a CompoundCollisionShape. The reason is that the
         // internal collision shape (which is compound) of a WE doesn't get synchronised.
         CompoundCollisionShape* parentCCS = orxonox_cast<CompoundCollisionShape*>(parent);
+
+        // If the parent is a CompoundCollisionShape, attach the CollisionShape to it.
         if (parentCCS)
             parentCCS->attach(this);
         else
         {
+            // If the parent is a WorldEntity, attach the CollisionShape to its collision shapes.
             WorldEntity* parentWE = orxonox_cast<WorldEntity*>(parent);
             if (parentWE)
@@ -96,32 +174,10 @@
     }
 
-    bool CollisionShape::notifyBeingAttached(CompoundCollisionShape* newParent)
-    {
-        if (this->parent_)
-            this->parent_->detach(this);
-
-        this->parent_ = newParent;
-
-        WorldEntityCollisionShape* parentWECCS = orxonox_cast<WorldEntityCollisionShape*>(newParent);
-        if (parentWECCS)
-            this->parentID_ = parentWECCS->getWorldEntityOwner()->getObjectID();
-        else
-            this->parentID_ = newParent->getObjectID();
-
-        return true;
-    }
-
-    void CollisionShape::notifyDetached()
-    {
-        this->parent_ = 0;
-        this->parentID_ = OBJECTID_UNKNOWN;
-    }
-
-    void CollisionShape::updateParent()
-    {
-        if (this->parent_)
-            this->parent_->updateAttachedShape(this);
-    }
-
+    /**
+    @brief
+        Check whether the CollisionShape has been either moved or rotated or both. (i.e. it doesn't have position zero and identity orientation any more)
+    @return
+        Returns true if it has been moved.
+    */
     bool CollisionShape::hasTransform() const
     {
@@ -130,18 +186,71 @@
     }
 
+    /**
+    @brief
+        Set the scale of the CollisionShape.
+        Since the scale is a vector the CollisionShape can be scaled independently in each direction, allowing for linear distortions.
+        If the scale changes, this causes the parent CompoundCollisionShape (if there is one) to be updated.
+        Beware, non-uniform scaling (i.e. distortions) might not be supported by all CollisionShapes.
+    @param scale
+        The new scale to be set. Vector3::UNIT_SCALE is the initial scale.
+    */
     void CollisionShape::setScale3D(const Vector3& scale)
     {
-        CCOUT(2) << "Warning: Cannot set the scale of a collision shape: Not yet implemented." << std::endl;
-    }
-
+        if(this->scale_ == scale)
+            return;
+
+        // If the vectors are not in the same direction, then this is no longer a uniform scaling.
+        if(scale_.crossProduct(scale).squaredLength() != 0.0f)
+        {
+            CCOUT(2) << "Warning: Non-uniform scaling is not yet supported." << endl;
+            return;
+        }
+
+        this->scale_ = scale;
+
+        this->changedScale();
+        this->updateParent();
+    }
+
+    /**
+    @brief
+        Set the (uniform) scale of the CollisionShape.
+        If the scale changes, this causes the parent CompoundCollisionShape (if there is one) to be updated.
+    @param scale
+        The scale to scale the CollisionShape with. 1.0f is the initial scale.
+    */
     void CollisionShape::setScale(float scale)
     {
-        CCOUT(2) << "Warning: Cannot set the scale of a collision shape: Not yet implemented." << std::endl;
-    }
-
+        if(this->scale_.length() == scale)
+            return;
+
+        this->scale_ = Vector3::UNIT_SCALE*scale;
+
+        this->changedScale();
+        this->updateParent();
+    }
+
+    /**
+    @brief
+        Is called when the scale of the CollisionShape has changed.
+    */
+    void CollisionShape::changedScale()
+    {
+        // Adjust the position of the CollisionShape.
+        this->position_ *= this->getScale3D();
+    }
+
+    /**
+    @brief
+        Updates the shape.
+        Is called when the internal parameters of the shape have changed such that a new shape needs to be created.
+    */
     void CollisionShape::updateShape()
     {
         btCollisionShape* oldShape = this->collisionShape_;
         this->collisionShape_ = this->createNewShape();
+        // If the CollisionShape has been rescaled, scale the shape to fit the current scale.
+        if(this->scale_ != Vector3::UNIT_SCALE)
+            this->changedScale();
         // When we recreate the shape, we have to inform the parent about this to update the shape
         this->updateParent();
@@ -150,4 +259,10 @@
     }
 
+    /**
+    @brief
+        Calculates the local inertia of the collision shape.
+    @todo
+        Document.
+    */
     void CollisionShape::calculateLocalInertia(float mass, btVector3& inertia) const
     {
Index: code/branches/pickup/src/orxonox/collisionshapes/CollisionShape.h
===================================================================
--- code/branches/pickup/src/orxonox/collisionshapes/CollisionShape.h	(revision 8381)
+++ code/branches/pickup/src/orxonox/collisionshapes/CollisionShape.h	(revision 8422)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file CollisionShape.h
+    @brief Definition of the CollisionShape class.
+    @ingroup Collisionshapes
+*/
+
 #ifndef _CollisionShape_H__
 #define _CollisionShape_H__
@@ -38,4 +44,15 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for bullet collision shape class btCollisionShape.
+
+    @author
+        Reto Grieder
+
+    @see btCollisionShape
+    @ingroup Collisionshapes
+    */
     class _OrxonoxExport CollisionShape : public BaseObject, public Synchronisable
     {
@@ -46,50 +63,132 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
 
+            /**
+            @brief Set the position of the CollisionShape.
+                   If the position changes, this causes the parent CompoundCollisionShape (if there is one) to be updated.
+            @param position A vector indicating the new position.
+            */
             inline void setPosition(const Vector3& position)
-                { this->position_ = position; this->updateParent(); }
+                { if(this->position_ == position) return; this->position_ = position; this->updateParent(); }
+            /**
+            @brief Get the position of the CollisionShape.
+            @return Returns the position of the CollisionShape as a vector.
+            */
             inline const Vector3& getPosition() const
                 { return this->position_; }
 
+            /**
+            @brief Set the orientation of the CollisionShape.
+                   If the orientation changes, this causes the parent CompoundCollisionShape (if there is one) to be updated.
+            @param orientation A quaternion indicating the new orientation.
+            */
             inline void setOrientation(const Quaternion& orientation)
-                { this->orientation_ = orientation; this->updateParent(); }
+                { if(this->orientation_ == orientation) return; this->orientation_ = orientation; this->updateParent(); }
+            /**
+            @brief Get the orientation of the CollisionShape.
+            @return Returns the orientation of the CollisionShape as a quaternion.
+            */
             inline const Quaternion& getOrientation() const
                 { return this->orientation_; }
 
-            void yaw(const Degree& angle)   { this->setOrientation(this->orientation_ * Quaternion(angle, Vector3::UNIT_Y)); }
-            void pitch(const Degree& angle) { this->setOrientation(this->orientation_ * Quaternion(angle, Vector3::UNIT_X)); }
-            void roll(const Degree& angle)  { this->setOrientation(this->orientation_ * Quaternion(angle, Vector3::UNIT_Z)); }
+            /**
+            @brief Rotate the CollisionShape around the y-axis by the specified angle.
+                   If the orientation changes, this causes the parent CompoundCollisionShape (if there is one) to be updated.
+            @param angle The angle by which the CollisionShape is rotated.
+            */
+            void yaw(const Degree& angle)
+                { this->setOrientation(this->orientation_ * Quaternion(angle, Vector3::UNIT_Y)); }
+            /**
+            @brief Rotate the CollisionShape around the x-axis by the specified angle.
+                   If the orientation changes, this causes the parent CompoundCollisionShape (if there is one) to be updated.
+            @param angle The angle by which the CollisionShape is rotated.
+            */
+            void pitch(const Degree& angle)
+                { this->setOrientation(this->orientation_ * Quaternion(angle, Vector3::UNIT_X)); }
+            /**
+            @brief Rotate the CollisionShape around the z-axis by the specified angle.
+                   If the orientation changes, this causes the parent CompoundCollisionShape (if there is one) to be updated.
+            @param angle The angle by which the CollisionShape is rotated.
+            */
+            void roll(const Degree& angle)
+                { this->setOrientation(this->orientation_ * Quaternion(angle, Vector3::UNIT_Z)); }
 
-            virtual void setScale3D(const Vector3& scale);
-            virtual void setScale(float scale);
+            /**
+            @brief Scale the CollisionShape by the input vector.
+                   Since the scale is a vector the CollisionShape can be scaled independently in each direction, allowing for linear distortions.
+                   If the scale changes, this causes the parent CompoundCollisionShape (if there is one) to be updated.
+                   Beware, non-uniform scaling (i.e. distortions) might not be supported by all CollisionShapes.
+            @param scale The scaling vector by which the CollisionShape is scaled.
+            */
+            inline void scale3D(const Vector3& scale)
+                { this->setScale3D(this->getScale3D()*scale); }
+            void setScale3D(const Vector3& scale); // Set the scale of the CollisionShape.
+            /**
+            @brief Get the scale of the CollisionShape.
+            @return Returns a vector indicating the scale of the CollisionShape.
+            */
             inline const Vector3& getScale3D() const
                 { return this->scale_; }
 
-            void updateShape();
+            /**
+            @brief (Uniformly) scale the CollisionShape by the input scale.
+                   If the scale changes, this causes the parent CompoundCollisionShape (if there is one) to be updated.
+            @param scale The value by which the CollisionShape is scaled.
+            */
+            inline void scale(float scale)
+                { this->setScale3D(this->getScale3D()*scale); }
+            void setScale(float scale); // Set the (uniform) scale of the CollisionShape.
+            /**
+            @brief Get the (uniform) scale of the CollisionShape.
+                   This is only meaningful if the CollisionShape has uniform scaling.
+            @return Returns the (uniform) scale of the CollisionShape. Returns 0.0f if the scaling is non-uniform.
+            */
+            inline float getScale()
+                { if(this->hasUniformScaling()) return this->scale_.x; return 0.0f; }
 
-            void calculateLocalInertia(float mass, btVector3& inertia) const;
+            /**
+            @brief Check whether the CollisionShape is uniformly scaled.
+            @return Returns true if the CollisionShape is uniformly scaled, false if not.
+            */
+            inline bool hasUniformScaling()
+                { return this->uniformScale_; }
+            virtual void changedScale(); // Is called when the scale of the CollisionShape has changed.
 
+            void updateShape(); // Updates the shape.
+
+            void calculateLocalInertia(float mass, btVector3& inertia) const; // Calculates the local inertia of the collision shape.
+
+            /**
+            @brief Get the bullet collision shape of this CollisionShape.
+            @return Returns a pointer to the bullet collision shape of this CollisionShape.
+            */
             inline btCollisionShape* getCollisionShape() const
                 { return this->collisionShape_; }
 
-            bool hasTransform() const;
+            bool hasTransform() const; // Check whether the CollisionShape has been either moved or rotated or both.
 
-            bool notifyBeingAttached(CompoundCollisionShape* newParent);
-            void notifyDetached();
+            bool notifyBeingAttached(CompoundCollisionShape* newParent); // Notifies the CollisionShape of being attached to a CompoundCollisionShape.
+            void notifyDetached(); // Notifies the CollisionShape of being detached from a CompoundCollisionShape.
 
         protected:
-            virtual void updateParent();
-            virtual void parentChanged();
+            virtual void updateParent(); // Updates the CompoundCollisionShape the CollisionShape belongs to, after the CollisionShape has changed.
+            virtual void parentChanged(); // Is called when the parentID of the CollisionShape has changed.
+
+            /**
+            @brief Create a new bullet collision shape depending on the internal parameters of the specific CollisionShape.
+            @return Returns a pointer to the new bullet collision shape.
+            */
             virtual btCollisionShape* createNewShape() const = 0;
 
-            btCollisionShape*       collisionShape_;
-            CompoundCollisionShape* parent_;
-            unsigned int            parentID_;
+            btCollisionShape*       collisionShape_; //!< The bullet collision shape of this CollisionShape.
+            CompoundCollisionShape* parent_; //!< The CompoundCollisionShape this CollisionShape belongs to, NULL if it doesn't belong to one.
+            unsigned int            parentID_; //!< The objectID of the parent of this CollisionShape, which can either be a CompoundCollisionShape or a WorldEntity.
 
         private:
             void registerVariables();
 
-            Vector3                 position_;
-            Quaternion              orientation_;
-            Vector3                 scale_;
+            Vector3                 position_; //!< The position of the CollisionShape.
+            Quaternion              orientation_; //!< The orientation of the CollisionShape.
+            Vector3                 scale_; //!< The scale of the CollisionShape.
+            bool                    uniformScale_; //!< Whether the scale is uniform.
     };
 }
Index: code/branches/pickup/src/orxonox/collisionshapes/CompoundCollisionShape.cc
===================================================================
--- code/branches/pickup/src/orxonox/collisionshapes/CompoundCollisionShape.cc	(revision 8381)
+++ code/branches/pickup/src/orxonox/collisionshapes/CompoundCollisionShape.cc	(revision 8422)
@@ -27,4 +27,9 @@
  */
 
+/**
+    @file CompoundCollisionShape.cc
+    @brief Implementation of the CompoundCollisionShape class.
+*/
+
 #include "CompoundCollisionShape.h"
 
@@ -39,4 +44,8 @@
     CreateFactory(CompoundCollisionShape);
 
+    /**
+    @brief
+        Constructor. Registers and initializes the object.
+    */
     CompoundCollisionShape::CompoundCollisionShape(BaseObject* creator) : CollisionShape(creator)
     {
@@ -46,4 +55,9 @@
     }
 
+    /**
+    @brief
+        Destructor.
+        Deletes all its children.
+    */
     CompoundCollisionShape::~CompoundCollisionShape()
     {
@@ -70,8 +84,16 @@
     }
 
+    /**
+    @brief
+        Attach the input CollisionShape to the CompoundCollisionShape.
+    @param shape
+        A pointer to the CollisionShape that is to be attached.
+    */
     void CompoundCollisionShape::attach(CollisionShape* shape)
     {
+        // If either the input shape is NULL or we try to attach the CollisionShape to itself.
         if (!shape || static_cast<CollisionShape*>(this) == shape)
             return;
+
         if (this->attachedShapes_.find(shape) != this->attachedShapes_.end())
         {
@@ -80,13 +102,16 @@
         }
 
+        // Notify the CollisionShape that it is being attached to the CompoundCollisionShape.
         if (!shape->notifyBeingAttached(this))
             return;
 
+        // Attach it.
         this->attachedShapes_[shape] = shape->getCollisionShape();
 
+        // Only actually attach if we didn't pick a CompoundCollisionShape with no content.
         if (shape->getCollisionShape())
         {
-            // Only actually attach if we didn't pick a CompoundCollisionShape with no content
             btTransform transf(multi_cast<btQuaternion>(shape->getOrientation()), multi_cast<btVector3>(shape->getPosition()));
+            // Add the btCollisionShape of the CollisionShape as a child shape to the btCompoundShape of the CompoundCollisionShape.
             this->compoundShape_->addChildShape(transf, shape->getCollisionShape());
 
@@ -95,11 +120,18 @@
     }
 
+    /**
+    @brief
+        Detach the input CollisionShape form the CompoundCollisionShape.
+    @param shape
+        A pointer to the CollisionShape to be detached.
+    */
     void CompoundCollisionShape::detach(CollisionShape* shape)
     {
+        // If the input CollisionShape is actually attached.
         if (this->attachedShapes_.find(shape) != this->attachedShapes_.end())
         {
             this->attachedShapes_.erase(shape);
             if (shape->getCollisionShape())
-                this->compoundShape_->removeChildShape(shape->getCollisionShape());
+                this->compoundShape_->removeChildShape(shape->getCollisionShape()); // TODO: Apparently this is broken?
             shape->notifyDetached();
 
@@ -110,4 +142,8 @@
     }
 
+    /**
+    @brief
+        Detach all attached CollisionShapes.
+    */
     void CompoundCollisionShape::detachAll()
     {
@@ -116,9 +152,18 @@
     }
 
+    /**
+    @brief
+        Update the input CollisionShape that is attached to the CompoundCollisionShape.
+        This is called when the input shape's internal collision shape (a btCollisionShape) has changed.
+    @param shape
+        A pointer to the CollisionShape to be updated.
+    */
     void CompoundCollisionShape::updateAttachedShape(CollisionShape* shape)
     {
         if (!shape)
             return;
+
         std::map<CollisionShape*, btCollisionShape*>::iterator it = this->attachedShapes_.find(shape);
+        // Check whether the input shape belongs to this CompoundCollisionShape.
         if (it == this->attachedShapes_.end())
         {
@@ -129,8 +174,9 @@
         // Remove old btCollisionShape, stored in the children map
         if (it->second)
-            this->compoundShape_->removeChildShape(it->second);
+            this->compoundShape_->removeChildShape(it->second); // TODO: Apparently this is broken?
+
+        // Only actually attach if we didn't pick a CompoundCollisionShape with no content
         if (shape->getCollisionShape())
         {
-            // Only actually attach if we didn't pick a CompoundCollisionShape with no content
             btTransform transf(multi_cast<btQuaternion>(shape->getOrientation()), multi_cast<btVector3>(shape->getPosition()));
             this->compoundShape_->addChildShape(transf, shape->getCollisionShape());
@@ -141,42 +187,57 @@
     }
 
+    /**
+    @brief
+        Updates the public shape, the collision shape this CompoundCollisionShape has to the outside.
+    */
     void CompoundCollisionShape::updatePublicShape()
     {
-        btCollisionShape* primitive = 0;
-        bool bPrimitive = true;
-        bool bEmpty = true;
+        btCollisionShape* primitive = 0; // The primitive shape, if there is one.
+        bool bPrimitive = true; // Whether the CompoundCollisionShape has just one non-empty CollisionShape. And that shape also has no transformation.
+        bool bEmpty = true; // Whether the CompoundCollisionShape is empty.
+        // Iterate over all CollisionShapes that belong to this CompoundCollisionShape.
         for (std::map<CollisionShape*, btCollisionShape*>::const_iterator it = this->attachedShapes_.begin(); it != this->attachedShapes_.end(); ++it)
         {
+            // TODO: Make sure this is correct.
             if (it->second)
             {
                 bEmpty = false;
-                if (!it->first->hasTransform() && !bPrimitive)
+                if (!it->first->hasTransform() && bPrimitive)
                     primitive = it->second;
                 else
+                {
                     bPrimitive = false;
+                    break;
+                }
             }
         }
+
+        // If there is no non-empty CollisionShape.
         if (bEmpty)
         {
+            // If there was none all along, nothing needs to be changed.
             if (this->collisionShape_ == 0)
-            {
-                this->collisionShape_ = 0;
                 return;
-            }
             this->collisionShape_ = 0;
         }
+        // If the CompoundCollisionShape is just a primitive.
+        // Only one shape to be added, no transform; return it directly.
         else if (bPrimitive)
-        {
-            // --> Only one shape to be added, no transform; return it directly
             this->collisionShape_ = primitive;
-        }
+        // Make sure we use the compound shape when returning a btCollisionShape.
         else
-        {
-            // Make sure we use the compound shape when returning a btCollisionShape
             this->collisionShape_ = this->compoundShape_;
-        }
+
         this->updateParent();
     }
 
+    /**
+    @brief
+        Get the attached CollisionShape at the given index.
+    @param index
+        The index of the desired CollisionShape.
+    @return
+        Returns a pointer to the attached CollisionShape at the given index.
+    */
     CollisionShape* CompoundCollisionShape::getAttachedShape(unsigned int index) const
     {
@@ -190,3 +251,23 @@
         return 0;
     }
+
+    /**
+    @brief
+        Is called when the scale of the CompoundCollisionShape has changed.
+        Iterates over all attached CollisionShapes and scales them, then recomputes their compound shape.
+    */
+    void CompoundCollisionShape::changedScale()
+    {
+        CollisionShape::changedScale();
+
+        // Iterate through all attached CollisionShapes.
+        for(std::map<CollisionShape*, btCollisionShape*>::const_iterator it = this->attachedShapes_.begin(); it != this->attachedShapes_.end(); it++)
+        {
+            // Rescale the CollisionShape.
+            it->first->setScale3D(this->getScale3D());
+            this->updateAttachedShape(it->first);
+        }
+
+        this->updatePublicShape();
+    }
 }
Index: code/branches/pickup/src/orxonox/collisionshapes/CompoundCollisionShape.h
===================================================================
--- code/branches/pickup/src/orxonox/collisionshapes/CompoundCollisionShape.h	(revision 8381)
+++ code/branches/pickup/src/orxonox/collisionshapes/CompoundCollisionShape.h	(revision 8422)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file CompoundCollisionShape.h
+    @brief Definition of the CompoundCollisionShape class.
+    @ingroup Collisionshapes
+*/
+
 #ifndef _CompoundCollisionShape_H__
 #define _CompoundCollisionShape_H__
@@ -38,4 +44,14 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for the bullet compound collision shape class btCompoundShape.
+
+    @author
+        Reto Grieder
+
+    @ingroup Collisionshapes
+    */
     class _OrxonoxExport CompoundCollisionShape : public CollisionShape
     {
@@ -53,4 +69,6 @@
             void updateAttachedShape(CollisionShape* shape);
 
+            virtual void changedScale();
+
         private:
             void updatePublicShape();
Index: code/branches/pickup/src/orxonox/worldentities/WorldEntity.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/WorldEntity.cc	(revision 8381)
+++ code/branches/pickup/src/orxonox/worldentities/WorldEntity.cc	(revision 8422)
@@ -642,13 +642,10 @@
     void WorldEntity::setScale3D(const Vector3& scale)
     {
-/*
-HACK HACK HACK
-        if (bScalePhysics && this->hasPhysics() && scale != Vector3::UNIT_SCALE)
-        {
-            CCOUT(2) << "Warning: Cannot set the scale of a physical object: Not yet implemented. Ignoring scaling." << std::endl;
-            return;
-        }
-HACK HACK HACK
-*/
+        // If physics is enabled scale the attached CollisionShape.
+        if (false && this->hasPhysics() && this->collisionShape_ != NULL)
+        {
+            this->collisionShape_->setScale3D(scale);
+        }
+
         this->node_->setScale(scale);
 
