diff --git a/game/engine/Dialog.lua b/game/engine/Dialog.lua
index b2b0b9af494ce9abcd83e29da5873ad59a5f536f..882b86114834b963f8bd6b9b11c676eb05c4bd25 100644
--- a/game/engine/Dialog.lua
+++ b/game/engine/Dialog.lua
@@ -100,12 +100,9 @@ function _M:drawDialog(s)
 end
 
 function _M:keyCommands(t, b)
-	self.old_key = game.key
-	game.key = engine.KeyBind.new()
-	if t then game.key:addCommands(t) end
-	if b then game.key:addBinds(b) end
-	game.key:setCurrent()
-	self.key = game.key
+	self.key = engine.KeyBind.new()
+	if t then self.key:addCommands(t) end
+	if b then self.key:addBinds(b) end
 end
 
 function _M:mouseZones(t)
@@ -117,13 +114,12 @@ function _M:mouseZones(t)
 		end
 	end
 
-	self.old_mouse = game.mouse
-	game.mouse = engine.Mouse.new()
-	game.mouse:registerZones(t)
-	game.mouse:setCurrent()
+	self.mouse = engine.Mouse.new()
+	self.mouse:registerZones(t)
 end
 
 function _M:unload()
+--[[
 	if self.old_key then
 		game.key = self.old_key
 		game.key:setCurrent()
@@ -132,6 +128,7 @@ function _M:unload()
 		game.mouse = self.old_mouse
 		game.mouse:setCurrent()
 	end
+]]
 end
 
 function _M:drawWBorder(s, x, y, w)
diff --git a/game/engine/Game.lua b/game/engine/Game.lua
index 9d5437ddfc6f280a4f8b9e54d21b9777cc7f8d44..50e2d016f814cbd489f886cb72feea1fd928f499 100644
--- a/game/engine/Game.lua
+++ b/game/engine/Game.lua
@@ -129,6 +129,8 @@ end
 function _M:registerDialog(d)
 	table.insert(self.dialogs, d)
 	self.dialogs[d] = #self.dialogs
+	if d.key then d.key:setCurrent() end
+	if d.mouse then d.mouse:setCurrent() end
 end
 
 --- Undisplay a dialog, removing its own keyhandler if needed
@@ -137,6 +139,12 @@ function _M:unregisterDialog(d)
 	table.remove(self.dialogs, self.dialogs[d])
 	self.dialogs[d] = nil
 	d:unload()
+	-- Update positions
+	for i, id in ipairs(self.dialogs) do self.dialogs[id] = i end
+
+	local last = self.dialogs[#self.dialogs] or self
+	if last.key then last.key:setCurrent() end
+	if last.mouse then last.mouse:setCurrent() end
 end
 
 --- The C core gives us command line arguments
diff --git a/game/engine/Key.lua b/game/engine/Key.lua
index d49268f2e4d3b62b00e7c9dcad150140a655a7a4..1d2e1c1937a891e271a3519f1422bf87df45a690 100644
--- a/game/engine/Key.lua
+++ b/game/engine/Key.lua
@@ -40,7 +40,7 @@ end
 --- Setups as the current game keyhandler
 function _M:setCurrent()
 	core.key.set_current_handler(self)
-	if game then game.key = self end
+--	if game then game.key = self end
 	_M.current = self
 end
 
diff --git a/game/engine/Mouse.lua b/game/engine/Mouse.lua
index bd7e9aafdce225a54d90b7861e2370bfcbf54985..585d9f41d0210070e552462ab2c3736614627c1d 100644
--- a/game/engine/Mouse.lua
+++ b/game/engine/Mouse.lua
@@ -50,7 +50,7 @@ end
 --- Setups as the current game keyhandler
 function _M:setCurrent()
 	core.mouse.set_current_handler(self)
-	if game then game.mouse = self end
+--	if game then game.mouse = self end
 	_M.current = self
 end
 
diff --git a/game/engine/interface/GameMusic.lua b/game/engine/interface/GameMusic.lua
index 5477d3caeaee15ae23c75647b9bd0fd579d0a373..cb80dd25f33774fc66f2b1f72e985fb2e58e2f09 100644
--- a/game/engine/interface/GameMusic.lua
+++ b/game/engine/interface/GameMusic.lua
@@ -32,7 +32,7 @@ function _M:loaded()
 	self.loaded_musics = self.loaded_musics or {}
 end
 
-function _M:playMusic(name)
+function _M:playMusic(name, loop)
 	name = name or self.current_music
 	if not name then return end
 	local m = self.loaded_musics[name]
@@ -45,7 +45,7 @@ function _M:playMusic(name)
 	if self.current_music then
 		core.sound.musicStop()
 	end
-	m:play()
+	m:play(loop or -1)
 	self.current_music = name
 	self.playing_music = true
 end
diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index 84275424f23b45ba0b0c0f55d6fc306a5accfa3e..3e3cc5cdde257eaa3201e2f5164ffd6368b0370d 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -164,6 +164,7 @@ function _M:archeryShoot(damtype, mult, on_hit, tg, params)
 
 			local target = game.level.map(tx, ty, game.level.map.ACTOR)
 			if not target then return end
+			ret.firsttarget = ret.firsttarget or target
 			ammo = ammo.combat
 
 			damtype = damtype or ammo.damtype or DamageType.PHYSICAL
@@ -211,8 +212,8 @@ function _M:archeryShoot(damtype, mult, on_hit, tg, params)
 	-- If we used only one arrow, use it
 	if params.one_shot then self:removeObject(self:getInven("QUIVER"), 1) end
 
-	if sound then game:playSoundNear(self, sound)
-	elseif sound_miss then game:playSoundNear(self, sound_miss) end
+	if sound then game:playSoundNear(ret.firsttarget or self, sound)
+	elseif sound_miss then game:playSoundNear(ret.firsttarget or self, sound_miss) end
 
 	return ret.hitted
 end