Index: /code/trunk/src/modules/pickup/Pickup.cc
===================================================================
--- /code/trunk/src/modules/pickup/Pickup.cc	(revision 6532)
+++ /code/trunk/src/modules/pickup/Pickup.cc	(revision 6533)
@@ -73,5 +73,4 @@
     void Pickup::initializeIdentifier(void)
     {        
-        //TODO: Works?
         std::string val1 = this->getActivationType();
         std::string type1 = "activationType";
Index: /code/trunk/src/modules/pickup/PickupCollection.cc
===================================================================
--- /code/trunk/src/modules/pickup/PickupCollection.cc	(revision 6532)
+++ /code/trunk/src/modules/pickup/PickupCollection.cc	(revision 6533)
@@ -65,7 +65,8 @@
     {
         //! Destroy all Pickupables constructing this PickupCollection.
-        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
-        {
-            (*it)->destroy();
+        for(std::vector<WeakPtr<Pickupable> >::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        {
+            if((*it).get() != NULL)
+                (*it).get()->destroy();
         }
     }
@@ -86,7 +87,7 @@
     void PickupCollection::initializeIdentifier(void)
     {
-        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
-        {
-            this->pickupCollectionIdentifier_->addPickup((*it)->getPickupIdentifier());
+        for(std::vector<WeakPtr<Pickupable> >::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        {
+            this->pickupCollectionIdentifier_->addPickup((*it).get()->getPickupIdentifier());
         }
     }
@@ -121,5 +122,6 @@
             return false;
         
-        this->pickups_.push_back(pickup);
+        WeakPtr<Pickupable> ptr = pickup;
+        this->pickups_.push_back(ptr);
         return true;
     }
@@ -135,5 +137,5 @@
     const Pickupable* PickupCollection::getPickupable(unsigned int index)
     {
-        return this->pickups_[index]; //TODO. Does this work?
+        return this->pickups_[index].get(); //TODO. Does this work?
     }
     
@@ -143,7 +145,7 @@
         
         //! Change used for all Pickupables this PickupCollection consists of.
-        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
-        {
-            (*it)->setUsed(this->isUsed());
+        for(std::vector<WeakPtr<Pickupable> >::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        {
+            (*it).get()->setUsed(this->isUsed());
         }
     }
@@ -154,7 +156,7 @@
         
         //! Change used for all Pickupables this PickupCollection consists of.
-        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
-        {
-            (*it)->setCarrier(this->getCarrier());
+        for(std::vector<WeakPtr<Pickupable> >::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        {
+            (*it).get()->setCarrier(this->getCarrier());
         }
     }
@@ -165,7 +167,7 @@
         
         //! Change the carrier for all Pickupables this PickupCollection consists of.
-        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
-        {
-            (*it)->setPickedUp(this->isPickedUp());
+        for(std::vector<WeakPtr<Pickupable> >::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        {
+            (*it).get()->setPickedUp(this->isPickedUp());
         }
     }
@@ -179,7 +181,7 @@
         
         PickupCollection* pickup = dynamic_cast<PickupCollection*>(item);
-        for(std::vector<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
-        {
-            Pickupable* newPickup = (*it)->clone();
+        for(std::vector<WeakPtr<Pickupable> >::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        {
+            Pickupable* newPickup = (*it).get()->clone();
             pickup->addPickupable(newPickup);
         }
@@ -190,7 +192,7 @@
     bool PickupCollection::isTarget(Identifier* identifier) const
     {
-        for(std::vector<Pickupable*>::const_iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
-        {
-            if(!(*it)->isTarget(identifier))
+        for(std::vector<WeakPtr<Pickupable> >::const_iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        {
+            if(!(*it).get()->isTarget(identifier))
                 return false;
         }
Index: /code/trunk/src/modules/pickup/PickupCollection.h
===================================================================
--- /code/trunk/src/modules/pickup/PickupCollection.h	(revision 6532)
+++ /code/trunk/src/modules/pickup/PickupCollection.h	(revision 6533)
@@ -79,5 +79,5 @@
         private:
             
-            std::vector<Pickupable*> pickups_;
+            std::vector<WeakPtr<Pickupable> > pickups_;
         
     };
Index: /code/trunk/src/orxonox/interfaces/InterfaceCompilation.cc
===================================================================
--- /code/trunk/src/orxonox/interfaces/InterfaceCompilation.cc	(revision 6532)
+++ /code/trunk/src/orxonox/interfaces/InterfaceCompilation.cc	(revision 6533)
@@ -64,9 +64,11 @@
     PickupCarrier::~PickupCarrier()
     {
-        for(std::set<Pickupable*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)
+        while(this->pickups_.size() > 0)
         {
+            std::set<Pickupable*>::iterator it = this->pickups_.begin();
+            this->pickups_.erase(it);
             (*it)->destroy();
         }
-        
+
         this->pickups_.clear();
     }
Index: /code/trunk/src/orxonox/interfaces/PickupCarrier.h
===================================================================
--- /code/trunk/src/orxonox/interfaces/PickupCarrier.h	(revision 6532)
+++ /code/trunk/src/orxonox/interfaces/PickupCarrier.h	(revision 6533)
@@ -41,4 +41,5 @@
 #include "Pickupable.h"
 #include "core/Identifier.h"
+#include "core/WeakPtr.h"
 
 #include "core/OrxonoxClass.h"
Index: /code/trunk/src/orxonox/interfaces/Pickupable.h
===================================================================
--- /code/trunk/src/orxonox/interfaces/Pickupable.h	(revision 6532)
+++ /code/trunk/src/orxonox/interfaces/Pickupable.h	(revision 6533)
@@ -114,7 +114,4 @@
                 { return this->pickupIdentifier_; }
                 
-            virtual void destroy(void)
-                { delete this; }
-                
             //TODO: Make them work as protected.
             bool setUsed(bool used); //!< Sets the Pickupable to used or unused, depending on the input.
