Index: code/trunk/src/modules/pickup/CMakeLists.txt
===================================================================
--- code/trunk/src/modules/pickup/CMakeLists.txt	(revision 11103)
+++ code/trunk/src/modules/pickup/CMakeLists.txt	(revision 11353)
@@ -19,4 +19,5 @@
     PickupPrecompiledHeaders.h
   LINK_LIBRARIES
+    overlays
     orxonox
   SOURCE_FILES ${PICKUP_SRC_FILES}
Index: code/trunk/src/modules/pickup/PickupManager.cc
===================================================================
--- code/trunk/src/modules/pickup/PickupManager.cc	(revision 11103)
+++ code/trunk/src/modules/pickup/PickupManager.cc	(revision 11353)
@@ -41,4 +41,7 @@
 #include "network/Host.h"
 #include "network/NetworkFunctionIncludes.h"
+#include "core/input/KeyBinderManager.h"    //for keybinding
+#include "core/input/KeyBinder.h"           //for keybinding
+#include "core/command/ConsoleCommandIncludes.h"
 
 #include "infos/PlayerInfo.h"
@@ -48,4 +51,5 @@
 #include "CollectiblePickup.h"
 #include "PickupRepresentation.h"
+#include "overlays/hud/HUDPickupSystem.h"
 
 namespace orxonox
@@ -63,4 +67,6 @@
 
     RegisterAbstractClass(PickupManager).inheritsFrom<PickupListener>();
+
+    SetConsoleCommand("useUnusePickup", &PickupManager::useUnusePickup).addShortcut().setActive(true);
 
     /**
@@ -260,4 +266,7 @@
         assert(pickup);
 
+        for (HUDPickupSystem* hud : ObjectList<HUDPickupSystem>())
+            pickupSystem = hud;
+        
         if(!GameMode::isMaster()) // If this is neither standalone nor the server.
             return;
@@ -283,8 +292,14 @@
         if(pickedUp) // If the Pickupable has changed to picked up, it is added to the required lists.
         {
-            index = this->getPickupIndex(); // Ge a new identifier (index) for the Pickupable.
+            index = this->getPickupIndex(); // Get a new identifier (index) for the Pickupable.
             // Add the Pickupable to the indexes_ and pickups_ lists.
             this->indexes_[pickup] = index;
             this->pickups_[index] = pickup;
+
+            this->picks.push_back(pickup);
+
+            if(pickupSystem)
+                pickupSystem->updatePickupList(picks, indexes_);
+            
         }
         else // If it was dropped, it is removed from the required lists.
@@ -294,7 +309,12 @@
             index = it->second;
 
-            // Remove the Pickupable from the indexes_ and pickups_ list.
-            this->indexes_.erase(it);
-            this->pickups_.erase(index);
+            this->indexes_.erase(pickup);
+            this->pickups_.erase(index); //set to null, so that can be identified as free slot by getPickupIndex()
+
+
+            this->picks.erase(std::remove(this->picks.begin(), this->picks.end(), pickup), this->picks.end()); //remove pickup from vector
+
+            if(pickupSystem)
+                pickupSystem->removePickup(pickup);
         }
 
@@ -323,4 +343,31 @@
 
     }
+
+    //This function is called by the command line or by the key binding
+    //it uses or unuses the pickup, depending on its current state
+    //or drops it (depends what you comment/uncomment)
+    void PickupManager::useUnusePickup(uint32_t index) 
+    {
+        PickupManager& manager = PickupManager::getInstance();
+
+        if(!manager.pickups_.count(index)) return; //if pickup is no longer here, dont do anything
+
+        Pickupable* pickup=manager.pickups_.find(index)->second;
+        if(pickup==nullptr)
+        {
+            return;                       //pickup does not exist
+        }
+
+        //if the pickup should be dropped upon key press
+        manager.dropPickup(index);
+
+        //if the pickup should be used/unused upon key press
+
+        // if(pickup->isUsed())
+        //     manager.usePickup(index, false);
+        // else
+        //     manager.usePickup(index, true);
+    }
+
 
     /**
@@ -402,5 +449,8 @@
             Pickupable* pickupable = this->pickups_.find(pickup)->second;
             if(pickupable != nullptr)
+            {
                 pickupable->drop();
+
+            }
         }
         // If we're neither server nor standalone we drop the pickup by calling dropPickupNetworked() of the PickupManager on the server.
@@ -495,6 +545,6 @@
     /**
     @brief
-        Get a new index for a Pickupable.
-        This will work as long as the number of Pickupables that are picked up is sufficiently small and as long as they don't exist forever.
+        Get a new index between 0 and 9 for a Pickupable.
+        If all slots are occupied, the Pickupable in the first slot will be dropped.
     @return
         Returns the new index.
@@ -502,7 +552,14 @@
     uint32_t PickupManager::getPickupIndex(void)
     {
-        if(this->pickupHighestIndex_ == uint32_t(~0x0)-1) // If we've reached the highest possible number, we wrap around.
-            this->pickupHighestIndex_ = 0;
-        return this->pickupHighestIndex_++;
+        //check if there are free slots available
+
+        for(uint32_t i=0; i<10; i++)
+        {
+            if(!pickups_.count(i)) return i;
+        }
+        //all slots are full and we have to drop sth
+        orxout(internal_info, context::pickups) << "everything was full and we have now dropped the first element" << endl;
+        this->dropPickup(0);
+        return 0;
     }
 
Index: code/trunk/src/modules/pickup/PickupManager.h
===================================================================
--- code/trunk/src/modules/pickup/PickupManager.h	(revision 11103)
+++ code/trunk/src/modules/pickup/PickupManager.h	(revision 11353)
@@ -42,7 +42,8 @@
 
 #include "PickupRepresentation.h"
-
+#include "interfaces/Pickupable.h"
 #include "util/Singleton.h"
 #include "interfaces/PickupListener.h"
+#include "overlays/hud/HUDPickupSystem.h"
 
 namespace orxonox // tolua_export
@@ -135,4 +136,5 @@
 
             void dropPickup(uint32_t pickup); //!< Drop the input Pickupable.
+            static void useUnusePickup(uint32_t index); //tolua_export
             void usePickup(uint32_t pickup, bool use); //!< Use (or unuse) the input Pickupable.
              /**
@@ -147,6 +149,10 @@
             static void dropPickupNetworked(uint32_t pickup); //!< Helper method to drop the input pickup on the server.
             static void usePickupNetworked(uint32_t pickup, bool use); //!< Helper method to use (or unuse) the input Pickupable on the server.
+            void setPickupSystem(HUDPickupSystem* system);
 
         private:
+            HUDPickupSystem* pickupSystem;
+            std::vector<Pickupable*> picks;
+
             static PickupManager* singletonPtr_s;
             static const std::string guiName_s; //!< The name of the PickupInventory
@@ -166,5 +172,5 @@
             void updateGUI(void); //!< Updates the PickupInventory GUI.
             uint32_t getPickupIndex(void); //!< Get a new index for a Pickupable.
-
+            
     }; // tolua_export
 
Index: code/trunk/src/modules/pickup/items/SpeedPickup.h
===================================================================
--- code/trunk/src/modules/pickup/items/SpeedPickup.h	(revision 11103)
+++ code/trunk/src/modules/pickup/items/SpeedPickup.h	(revision 11353)
@@ -48,5 +48,5 @@
         A Pickup which can manipulate the Speed of a Pawn.
 
-        There are 5 parameters that can be cosen:
+        There are 5 parameters that can be chosen:
         - The @b speedMultiply, specifies a factor by which the Spaceships speed is multiplied. The default is 1.
         - The @b speedAdd, specifies a value that is added to the speed of the Spaceship. The default is 0.
