Index: /code/branches/presentation3/src/modules/pickup/PickupManager.cc
===================================================================
--- /code/branches/presentation3/src/modules/pickup/PickupManager.cc	(revision 7149)
+++ /code/branches/presentation3/src/modules/pickup/PickupManager.cc	(revision 7150)
@@ -212,5 +212,5 @@
         if(pickup != NULL && carrier != NULL)
         {
-            carrier->drop(pickup);
+            pickup->drop(carrier);
         }
     }
Index: /code/branches/presentation3/src/modules/pickup/PickupSpawner.cc
===================================================================
--- /code/branches/presentation3/src/modules/pickup/PickupSpawner.cc	(revision 7149)
+++ /code/branches/presentation3/src/modules/pickup/PickupSpawner.cc	(revision 7150)
@@ -304,5 +304,5 @@
             if(target != NULL && pickup != NULL)
             {
-                if(target->pickup(pickup))
+                if(pickup->pickup(target))
                 {
                     this->decrementSpawnsRemaining();
Index: /code/branches/presentation3/src/modules/pickup/items/MetaPickup.cc
===================================================================
--- /code/branches/presentation3/src/modules/pickup/items/MetaPickup.cc	(revision 7149)
+++ /code/branches/presentation3/src/modules/pickup/items/MetaPickup.cc	(revision 7150)
@@ -136,5 +136,5 @@
                         if(pickup != NULL && pickup != this)
                         {
-                            carrier->drop(pickup);
+                            pickup->drop(carrier);
                         }
                     }
Index: /code/branches/presentation3/src/orxonox/interfaces/PickupCarrier.h
===================================================================
--- /code/branches/presentation3/src/orxonox/interfaces/PickupCarrier.h	(revision 7149)
+++ /code/branches/presentation3/src/orxonox/interfaces/PickupCarrier.h	(revision 7150)
@@ -81,37 +81,4 @@
 
             /**
-            @brief Can be called to pick up a Pickupable.
-            @param pickup A pointer to the Pickupable.
-            @return Returns true if the Pickupable was picked up, false if not.
-            */
-            bool pickup(Pickupable* pickup)
-                {
-                    bool pickedUp = this->pickups_.insert(pickup).second;
-                    if(pickedUp)
-                    {
-                        COUT(4) << "Picked up Pickupable " << pickup->getIdentifier()->getName() << "(&" << pickup << ")." << std::endl;
-                        pickup->pickedUp(this);
-                    }
-                    return pickedUp;
-                }
-
-            /**
-            @brief Can be called to drop a Pickupable.
-            @param pickup A pointer to the Pickupable.
-            @param drop If the Pickupable should just be removed from the PickupCarrier without further action, this can be set to false. true is default.
-            @return Returns true if the Pickupable has been dropped, false if not.
-            */
-            bool drop(Pickupable* pickup, bool drop = true)
-                {
-                    bool dropped = this->pickups_.erase(pickup) == 1;
-                    if(dropped && drop)
-                    {
-                        COUT(4) << "Dropping Pickupable " << pickup->getIdentifier()->getName() << "(&" << pickup << ")." << std::endl;
-                        pickup->dropped();
-                    }
-                    return dropped;
-                }
-
-            /**
             @brief Can be used to check whether the PickupCarrier or a child of his is a target ot the input Pickupable.
             @param pickup A pointer to the Pickupable.
@@ -193,4 +160,20 @@
 
             /**
+            @brief Adds a Pickupable to the list of pickups that are carried by this PickupCarrier.
+            @param pickup A pointer to the pickup to be added.
+            @return Returns true if successfull, false if the Pickupable was already present.
+            */
+            bool addPickup(Pickupable* pickup)
+                { return this->pickups_.insert(pickup).second; }
+
+            /**
+            @brief Removes a Pickupable from the list of pickups that are carried by thsi PickupCarrier.
+            @param pickup A pointer to the pickup to be removed.
+            @return Returns true if successfull, false if the Pickupable was not present in the list.
+            */
+            bool removePickup(Pickupable* pickup)
+                { return this->pickups_.erase(pickup) == 1; }
+
+            /**
             @brief Get all Pickupables this PickupCarrier has.
             @return  Returns the set of all Pickupables this PickupCarrier has.
Index: /code/branches/presentation3/src/orxonox/interfaces/Pickupable.cc
===================================================================
--- /code/branches/presentation3/src/orxonox/interfaces/Pickupable.cc	(revision 7149)
+++ /code/branches/presentation3/src/orxonox/interfaces/Pickupable.cc	(revision 7150)
@@ -69,8 +69,7 @@
             this->setUsed(false);
 
-        if(this->isPickedUp() && this->getCarrier() != NULL)
+        if(this->isPickedUp())
         {
-            this->getCarrier()->drop(this, false);
-            this->setCarrier(NULL);
+            this->drop(false);
         }
 
@@ -168,19 +167,59 @@
     /**
     @brief
-        Sets the Pickupable to picked up.
-        This method will be called by the PickupCarrier picking the Pickupable up.
+        Can be called to pick up a Pickupable.
     @param carrier
-        The PickupCarrier that picked the Pickupable up.
-    @return
-        Returns false if, for some reason, the pickup could not be picked up, e.g. it was picked up already.
-    */
-    bool Pickupable::pickedUp(PickupCarrier* carrier)
-    {
-        if(this->isPickedUp()) //!< If the Pickupable is already picked up.
-            return false;
+        A pointer to the PickupCarrier that picks up the Pickupable.
+    @return
+        Returns true if the Pickupable was picked up, false if not.
+    */
+    bool Pickupable::pickup(PickupCarrier* carrier)
+    {
+        if(carrier == NULL || this->isPickedUp()) //!< If carrier is NULL or the Pickupable is already picked up.
+            return false;
+
+        if(!carrier->addPickup(this))
+        {
+            COUT(3) << "A Pickupable (&" << this << ") was trying to be added to a PickupCarrier, but was already present." << std::endl;
+            return false;
+        }
 
         COUT(4) << "Pickupable (&" << this << ") got picked up by a PickupCarrier (&" << carrier << ")." << std::endl;
         this->setCarrier(carrier);
         this->setPickedUp(true);
+        return true;
+    }
+
+    /**
+    @brief
+        Can be called to drop a Pickupable.
+    @param createSpawner
+        If true a spawner is be created for the dropped Pickupable. True is default.
+    @return
+        Returns true if the Pickupable has been dropped, false if not.
+    */
+    bool Pickupable::drop(bool createSpawner)
+    {
+        if(!this->isPickedUp()) //!< If the Pickupable is not picked up.
+            return false;
+
+        assert(this->getCarrier()); //!> The Carrier cannot be NULL at this point. //TODO: Too conservative?
+        if(!this->getCarrier()->removePickup(this)) //TODO Shouldn't this be a little later?
+            COUT(2) << "Pickupable (&" << this << ") is being dropped, but it was not present in the PickupCarriers list of pickups." << std::endl;
+        
+        COUT(4) << "Pickupable (&" << this << ") got dropped up by a PickupCarrier (&" << this->getCarrier() << ")." << std::endl;
+        this->setUsed(false);
+        this->setPickedUp(false);
+
+        bool created = false;
+        if(createSpawner)
+            created = this->createSpawner();
+
+        this->setCarrier(NULL);
+
+        if(!created && createSpawner)
+        {
+            this->destroy();
+        }
+
         return true;
     }
@@ -229,32 +268,4 @@
     /**
     @brief
-        Sets the Pickupable to not picked up or dropped.
-        This method will be called by the PickupCarrier dropping the Pickupable.
-    @return
-        Returns false if the pickup could not be dropped.
-    */
-    bool Pickupable::dropped(void)
-    {
-        if(!this->isPickedUp()) //!< If the Pickupable is not picked up.
-            return false;
-
-        COUT(4) << "Pickupable (&" << this << ") got dropped up by a PickupCarrier (&" << this->getCarrier() << ")." << std::endl;
-        this->setUsed(false);
-        this->setPickedUp(false);
-
-        bool created = this->createSpawner();
-
-        this->setCarrier(NULL);
-
-        if(!created)
-        {
-            this->destroy();
-        }
-
-        return true;
-    }
-
-    /**
-    @brief
         Creates a duplicate of the Pickupable.
     @return
@@ -297,5 +308,5 @@
         Pawn* pawn = static_cast<Pawn*>(entity);
         PickupCarrier* carrier = static_cast<PickupCarrier*>(pawn);
-        return carrier->pickup(this);
+        return this->pickup(carrier);
     }
 
Index: /code/branches/presentation3/src/orxonox/interfaces/Pickupable.h
===================================================================
--- /code/branches/presentation3/src/orxonox/interfaces/Pickupable.h	(revision 7149)
+++ /code/branches/presentation3/src/orxonox/interfaces/Pickupable.h	(revision 7150)
@@ -95,6 +95,6 @@
             virtual void changedPickedUp(void) {}
 
-            bool pickedUp(PickupCarrier* carrier); //!< Sets the Pickupable to picked up.
-            bool dropped(void); //!< Sets the Pickupable to not picked up or dropped.
+            bool pickup(PickupCarrier* carrier);
+            bool drop(bool createSpawner = true);
 
             virtual bool isTarget(PickupCarrier* carrier) const; //!< Get whether the given PickupCarrier is a target of this pickup.
