Index: /code/branches/pickup3/src/modules/pickup/DroppedItem.cc
===================================================================
--- /code/branches/pickup3/src/modules/pickup/DroppedItem.cc	(revision 6420)
+++ /code/branches/pickup3/src/modules/pickup/DroppedItem.cc	(revision 6421)
@@ -29,16 +29,10 @@
 #include "DroppedItem.h"
 
-#include "util/Math.h"
 #include "core/CoreIncludes.h"
-#include "core/Executor.h"
-#include "BaseItem.h"
-#include "graphics/Billboard.h"
+#include "interfaces/Pickupable.h"
 #include "graphics/Model.h"
-#include "worldentities/pawns/Pawn.h"
 
 namespace orxonox
 {
-    CreateFactory(DroppedItem); //TODO: This isn't needed, is it?
-
     /**
     @brief
@@ -47,11 +41,19 @@
     DroppedItem::DroppedItem(BaseObject* creator) : PickupSpawner(creator)
     {
-        RegisterObject(DroppedItem);
+        this->initialize();
     }
 
-    DroppedItem::DroppedItem(BaseObject* creator, BaseItem* item, float triggerDistance, float respawnTime, int maxSpawnedItems) : PickupSpawner(creator, item, triggerDistance, respawnTime, maxSpawnedItems)
+    DroppedItem::DroppedItem(BaseObject* creator, Pickupable* item, const Vector3& position, float triggerDistance) : PickupSpawner(creator, item, triggerDistance, 0, 1)
+    {   
+        this->initialize();
+        
+        this->createDrop(position);
+    }
+    
+    void DroppedItem::initialize(void)
     {
         RegisterObject(DroppedItem);
-        this->item_ = item;
+        
+        this->gotPickedUp_ = false;
     }
 
@@ -62,53 +64,58 @@
     DroppedItem::~DroppedItem()
     {
-        
+        if(this->gotPickedUp_ && this->pickup_ != NULL)
+        {
+            this->pickup_ = NULL;
+        }
     }
 
-    BaseItem* DroppedItem::getItem(void)
+    Pickupable* DroppedItem::getPickup(void)
     {
-        return this->item_;
+        return this->pickup_;
+    }
+    
+    void DroppedItem::createDrop(const Vector3& position)
+    {
+        this->setPosition(position);
+        
+        //TODO: Make this work.
+        //const Model& model = PickupManager::getModel(item->getPickupIdentifier());
+        //this->attach(model);
     }
 
-    /**
-    @brief
-        
-    */
+//TODO: Remove.
     //TODO: Comment.
     //Each pickup should have a XML template where the Model and Billboard, and so on, is specified.
-    /*static*/ DroppedItem* DroppedItem::createDefaultDrop(BaseItem* item, const Vector3& position, const ColourValue& flareColour, float timeToLive)
-    {
-        //TODO: triggerDistance?
-        float triggerDistance = 20.0;
-        DroppedItem* droppedItem = new DroppedItem(item, item, triggerDistance, 0, 1);
-        
-        //TODO: Do this somehwere else?
-        Model* model = new Model(item);
-        Billboard* billboard = new Billboard(item);
+//    /*static*/ DroppedItem* DroppedItem::createDefaultDrop(BaseItem* item, const Vector3& position, const ColourValue& flareColour, float timeToLive)
+//     {
+//         //TODO: triggerDistance?
+//         float triggerDistance = 20.0;
+//         DroppedItem* droppedItem = new DroppedItem(item, item, triggerDistance, 0, 1);
+//         
+//         //TODO: Do this somehwere else?
+//         Model* model = new Model(item);
+//         Billboard* billboard = new Billboard(item);
+// 
+//         model->setMeshSource("sphere.mesh");
+//         model->setScale(3.0f);
+// 
+//         billboard->setMaterial("Examples/Flare");
+//         billboard->setColour(flareColour);
+//         billboard->setScale(0.5f);
+// 
+//         droppedItem->setPosition(position);
+//         droppedItem->attach(model);
+//         droppedItem->attach(billboard);
+// 
+//         COUT(3) << "Created DroppedItem for '" << item->getPickupIdentifier() << "' at (" << position.x << "," << position.y << "," << position.z << ")." << std::endl;
+// 
+//         return droppedItem;
+//     }
 
-        model->setMeshSource("sphere.mesh");
-        model->setScale(3.0f);
-
-        billboard->setMaterial("Examples/Flare");
-        billboard->setColour(flareColour);
-        billboard->setScale(0.5f);
-
-        droppedItem->setPosition(position);
-        droppedItem->attach(model);
-        droppedItem->attach(billboard);
-
-        COUT(3) << "Created DroppedItem for '" << item->getPickupIdentifier() << "' at (" << position.x << ',' << position.y << ',' << position.z << ")." << std::endl;
-
-        return droppedItem;
-    }
-
-    /**
-    @brief
-
-    */
     //TODO: See one function above.
-    DroppedItem* DroppedItem::createDefaultDrop(BaseItem* item, Pawn* pawn, const ColourValue& flareColour, float timeToLive)
-    {
-        Vector3 after = pawn->getPosition() + pawn->getOrientation() * Vector3(0.0f, 0.0f, 50.0f);
-        return DroppedItem::createDefaultDrop(item, after, flareColour, timeToLive);
-    }
+//     DroppedItem* DroppedItem::createDefaultDrop(BaseItem* item, Pawn* pawn, const ColourValue& flareColour, float timeToLive)
+//     {
+//         Vector3 after = pawn->getPosition() + pawn->getOrientation() * Vector3(0.0f, 0.0f, 50.0f);
+//         return DroppedItem::createDefaultDrop(item, after, flareColour, timeToLive);
+//     }
 }
Index: /code/branches/pickup3/src/modules/pickup/DroppedItem.h
===================================================================
--- /code/branches/pickup3/src/modules/pickup/DroppedItem.h	(revision 6420)
+++ /code/branches/pickup3/src/modules/pickup/DroppedItem.h	(revision 6421)
@@ -35,5 +35,5 @@
 #define _DroppedItem_H__
 
-#include "OrxonoxPrereqs.h"
+#include "pickup/PickupPrereqs.h"
 
 #include "PickupSpawner.h"
@@ -45,16 +45,15 @@
         public:
             DroppedItem(BaseObject* creator);
-            DroppedItem(BaseObject* creator, BaseItem* item, float triggerDistance, float respawnTime, int maxSpawnedItems);
+            DroppedItem(BaseObject* creator, Pickupable* item, const Vector3& position, float triggerDistance);
             virtual ~DroppedItem();
 
-            static DroppedItem* createDefaultDrop(BaseItem* item, const Vector3& position, const ColourValue& flareColour = ColourValue(0.5f, 1.0f, 0.3f), float timeToLive = 0);
-            static DroppedItem* createDefaultDrop(BaseItem* item, Pawn* pawn, const ColourValue& flareColour = ColourValue(0.5f, 1.0f, 0.3f), float timeToLive = 0);
-
         protected:
-            virtual BaseItem* getItem(void);
-
+            virtual Pickupable* getPickup(void);
+            
         private:
-
-            BaseItem* item_; //!< The dropped item.
+            void initialize(void);
+            void createDrop(const Vector3& position);
+            
+            bool gotPickedUp_;
 
     };
Index: /code/branches/pickup3/src/modules/pickup/PickupCollection.cc
===================================================================
--- /code/branches/pickup3/src/modules/pickup/PickupCollection.cc	(revision 6420)
+++ /code/branches/pickup3/src/modules/pickup/PickupCollection.cc	(revision 6421)
@@ -58,5 +58,5 @@
     {
         //! Destroy all Pickupables constructing this PickupCollection.
-        for(std::list<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
         {
             delete *it;
@@ -89,5 +89,5 @@
             return false;
         
-        this->pickups_.insert(pickup);
+        this->pickups_.push_back(pickup);
         return true;
     }
@@ -101,5 +101,5 @@
         Returns a pointer to the Pickupable at the index given by index.
     */
-    Pickupable* PickupCollection::getPickupable(unsigned int index)
+    const Pickupable* PickupCollection::getPickupable(unsigned int index)
     {
         return this->pickups_[index]; //TODO. Does this work?
@@ -112,5 +112,5 @@
         
         //! Change used for all Pickupables this PickupCollection consists of.
-        for(std::list<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
         {
             (*it)->changedUsed();
@@ -132,5 +132,5 @@
         bool success = true;
         //! Set all Pickupables to used.
-        for(std::list<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
         {
             if(!(*it)->use())
@@ -158,5 +158,5 @@
         bool success = true;
         //! Set all Pickupables to unused.
-        for(std::list<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
         {
             if(!(*it)->unuse())
@@ -187,5 +187,5 @@
             return false;
         }
-        for(std::list<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
         {
             (*it)->setOwner(carrier);
@@ -219,5 +219,5 @@
         
         PickupCollection* newCollection = dynamic_cast<PickupCollection*>(newObject);
-        for(std::list<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
         {
             Pickupable* newPickup = (*it)->clone();
Index: /code/branches/pickup3/src/modules/pickup/PickupCollection.h
===================================================================
--- /code/branches/pickup3/src/modules/pickup/PickupCollection.h	(revision 6420)
+++ /code/branches/pickup3/src/modules/pickup/PickupCollection.h	(revision 6421)
@@ -69,9 +69,9 @@
             
             bool addPickupable(Pickupable* pickup);
-            Pickupable* getPickupable(unsigned int index);
+            const Pickupable* getPickupable(unsigned int index);
             
         private:
             
-            std::list<Pickupable*> pickups_;
+            std::vector<Pickupable*> pickups_;
         
     };
Index: /code/branches/pickup3/src/modules/pickup/PickupPrereqs.h
===================================================================
--- /code/branches/pickup3/src/modules/pickup/PickupPrereqs.h	(revision 6420)
+++ /code/branches/pickup3/src/modules/pickup/PickupPrereqs.h	(revision 6421)
@@ -66,4 +66,5 @@
 {
 
+    class DroppedItem;
     class PickupCollection;
     class PickupSpawner;
Index: /code/branches/pickup3/src/modules/pickup/PickupSpawner.cc
===================================================================
--- /code/branches/pickup3/src/modules/pickup/PickupSpawner.cc	(revision 6420)
+++ /code/branches/pickup3/src/modules/pickup/PickupSpawner.cc	(revision 6421)
@@ -53,5 +53,5 @@
     /**
     @brief
-        Constructor. Registers the PickupSpawner.
+        Constructor. Creates a blank PickupSpawner.
     @param creator
         Pointer to the object which created this item.
@@ -62,4 +62,18 @@
     }
 
+    /**
+    @brief
+        Constructor, Creates a fully functional PickupSpawner.
+    @param creator
+        The creator of this PickupSpawner.
+    @param pickup
+        The Pickupable to be spawned by this PickupSpawner.
+    @param triggerDistance
+        The distance at which the PickupSpawner will trigger.
+    @param respawnTime
+        The minimum time between two spawns.
+    @param maySpawnedItems
+        The maximum number of items spawned by this PickupSpawner.
+    */
     PickupSpawner::PickupSpawner(BaseObject* creator, Pickupable* pickup, float triggerDistance, float respawnTime, int maxSpawnedItems) : StaticEntity(creator)
     {
@@ -73,4 +87,8 @@
     }
 
+    /**
+    @brief
+        Registers the object and sets some default values.
+    */
     void PickupSpawner::initialize(void)
     {
@@ -92,5 +110,6 @@
     PickupSpawner::~PickupSpawner()
     {
-        
+        if(this->pickup_ != NULL)
+            delete this->pickup_;
     }
 
@@ -107,5 +126,5 @@
         SUPER(PickupSpawner, XMLPort, xmlelement, mode);
 
-        XMLPortObject(PickupSpawner, Pickupable, "pickup", addPickupable, getPickupable, xmlelement, mode);
+        XMLPortObject(PickupSpawner, Pickupable, "pickup", setPickupable, getPickupable, xmlelement, mode);
         
         XMLPortParam(PickupSpawner, "triggerDistance", setTriggerDistance, getTriggerDistance, xmlelement, mode);
@@ -128,10 +147,16 @@
         //  & load the GUI itself too, along with some empty windows
         //   = even less delays
-//         GUIManager::showGUI("PickupInventory");
-//         GUIManager::hideGUI("PickupInventory");
+//         GUIManager::getInstance().showGUI("PickupInventory");
+//         GUIManager::getInstance().executeCode("hideGUI(\"PickupInventory\")");
 //         PickupInventory::getSingleton();
     }
     
-    void PickupSpawner::addPickupable(Pickupable* pickup)
+    /**
+    @brief
+        Sets a Pickupable for the PickupSpawner to spawn.
+    @param pickup
+        The Pickupable to be set.
+    */
+    void PickupSpawner::setPickupable(Pickupable* pickup)
     {
         if(this->pickup_ != NULL)
@@ -149,5 +174,11 @@
     }
     
-    Pickupable* PickupSpawner::getPickupable(void)
+    /**
+    @brief
+        Get the Pickupable that is spawned by this PickupSpawner.
+    @return
+        Returns the Pickupable that is spawned by this PickupSpawner.
+    */
+    const Pickupable* PickupSpawner::getPickupable(void)
     {
         return this->pickup_;
@@ -166,4 +197,10 @@
 //     }
 
+    /**
+    @brief
+        Sets the maximum number of spawned items.
+    @param items
+        The maximum number of spawned items to be set.
+    */
     void PickupSpawner::setMaxSpawnedItems(int items)
     {
@@ -243,4 +280,11 @@
     }
     
+    /**
+    @brief
+        Decrements the number of remaining spawns.
+        Sets the PickupSpawner to inactive for the duration of the respawnTime.
+        Destroys the PickupSpawner if the number of remaining spawns has reached zero.
+        
+    */
     void PickupSpawner::decrementSpawnsRemaining(void)
     {
@@ -251,5 +295,5 @@
         if(this->spawnsRemaining_ != 0 && this->respawnTime_ > 0)
         {
-            //TODO: Nicer?
+            //TODO: Nicer? Does this even work?
             this->respawnTimer_.setTimer(this->respawnTime_, false, createExecutor(createFunctor(&PickupSpawner::respawnTimerCallback, this)));
 
Index: /code/branches/pickup3/src/modules/pickup/PickupSpawner.h
===================================================================
--- /code/branches/pickup3/src/modules/pickup/PickupSpawner.h	(revision 6420)
+++ /code/branches/pickup3/src/modules/pickup/PickupSpawner.h	(revision 6421)
@@ -57,5 +57,5 @@
             virtual ~PickupSpawner();
 
-            virtual void changedActivity();                                 //!< Invoked when activity has changed (set visibilty).
+            //virtual void changedActivity();                                 //!< Invoked when activity has changed (set visibilty).
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);  //!< Method for creating a PickupSpawner through XML.
             virtual void tick(float dt);
@@ -87,5 +87,8 @@
                 { this->respawnTime_ = time; }
 
-
+            /**
+                @brief Get the maximum number of items that will be spawned by this PickupSpawner.
+                @return Returns the maximum number of items spawned by this PickupSpawner.
+            */
             inline int getMaxSpawnedItems(void)
                 { return this->maxSpawnedItems_; }
@@ -95,8 +98,10 @@
             virtual Pickupable* getPickup(void);
             
-            void addPickupable(Pickupable* pickup);
-            Pickupable* getPickupable(void);
+            void setPickupable(Pickupable* pickup);
+            const Pickupable* getPickupable(void);
             
             void decrementSpawnsRemaining(void);
+            
+            Pickupable* pickup_; //!< The pickup to be spawned.
 
         private:
@@ -105,7 +110,4 @@
             void trigger(Pawn* pawn);                                       //!< Method called when a Pawn is close enough.
             void respawnTimerCallback();                                    //!< Method called when the timer runs out.
-
-            
-            Pickupable* pickup_;
 
             int maxSpawnedItems_;                   //!< Maximum number of items spawned by this PickupSpawner.
Index: /code/branches/pickup3/src/modules/weapons/projectiles/Rocket.cc
===================================================================
--- /code/branches/pickup3/src/modules/weapons/projectiles/Rocket.cc	(revision 6420)
+++ /code/branches/pickup3/src/modules/weapons/projectiles/Rocket.cc	(revision 6421)
@@ -201,6 +201,7 @@
 
             float dmg = this->damage_;
-            if (this->owner_)
-                dmg = this->owner_->getPickups().processModifiers(ModifierType::Damage, dmg, false);
+            //TODO: This souldn't be necessary here.
+            //if (this->owner_)
+            //    dmg = this->owner_->getPickups().processModifiers(ModifierType::Damage, dmg, false);
 
             Pawn* victim = orxonox_cast<Pawn*>(otherObject);
Index: /code/branches/pickup3/src/orxonox/interfaces/PickupCarrier.h
===================================================================
--- /code/branches/pickup3/src/orxonox/interfaces/PickupCarrier.h	(revision 6420)
+++ /code/branches/pickup3/src/orxonox/interfaces/PickupCarrier.h	(revision 6421)
@@ -48,5 +48,5 @@
         public:
             PickupCarrier();
-            virtual ~PickupCarrier();
+            virtual ~PickupCarrier() {}
         
         private:
