diff --git a/game/engine/Object.lua b/game/engine/Object.lua
index 71d34262376d0fcb53f2b18e47694a7cacf20292..b82c591b3ec0a65689dab9895af3a42b91645733 100644
--- a/game/engine/Object.lua
+++ b/game/engine/Object.lua
@@ -147,7 +147,7 @@ function _M:forAllStack(fct)
 	fct(self)
 	if not self.stacked then return end
 	for i, so in ipairs(self.stacked) do
-		fct(so)
+		if fct(so, i) then break end
 	end
 end
 
diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua
index ef09b8be1ddff7dbeb83bb6add6dd022ffa829ad..a3935c645f0e73023ddb0aa5ad541e2644ffdf7e 100644
--- a/game/engine/Zone.lua
+++ b/game/engine/Zone.lua
@@ -485,6 +485,8 @@ function _M:getLevel(game, lev, old_lev, no_close)
 end
 
 function _M:getGenerator(what, level, spots)
+	assert(level.data.generator[what], "requested zone generator of type "..tostring(what).." but it is not defined")
+	assert(level.data.generator[what].class, "requested zone generator of type "..tostring(what).." but it has no class field")
 	print("[GENERATOR] requiring", what, level.data.generator and level.data.generator[what] and level.data.generator[what].class)
 	return require(level.data.generator[what].class).new(
 			self,
diff --git a/game/engine/interface/ActorInventory.lua b/game/engine/interface/ActorInventory.lua
index 7dc5a1b940f8596315aae5330b2ff3951d0cb68b..cd93501518efc87638a757229785c71ff5229d94 100644
--- a/game/engine/interface/ActorInventory.lua
+++ b/game/engine/interface/ActorInventory.lua
@@ -109,16 +109,33 @@ end
 function _M:onAddObject(o)
 end
 
+--- Rerturns the position of an item in the given inventory, or nil
+function _M:itemPosition(inven, o)
+	inven = self:getInven(inven)
+	for i, p in ipairs(inven) do
+		local found = nil
+		o:forAllStack(function(so)
+			if p.name == so.name then found = i return true end
+		end)
+		if found then return found end
+	end
+	return nil
+end
+
 --- Picks an object from the floor
-function _M:pickupFloor(i, vocal)
+function _M:pickupFloor(i, vocal, no_sort)
 	local o = game.level.map:getObject(self.x, self.y, i)
 	if o then
 		local prepickup = o:check("on_prepickup", self, i)
 		if not prepickup and self:addObject(self.INVEN_INVEN, o) then
 			game.level.map:removeObject(self.x, self.y, i)
+			if not no_sort then self:sortInven(self.INVEN_INVEN) end
+
 			o:check("on_pickup", self)
+			self:check("on_pickup_object", o)
 
-			if vocal then game.logSeen(self, "%s picks up: %s.", self.name:capitalize(), o:getName{do_color=true}) end
+			local letter = string.char(string.byte('a') + (self:itemPosition(self.INVEN_INVEN, o) - 1 or 0))
+			if vocal then game.logSeen(self, "%s picks up (%s.): %s.", self.name:capitalize(), letter, o:getName{do_color=true}) end
 		elseif not prepickup then
 			if vocal then game.logSeen(self, "%s has no room for: %s.", self.name:capitalize(), o:getName{do_color=true}) end
 		end
@@ -337,6 +354,7 @@ end
 --- Re-order inventory, sorting and stacking it
 function _M:sortInven(inven)
 	if not inven then inven = self.inven[self.INVEN_INVEN] end
+	inven = self:getInven(inven)
 
 	-- Stack objects first, from bottom
 	for i = #inven, 1, -1 do
diff --git a/game/engine/interface/ControlCursorSupport.lua b/game/engine/interface/ControlCursorSupport.lua
index e913e8f38aa5395478d5e6eb6cc3c7c6a21295ee..bc24dadf0fe19cc721add6b94e095923beff47e7 100644
--- a/game/engine/interface/ControlCursorSupport.lua
+++ b/game/engine/interface/ControlCursorSupport.lua
@@ -24,8 +24,8 @@ local Dialog = require "engine.Dialog"
 
 tiles = engine.Tiles.new(16, 16)
 
---- Handles player running
--- This should work for running inside tunnel, alongside walls, in open spaces.<br/>
+--- Handles control Cursor
+-- This should work for anything that has a surface and x,y,w,h,font properties.
 module(..., package.seeall, class.make)
 
 function _M:startCursor()	
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index 77a08cadb3728d913496d4b0fd377a5ba44cf5d6..7eb5b1bc63f27959300d2dee2c6877297b036a08 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -84,7 +84,6 @@ function _M:move(x, y, force)
 		while obj do
 			if obj.auto_pickup then
 				self:pickupFloor(i, true)
-				self:sortInven()
 			else
 				nb = nb + 1
 				i = i + 1
@@ -428,7 +427,6 @@ function _M:playerPickup()
 		local titleupdator = self:getEncumberTitleUpdator("Pickup")
 		local d d = self:showPickupFloor(titleupdator(), nil, function(o, item)
 			self:pickupFloor(item, true)
-			self:sortInven()
 			self.changed = true
 			d.title = titleupdator()
 			d:used()
diff --git a/game/special/mainmenu/class/Game.lua b/game/special/mainmenu/class/Game.lua
index 2e669a19261f88773187844814dd05d9965d96a8..508ea16e7c21aaa3ebbad1658ec0274b4be6a356 100644
--- a/game/special/mainmenu/class/Game.lua
+++ b/game/special/mainmenu/class/Game.lua
@@ -234,10 +234,15 @@ function _M:selectStepNew()
 	end
 	self:registerDialog(display_module)
 
-	self.step = ButtonList.new(self.mod_list, 10, 10, self.w * 0.24, (5 + 35) * #self.mod_list, nil, 5)
+	self.step = ButtonList.new(self.mod_list, 10, 10, self.w * 0.24, (5 + 35) * #self.mod_list, nil, 5)	
+	self.step.dialog = display_module
+	self:bindKeysToStep()
+end
+
+function _M:bindKeysToStep()
 	self.step:setKeyHandling()
 	self.step:setMouseHandling()
-	self.step.key:addBind("EXIT", function() self:unregisterDialog(display_module) self:selectStepMain() end)
+	self.step.key:addBind("EXIT", function() self:unregisterDialog(self.step.dialog) self:selectStepMain() end)
 end
 
 function _M:selectStepLoad()
diff --git a/game/special/mainmenu/dialogs/EnterName.lua b/game/special/mainmenu/dialogs/EnterName.lua
index 0ccbdc8f0cc17066f91fb16c2474af3c96eacd54..3129b7c0f43a18dd7ac73ceac9b29bb1b26815f1 100644
--- a/game/special/mainmenu/dialogs/EnterName.lua
+++ b/game/special/mainmenu/dialogs/EnterName.lua
@@ -75,6 +75,7 @@ function _M:init(runmod)
 	},{
 		EXIT = function()
 			game:unregisterDialog(self)
+			game:bindKeysToStep()
 		end
 	})
 end