Index: code/branches/pickup/data/levels/pickups.oxw
===================================================================
--- code/branches/pickup/data/levels/pickups.oxw	(revision 8533)
+++ code/branches/pickup/data/levels/pickups.oxw	(revision 8534)
@@ -192,5 +192,5 @@
     <PickupSpawner position="-30,-30,-30" respawnTime="60" triggerDistance="20" maxSpawnedItems="5">
       <pickup>
-        <ShrinkPickup />
+        <ShrinkPickup shrinkFactor = "5.0" duration = "5.0" shrinkSpeed = "5.0"/>
       </pickup>
     </PickupSpawner>
Index: code/branches/pickup/src/modules/pickup/items/ShrinkPickup.cc
===================================================================
--- code/branches/pickup/src/modules/pickup/items/ShrinkPickup.cc	(revision 8533)
+++ code/branches/pickup/src/modules/pickup/items/ShrinkPickup.cc	(revision 8534)
@@ -51,4 +51,8 @@
     CreateFactory(ShrinkPickup);
 
+		/**
+    @brief
+        Constructor: Initializes the Pickup.
+    */
     ShrinkPickup::ShrinkPickup(BaseObject* creator) : Pickup(creator)
     {
@@ -56,7 +60,4 @@
 
         this->initialize();
-        shrinkFactor_ = 5.0;
-        duration_ = 5.0;
-        shrinkSpeed_ = 5.0;
         isActive_ = false;
         isTerminating_ = false;
@@ -68,4 +69,73 @@
     }
 
+    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 HealthPickup 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)
     {
@@ -73,4 +143,8 @@
     }
 
+		/**
+    @brief
+        Prepares for shrinking (collecting several informations).
+    */
     void ShrinkPickup::changedUsed(void)
     {
@@ -83,4 +157,5 @@
                 this->Pickupable::destroy();
 
+            //Collect scaling information.
             defaultScale_ = this->pawn->getScale3D();
             defaultMass_ = this->pawn->getMass();
@@ -94,12 +169,18 @@
             cameraPositions_ = this->pawn->getCameraPositions();
             size_ = cameraPositions_.size();
-            isActive_ = true;
-            durationTimer.setTimer(duration_, false, createExecutor(createFunctor(&ShrinkPickup::terminate, this)));
+            isActive_ = true;    //start shrinking now.
+            durationTimer.setTimer(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(isActive_ == true && actualScale_ > smallScale_)
+        if(isActive_ == true && actualScale_ > smallScale_)    //if the ship has not reached the target scale, continue shrinking
         {
             float factor_ = 1 + dt*shrinkSpeed_;
@@ -121,5 +202,5 @@
         else isActive_ = false;
 
-        if(isTerminating_ == true && actualScale_ < defaultScale_)
+        if(isTerminating_ == true && actualScale_ < defaultScale_)    //grow until the ship reaches its default scale.
         {
             float factor_ = 1 + dt*shrinkSpeed_;
@@ -144,4 +225,8 @@
     }
 
+	/**
+    @brief
+        Initializes the termination.
+    */
     void ShrinkPickup::terminate(void)
     {
@@ -171,4 +256,10 @@
 
         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/pickup/src/modules/pickup/items/ShrinkPickup.h
===================================================================
--- code/branches/pickup/src/modules/pickup/items/ShrinkPickup.h	(revision 8533)
+++ code/branches/pickup/src/modules/pickup/items/ShrinkPickup.h	(revision 8534)
@@ -59,29 +59,40 @@
             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.
-			void tick(float dt);
+            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_;
-			bool isActive_;
-			bool isTerminating_;
-			int size_;
-			std::list<SmartPtr<CameraPosition> > cameraPositions_;
-			float defaultCameraPos_;
-			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);
-
+            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);
     };
 }
