diff --git a/game/engine/interface/PlayerRun.lua b/game/engine/interface/PlayerRun.lua
index 752f13c764689691b709ad49579fd39e2f657b91..2f7748f1eada39702a880ab794f94bab2b544098 100644
--- a/game/engine/interface/PlayerRun.lua
+++ b/game/engine/interface/PlayerRun.lua
@@ -75,6 +75,7 @@ function _M:runStep()
 		return false
 	else
 		self:moveDir(self.running.dir)
+		if not self.running then return false end
 		self.running.cnt = self.running.cnt + 1
 		if self.running.newdir then
 			self.running.dir = self.running.newdir
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 5ed29c2acba1fbcb5a3aa1d85dd9cbe302f6efd4..77bc5efaeaa59da076a3673a68fef6c8538c9af1 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -183,7 +183,8 @@ function _M:probabilityTravel(x, y, dist)
 	return true
 end
 
---- Reveals location surrounding the actor
+--- Quake a zone
+-- Moves randomly each grid to an other grid
 function _M:doQuake(tg, x, y)
 	local locs = {}
 	local ms = {}
@@ -288,16 +289,20 @@ function _M:onTakeHit(value, src)
 	return value
 end
 
+function _M:resolveSource()
+	if self.summoner_gain_exp and self.summoner then
+		return self.summoner:resolveSource()
+	else
+		return self
+	end
+end
+
 function _M:die(src)
 	engine.interface.ActorLife.die(self, src)
 
 	-- Gives the killer some exp for the kill
 	if src then
-		if src.summoner_gain_exp and src.summoner then
-			src.summoner:gainExp(self:worthExp(src.summoner))
-		else
-			src:gainExp(self:worthExp(src))
-		end
+		src:resolveSource():gainExp(self:worthExp(src:resolveSource()))
 	end
 	-- Do we get a blooooooody death ?
 	if rng.percent(33) then self:bloodyDeath() end
diff --git a/game/modules/tome/data/general/grids/sand.lua b/game/modules/tome/data/general/grids/sand.lua
index 91d2cb832ed75d5b596d8b382d488806c7c65557..8a510d302af9af9b404fe25a6c081860f98bda80 100644
--- a/game/modules/tome/data/general/grids/sand.lua
+++ b/game/modules/tome/data/general/grids/sand.lua
@@ -35,6 +35,8 @@ newEntity{
 				end
 			end
 		}
+		sand.summoner_gain_exp = true
+		sand.summoner = src
 		sand.old_feat = old
 		sand.temporary = 20
 		sand.x = x
diff --git a/game/modules/tome/data/talents/gifts/cold-drake.lua b/game/modules/tome/data/talents/gifts/cold-drake.lua
index f761f251073b1b1c34ceccc1e0e60ec21839ac6c..a0f59dfe3f950de6fa1ed6f5b756d276eaa355ff 100644
--- a/game/modules/tome/data/talents/gifts/cold-drake.lua
+++ b/game/modules/tome/data/talents/gifts/cold-drake.lua
@@ -85,7 +85,9 @@ newTalent{
 					game.level:removeEntity(self)
 					game.level.map:redisplay()
 				end
-			end
+			end,
+			summoner_gain_exp = true,
+			summoner = self,
 		}
 		game.level:addEntity(e)
 		game.level.map(x, y, Map.TERRAIN, e)
diff --git a/game/modules/tome/data/talents/spells/earth.lua b/game/modules/tome/data/talents/spells/earth.lua
index 348c7bdb85df8e8e5846d0dfb44fc981daab54df..275b0901926923e7135bef557e22d10810c3bb3f 100644
--- a/game/modules/tome/data/talents/spells/earth.lua
+++ b/game/modules/tome/data/talents/spells/earth.lua
@@ -115,7 +115,9 @@ newTalent{
 							game.level:removeEntity(self)
 							game.level.map:redisplay()
 						end
-					end
+					end,
+					summoner_gain_exp = true,
+					summoner = self,
 				}
 				game.level:addEntity(e)
 				game.level.map(x + i, y + j, Map.TERRAIN, e)
diff --git a/game/modules/tome/data/zones/maze/npcs.lua b/game/modules/tome/data/zones/maze/npcs.lua
index cd8e3fbc16900e9fa66c531c5de1971c5d551865..161bc0bb0fbd5230e1067feae9efd7470a186144 100644
--- a/game/modules/tome/data/zones/maze/npcs.lua
+++ b/game/modules/tome/data/zones/maze/npcs.lua
@@ -42,6 +42,6 @@ newEntity{ define_as = "MINOTAUR_MAZE",
 	ai = "dumb_talented_simple", ai_state = { talent_in=1, },
 
 	on_die = function(self, who)
-		who:setQuestStatus("starter-zones", engine.Quest.COMPLETED, "maze")
+		who:resolveSource():setQuestStatus("starter-zones", engine.Quest.COMPLETED, "maze")
 	end,
 }
diff --git a/game/modules/tome/data/zones/old-forest/npcs.lua b/game/modules/tome/data/zones/old-forest/npcs.lua
index 25134ca6a25124c9a9aedbf0b3c80c0466de4533..8dc86d14c1558061e1e759d7aa8d3702ac98a25f 100644
--- a/game/modules/tome/data/zones/old-forest/npcs.lua
+++ b/game/modules/tome/data/zones/old-forest/npcs.lua
@@ -43,6 +43,6 @@ newEntity{ define_as = "OLD_MAN_WILLOW",
 	ai = "dumb_talented_simple", ai_state = { talent_in=3, },
 
 	on_die = function(self, who)
-		who:setQuestStatus("starter-zones", engine.Quest.COMPLETED, "old-forest")
+		who:resolveSource():setQuestStatus("starter-zones", engine.Quest.COMPLETED, "old-forest")
 	end,
 }
diff --git a/game/modules/tome/data/zones/sandworm-lair/npcs.lua b/game/modules/tome/data/zones/sandworm-lair/npcs.lua
index 2f260465e4b9cdb307d59da71bf4e254143803a0..c6be70582209b88111960149bf728524bd587024 100644
--- a/game/modules/tome/data/zones/sandworm-lair/npcs.lua
+++ b/game/modules/tome/data/zones/sandworm-lair/npcs.lua
@@ -63,6 +63,6 @@ newEntity{ define_as = "SANDWORM_QUEEN",
 	ai = "dumb_talented_simple", ai_state = { talent_in=2, },
 
 	on_die = function(self, who)
-		who:setQuestStatus("starter-zones", engine.Quest.COMPLETED, "sandworm-lair")
+		who:resolveSource():setQuestStatus("starter-zones", engine.Quest.COMPLETED, "sandworm-lair")
 	end,
 }
diff --git a/game/modules/tome/data/zones/tol-falas/npcs.lua b/game/modules/tome/data/zones/tol-falas/npcs.lua
index b208f02b164fe2719fd3042dedbc9e1136ae9fdb..7a9b14545682eaee42a911646d9461cce78bf1e5 100644
--- a/game/modules/tome/data/zones/tol-falas/npcs.lua
+++ b/game/modules/tome/data/zones/tol-falas/npcs.lua
@@ -55,6 +55,6 @@ newEntity{ define_as = "THE_MASTER",
 	ai = "dumb_talented_simple", ai_state = { talent_in=1, },
 
 	on_die = function(self, who)
-		who:setQuestStatus("tol-falas", engine.Quest.DONE)
+		who:resolveSource():setQuestStatus("tol-falas", engine.Quest.DONE)
 	end,
 }
diff --git a/game/modules/tome/data/zones/tower-amon-sul/npcs.lua b/game/modules/tome/data/zones/tower-amon-sul/npcs.lua
index 7ae3df66ab0a2c1c2dd17f82a728d3186403bf1d..f803161db6fbeb9d908af7bffe92a1e9b27de698 100644
--- a/game/modules/tome/data/zones/tower-amon-sul/npcs.lua
+++ b/game/modules/tome/data/zones/tower-amon-sul/npcs.lua
@@ -31,6 +31,6 @@ newEntity{ define_as = "SHADE_OF_ANGMAR",
 	ai = "dumb_talented_simple", ai_state = { talent_in=4, },
 
 	on_die = function(self, who)
-		who:setQuestStatus("start-dunadan", engine.Quest.COMPLETED, "amon-sul")
+		who:resolveSource():setQuestStatus("start-dunadan", engine.Quest.COMPLETED, "amon-sul")
 	end,
 }
diff --git a/game/modules/tome/data/zones/trollshaws/npcs.lua b/game/modules/tome/data/zones/trollshaws/npcs.lua
index fc061da025830d5c1509484ce6b7665111f22979..b5794d17b883e9411587ac1f1a350c4dc276c31f 100644
--- a/game/modules/tome/data/zones/trollshaws/npcs.lua
+++ b/game/modules/tome/data/zones/trollshaws/npcs.lua
@@ -34,6 +34,6 @@ newEntity{ define_as = "TROLL_BILL",
 	ai = "dumb_talented_simple", ai_state = { talent_in=4, },
 
 	on_die = function(self, who)
-		who:setQuestStatus("start-dunadan", engine.Quest.COMPLETED, "trollshaws")
+		who:resolveSource():setQuestStatus("start-dunadan", engine.Quest.COMPLETED, "trollshaws")
 	end,
 }