Index: code/branches/presentation/src/modules/objects/collisionshapes/BoxCollisionShape.cc
===================================================================
--- code/branches/presentation/src/modules/objects/collisionshapes/BoxCollisionShape.cc	(revision 8499)
+++ code/branches/presentation/src/modules/objects/collisionshapes/BoxCollisionShape.cc	(revision 8556)
@@ -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/presentation/src/modules/objects/collisionshapes/BoxCollisionShape.h
===================================================================
--- code/branches/presentation/src/modules/objects/collisionshapes/BoxCollisionShape.h	(revision 8499)
+++ code/branches/presentation/src/modules/objects/collisionshapes/BoxCollisionShape.h	(revision 8556)
@@ -43,4 +43,15 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for the bullet box collision shape class btBoxShape.
+
+    @author
+        Reto Grieder
+
+    @see btBoxShape
+    @ingroup Collisionshapes
+    */
     class _ObjectsExport BoxCollisionShape : public CollisionShape
     {
@@ -51,30 +62,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/presentation/src/modules/objects/collisionshapes/ConeCollisionShape.cc
===================================================================
--- code/branches/presentation/src/modules/objects/collisionshapes/ConeCollisionShape.cc	(revision 8499)
+++ code/branches/presentation/src/modules/objects/collisionshapes/ConeCollisionShape.cc	(revision 8556)
@@ -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/presentation/src/modules/objects/collisionshapes/ConeCollisionShape.h
===================================================================
--- code/branches/presentation/src/modules/objects/collisionshapes/ConeCollisionShape.h	(revision 8499)
+++ code/branches/presentation/src/modules/objects/collisionshapes/ConeCollisionShape.h	(revision 8556)
@@ -41,4 +41,15 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for the bullet cone collision shape class btConeShape.
+
+    @author
+        Reto Grieder
+
+    @see btConeShape
+    @ingroup Collisionshapes
+    */
     class _ObjectsExport ConeCollisionShape : public CollisionShape
     {
@@ -49,21 +60,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/presentation/src/modules/objects/collisionshapes/PlaneCollisionShape.cc
===================================================================
--- code/branches/presentation/src/modules/objects/collisionshapes/PlaneCollisionShape.cc	(revision 8499)
+++ code/branches/presentation/src/modules/objects/collisionshapes/PlaneCollisionShape.cc	(revision 8556)
@@ -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/presentation/src/modules/objects/collisionshapes/PlaneCollisionShape.h
===================================================================
--- code/branches/presentation/src/modules/objects/collisionshapes/PlaneCollisionShape.h	(revision 8499)
+++ code/branches/presentation/src/modules/objects/collisionshapes/PlaneCollisionShape.h	(revision 8556)
@@ -43,4 +43,15 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for the bullet plane collision shape class btStaticPlaneShape.
+
+    @author
+        Martin Stypinski
+
+    @see btStaticPlaneShape
+    @ingroup Collisionshapes
+    */
     class _ObjectsExport PlaneCollisionShape : public CollisionShape
     {
@@ -51,21 +62,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/presentation/src/modules/objects/collisionshapes/SphereCollisionShape.cc
===================================================================
--- code/branches/presentation/src/modules/objects/collisionshapes/SphereCollisionShape.cc	(revision 8499)
+++ code/branches/presentation/src/modules/objects/collisionshapes/SphereCollisionShape.cc	(revision 8556)
@@ -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/presentation/src/modules/objects/collisionshapes/SphereCollisionShape.h
===================================================================
--- code/branches/presentation/src/modules/objects/collisionshapes/SphereCollisionShape.h	(revision 8499)
+++ code/branches/presentation/src/modules/objects/collisionshapes/SphereCollisionShape.h	(revision 8556)
@@ -41,4 +41,15 @@
 namespace orxonox
 {
+
+    /**
+    @brief
+        Wrapper for the bullet sphere collision shape class btSphereShape.
+
+    @author
+        Reto Grieder
+
+    @see btSphereShape
+    @ingroup Collisionshapes
+    */
     class _ObjectsExport SphereCollisionShape : public CollisionShape
     {
@@ -49,8 +60,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 +82,5 @@
             btCollisionShape* createNewShape() const;
 
-            float radius_;
+            float radius_; //!< The radius of the SphereCollisionShape.
     };
 }
Index: code/branches/presentation/src/modules/pickup/PickupPrereqs.h
===================================================================
--- code/branches/presentation/src/modules/pickup/PickupPrereqs.h	(revision 8499)
+++ code/branches/presentation/src/modules/pickup/PickupPrereqs.h	(revision 8556)
@@ -85,4 +85,5 @@
     class SpeedPickup;
     class ShieldPickup;
+    class ShrinkPickup;
 
 }
Index: code/branches/presentation/src/modules/pickup/items/CMakeLists.txt
===================================================================
--- code/branches/presentation/src/modules/pickup/items/CMakeLists.txt	(revision 8499)
+++ code/branches/presentation/src/modules/pickup/items/CMakeLists.txt	(revision 8556)
@@ -6,3 +6,4 @@
   SpeedPickup.cc
   ShieldPickup.cc
+  ShrinkPickup.cc
 )
Index: code/branches/presentation/src/modules/pickup/items/ShrinkPickup.cc
===================================================================
--- code/branches/presentation/src/modules/pickup/items/ShrinkPickup.cc	(revision 8556)
+++ code/branches/presentation/src/modules/pickup/items/ShrinkPickup.cc	(revision 8556)
@@ -0,0 +1,278 @@
+/*
+ *   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:
+ *      Damian 'Mozork' Frick
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+
+/**
+    @file ShrinkPickup.cc
+    @brief Implementation of the HealthPickup class.
+*/
+
+
+#include "ShrinkPickup.h"
+
+#include <sstream>
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+
+#include "pickup/PickupIdentifier.h"
+#include "worldentities/pawns/Pawn.h"
+
+#include "weaponsystem/WeaponSlot.h"
+#include "weaponsystem/Weapon.h"
+#include "worldentities/CameraPosition.h"
+
+namespace orxonox
+{
+    CreateFactory(ShrinkPickup);
+
+        /**
+    @brief
+        Constructor: Initializes the Pickup.
+    */
+    ShrinkPickup::ShrinkPickup(BaseObject* creator) : Pickup(creator)
+    {
+        RegisterObject(ShrinkPickup);
+
+        this->initialize();
+        this->shrinkFactor_ = 5.0f;
+        this->shrinkSpeed_ = 5.0f;
+        this->duration_ = 5.0f;
+        this->isActive_ = false;
+        this->isTerminating_ = false;
+
+        this->size_ = 0;
+        this->defaultCameraPos_ = 0.0f;
+        this->defaultScale_ = Vector3::UNIT_SCALE;
+        this->actualScale_ = Vector3::UNIT_SCALE;
+        this->smallScale_ = Vector3::UNIT_SCALE;
+        this->defaultMass_ = 1.0f;
+        this->actualMass_ = 1.0f;
+        this->smallMass_ = 1.0f;
+        this->pawn_ = NULL;
+    }
+
+    ShrinkPickup::~ShrinkPickup()
+    {
+
+    }
+
+    void ShrinkPickup::initializeIdentifier(void)
+    {
+        std::stringstream stream;
+        stream << this->getShrinkFactor();
+        std::string type1 = "shrinkFactor";
+        std::string val1 = stream.str();
+        this->pickupIdentifier_->addParameter(type1, val1);
+
+        stream.clear();
+        stream << this->getDuration();
+        std::string val2 = stream.str();
+        std::string type2 = "duration";
+        this->pickupIdentifier_->addParameter(type2, val2);
+
+        stream.clear();
+        stream << this->getShrinkSpeed();
+        std::string val3 = stream.str();
+        std::string type3 = "shrinkSpeed";
+        this->pickupIdentifier_->addParameter(type3, val3);
+    }
+
+   /**
+    @brief
+        Method for creating a ShrinkhPickup object through XML.
+    */
+    void ShrinkPickup::XMLPort(Element& xmlelement, orxonox::XMLPort::Mode mode)
+    {
+        SUPER(ShrinkPickup, XMLPort, xmlelement, mode);
+
+        XMLPortParam(ShrinkPickup, "shrinkFactor", setShrinkFactor, getShrinkFactor, xmlelement, mode);
+        XMLPortParam(ShrinkPickup, "duration", setDuration, getDuration, xmlelement, mode);
+        XMLPortParam(ShrinkPickup, "shrinkSpeed", setShrinkSpeed, getShrinkSpeed, xmlelement, mode);
+
+        this->initializeIdentifier();
+    }
+
+    /**
+    @brief
+        Sets the shrinking factor.
+    @param factor
+        The factor.
+    */
+    void ShrinkPickup::setShrinkFactor(float factor)
+    {
+        this->shrinkFactor_ = factor;
+    }
+
+    /**
+    @brief
+        Sets the duration.
+    @param duration
+        The duration.
+    */
+    void ShrinkPickup::setDuration(float duration)
+    {
+        this->duration_ = duration;
+    }
+
+    /**
+    @brief
+        Sets the shrinking speed.
+    @param speed
+        The speed.
+    */
+    void ShrinkPickup::setShrinkSpeed(float speed)
+    {
+        this->shrinkSpeed_ = speed;
+    }
+
+    void ShrinkPickup::initialize(void)
+    {
+        this->addTarget(ClassIdentifier<Pawn>::getIdentifier());
+    }
+
+    /**
+    @brief
+        Prepares for shrinking (collecting several informations).
+    */
+    void ShrinkPickup::changedUsed(void)
+    {
+        SUPER(ShrinkPickup, changedUsed);
+
+        if(this->isUsed())
+        {
+            this->pawn_ = this->carrierToPawnHelper();
+            if(this->pawn_ == NULL) // If the PickupCarrier is no Pawn, then this pickup is useless and therefore is destroyed.
+                this->Pickupable::destroy();
+
+            //Collect scaling information.
+            this->defaultScale_ = this->pawn_->getScale3D();
+            this->defaultMass_ = this->pawn_->getMass();
+
+            this->smallScale_ = this->defaultScale_ / this->shrinkFactor_;
+            this->smallMass_ = this->defaultMass_ / this->shrinkFactor_;
+
+            this->actualScale_ = this->defaultScale_;
+            this->actualMass_ = this->defaultMass_;
+
+            this->cameraPositions_ = this->pawn_->getCameraPositions();
+            this->size_ = this->cameraPositions_.size();
+            this->isActive_ = true;    //start shrinking now.
+            this->durationTimer_.setTimer(this->duration_, false, createExecutor(createFunctor(&ShrinkPickup::terminate, this)));    //Set timer for termination.
+        }
+    }
+
+    /**
+    @brief
+        Updates the scales of the ship.
+    @param dt
+        Time since last call.
+    */
+    void ShrinkPickup::tick(float dt)
+    {
+        if(this->isActive_ == true && this->actualScale_ > this->smallScale_)    //if the ship has not reached the target scale, continue shrinking
+        {
+            float factor = 1 + dt*this->shrinkSpeed_;
+
+            this->actualScale_ /= factor;
+            this->actualMass_ /= factor;
+
+            this->pawn_->setScale3D(this->actualScale_);
+            this->pawn_->setMass(this->actualMass_);
+
+            for(int index = 0; index < this->size_; index++)
+            {
+                CameraPosition* cameraPos = this->pawn_->getCameraPosition(index);
+                if(cameraPos == NULL)
+                continue;
+                cameraPos->setPosition(cameraPos->getPosition()*factor);
+            }
+        }
+        else this->isActive_ = false;
+
+        if(this->isTerminating_ == true && this->actualScale_ < this->defaultScale_)    //grow until the ship reaches its default scale.
+        {
+            float factor = 1 + dt*this->shrinkSpeed_;
+
+            this->actualScale_ *= factor;
+            this->actualMass_ *= factor;
+
+            this->pawn_->setScale3D(this->actualScale_);
+            this->pawn_->setMass(this->actualMass_);
+
+            for(int index = 0; index < this->size_; index++)
+            {
+                CameraPosition* cameraPos = this->pawn_->getCameraPosition(index);
+                if(cameraPos == NULL)
+                continue;
+                cameraPos->setPosition(cameraPos->getPosition()/factor);
+            }
+        }
+        else if(this->isTerminating_ == true)
+            this->Pickupable::destroy();
+
+    }
+
+    /**
+    @brief
+        Initializes the termination.
+    */
+    void ShrinkPickup::terminate(void)
+    {
+        this->isActive_ = false;
+        this->isTerminating_ = true;
+        setUsed(false);
+    }
+
+    Pawn* ShrinkPickup::carrierToPawnHelper(void)
+    {
+        PickupCarrier* carrier = this->getCarrier();
+        Pawn* pawn = dynamic_cast<Pawn*>(carrier);
+
+        return pawn;
+    }
+
+    /**
+    @brief
+        Creates a duplicate of the input OrxonoxClass.
+    @param item
+        A pointer to the Orxonox class.
+    */
+    void ShrinkPickup::clone(OrxonoxClass*& item)
+    {
+        if(item == NULL)
+            item = new ShrinkPickup(this);
+
+        SUPER(ShrinkPickup, clone, item);
+        ShrinkPickup* pickup = dynamic_cast<ShrinkPickup*>(item);
+        pickup->setShrinkFactor(this->getShrinkFactor());
+        pickup->setDuration(this->getDuration());
+        pickup->setShrinkSpeed(this->getShrinkSpeed());
+
+        pickup->initializeIdentifier();
+    }
+}
Index: code/branches/presentation/src/modules/pickup/items/ShrinkPickup.h
===================================================================
--- code/branches/presentation/src/modules/pickup/items/ShrinkPickup.h	(revision 8556)
+++ code/branches/presentation/src/modules/pickup/items/ShrinkPickup.h	(revision 8556)
@@ -0,0 +1,124 @@
+/*
+ *   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:
+ *      Damian 'Mozork' Frick
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+/**
+    @file ShrinkPickup.h
+    @brief Declaration of the ShrinkPickup class.
+    @ingroup PickupItems
+*/
+
+
+#ifndef _ShrinkPickup_H__
+#define _ShrinkPickup_H__
+
+#include "pickup/PickupPrereqs.h"
+
+#include <string>
+#include <vector>
+
+#include "pickup/Pickup.h"
+#include "tools/interfaces/Tickable.h"
+
+namespace orxonox {
+
+    /**
+    @author
+        Sandro Sgier
+
+    @ingroup PickupItems
+    */
+
+    /**
+    @brief
+        The ShrinkPickup is a Pickupable that causes the pawn to shrink to a certain size for a certain time with a certain speed, all of them specified in the following variables:
+        - The @b shrinkFactor It determines how much the ship is going to shrink (e.g. the factor 2 would make the ship shrinking to half its size).
+        - The @b duration Specifies how long the ship will keep small.
+        - The @b shrinkSpeed Defines how fast the ship shrinks and grows.
+
+
+        An example of a XML implementation of a HealthPickup would be:
+        @code
+        <HealthPickup
+            shrinkFactor = "5.0"
+            duration = "5.0"
+            shrinkSpeed = "5.0"
+        />
+        @endcode
+
+    @author
+        Sandro Sgier
+
+    @ingroup PickupItems
+    */
+
+    class _PickupExport ShrinkPickup : public Pickup, public Tickable
+    {
+        public:
+            ShrinkPickup(BaseObject* creator); //!< Constructor.
+            virtual ~ShrinkPickup(); //!< Destructor.
+            virtual void changedUsed(void); //!< Is called when the pickup has transited from used to unused or the other way around.
+            virtual void clone(OrxonoxClass*& item); //!< Creates a duplicate of the input OrxonoxClass.
+            virtual void XMLPort(Element& xmlelement, orxonox::XMLPort::Mode mode);
+            inline float getShrinkFactor(void) const
+                { return this->shrinkFactor_; }
+            inline float getDuration(void) const
+                { return this->duration_; }
+            inline float getShrinkSpeed(void) const
+                { return this->shrinkSpeed_; }
+            void setShrinkFactor(float factor);
+            void setDuration(float duration);
+            void setShrinkSpeed(float speed);
+            void tick(float dt);
+
+        protected:
+            void initializeIdentifier(void);
+
+        private:
+            void initialize(void);
+            float duration_;            //!< determines how long the pickup will be active
+            float shrinkFactor_;        //shrink factor of the space ship
+            float shrinkSpeed_;         //speed of shrinking
+            bool isActive_;             //true if ship is shrinking or small
+            bool isTerminating_;        //true if ship is growing
+            int size_;                  //number of camera positions
+            std::list<SmartPtr<CameraPosition> > cameraPositions_;
+            float defaultCameraPos_;    //all default, actual and small values...
+            Ogre::Vector3 defaultScale_;
+            Ogre::Vector3 actualScale_;
+            Ogre::Vector3 smallScale_;
+            float defaultMass_;
+            float actualMass_;
+            float smallMass_;            
+            Pawn* carrierToPawnHelper(void);
+            Pawn* pawn_;
+            Timer durationTimer_;
+            void terminate(void);
+    };
+}
+
+#endif
