diff --git a/game/engine/interface/ActorTalents.lua b/game/engine/interface/ActorTalents.lua
index 3cd98b43317f6f41028e2e235f6fa439210cd7f3..f9aa38d0cb72b9578b64e13fc9c0d7b58ffc8fa5 100644
--- a/game/engine/interface/ActorTalents.lua
+++ b/game/engine/interface/ActorTalents.lua
@@ -97,13 +97,13 @@ function _M:init(t)
 end
 
 --- Make the actor use the talent
-function _M:useTalent(id, who, force_level)
+function _M:useTalent(id, who, force_level, ignore_cd, force_target)
 	who = who or self
 	local ab = _M.talents_def[id]
 	assert(ab, "trying to cast talent "..tostring(id).." but it is not defined")
 
 	if ab.mode == "activated" and ab.action then
-		if self:isTalentCoolingDown(ab) then
+		if self:isTalentCoolingDown(ab) and not ignore_cd then
 			game.logPlayer(who, "%s is still on cooldown for %d turns.", ab.name:capitalize(), self.talents_cd[ab.id])
 			return
 		end
@@ -111,19 +111,22 @@ function _M:useTalent(id, who, force_level)
 		local co = coroutine.create(function()
 			print("USING", ab, ab.name)
 			local old_level
+			local old_target
 			if force_level then old_level = who.talents[id]; who.talents[id] = force_level end
+			if force_target then old_target = rawget(who, "getTarget"); who.getTarget = function() return force_target.x, force_target.y, force_target end end
 			local ret = ab.action(who, ab)
+			if force_target then who.getTarget = old_target end
 			if force_level then who.talents[id] = old_level end
 
 			if not self:postUseTalent(ab, ret) then return end
 
 			-- Everything went ok? then start cooldown if any
-			self:startTalentCooldown(ab)
+			if not ignore_cd then self:startTalentCooldown(ab) end
 		end)
 		local ok, err = coroutine.resume(co)
 		if not ok and err then print(debug.traceback(co)) error(err) end
 	elseif ab.mode == "sustained" and ab.activate and ab.deactivate then
-		if self:isTalentCoolingDown(ab) then
+		if self:isTalentCoolingDown(ab) and not ignore_cd then
 			game.logPlayer(who, "%s is still on cooldown for %d turns.", ab.name:capitalize(), self.talents_cd[ab.id])
 			return
 		end
@@ -147,7 +150,7 @@ function _M:useTalent(id, who, force_level)
 				if not self:postUseTalent(ab, ret) then return end
 
 				-- Everything went ok? then start cooldown if any
-				self:startTalentCooldown(ab)
+				if not ignore_cd then self:startTalentCooldown(ab) end
 				self.sustain_talents[id] = nil
 			end
 		end)
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index e32c566c21e8a2908cef11aefcda432b919c5d1d..4c1a9b99f7cc06adece0667516baab03ec28f466 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -301,7 +301,7 @@ end
 -- @return true if the teleport worked
 function _M:teleportRandom(x, y, dist, min_dist)
 
-	return engine.Actor.teleportRandom(x, y, dist, min_dist)
+	return engine.Actor.teleportRandom(self, x, y, dist, min_dist)
 end
 
 --- Quake a zone
diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua
index 989d786b24f9d265f3c10cf7dbed68ed299e46e2..7d816b6da1c15e40f85c0236ff4971d8398b6044 100644
--- a/game/modules/tome/class/Object.lua
+++ b/game/modules/tome/class/Object.lua
@@ -212,6 +212,13 @@ function _M:getTextualDesc()
 		desc[#desc+1] = ("Damage on hit(melee): %s."):format(table.concat(rs, ','))
 	end
 
+	if self.combat and self.combat.talent_on_hit then
+		local rs = {}
+		for tid, data in pairs(self.combat.talent_on_hit) do
+			desc[#desc+1] = ("Talent on hit(melee): %d%% chance %s (level %d)."):format(data.chance, self:getTalentFromId(tid).name, data.level)
+		end
+	end
+
 	if w.ranged_project then
 		local rs = {}
 		for typ, dam in pairs(w.ranged_project) do
diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index bdd92ab1a59b08d90d9c24e6dd582565f96a760f..0d406b7036b4d17a3cb0099cb3bd065e62a7389e 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -252,9 +252,7 @@ function _M:attackTargetWith(target, weapon, damtype, mult)
 			local old_cd = self:isTalentCoolingDown(self:getTalentFromId(tid))
 			local old = self.energy.value
 			self.energy.value = 100000
-			self.getTarget = function() return target.x, target.y, target end
-			self:useTalent(tid)
-			self.getTarget = nil
+			self:useTalent(tid, nil, nil, nil, target)
 			self.energy.value = old
 			-- Do not setup a cooldown
 			if not old_cd then
@@ -264,6 +262,18 @@ function _M:attackTargetWith(target, weapon, damtype, mult)
 		end
 	end
 
+	-- On hit talent
+	if hitted and not target.dead and weapon.talent_on_hit and next(weapon.talent_on_hit) then
+		for tid, data in pairs(weapon.talent_on_hit) do
+			if rng.percent(data.chance) then
+				local old = self.energy.value
+				self.energy.value = 100000
+				self:useTalent(tid, nil, data.level, true, target)
+				self.energy.value = old
+			end
+		end
+	end
+
 	-- Shattering Impact
 	if hitted and self:attr("shattering_impact") then
 		local dam = dam * self.shattering_impact
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index 96797f7c206f03c19ce727bf40991c9d9d8d61b4..b688591a901dbb5397bed5ec3bdf23e920f562d9 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -496,6 +496,32 @@ After Frodo destroyed it, Elrond passed the knowledge to Aragorn the King of Men
 		},
 	},
 }
+
+newEntity{ base = "BASE_GREATMAUL",
+	unique = true,
+	name = "Mithril Hammer of Khaza'dûm", color = colors.LIGHT_RED,
+	unided_name = "flame scorched mithril hammer",
+	desc = [[The legendary hammer of the dwarven master smiths of Khaza'dûm. For ages it was used to forge powerful weapons with searing heat until it became of high power by intself.]],
+	level_range = {38, 50},
+	rarity = 250,
+	require = { stat = { str=48 }, },
+	cost = 650,
+	material_level = 5,
+	combat = {
+		dam = 82,
+		apr = 7,
+		physcrit = 4,
+		dammod = {str=1.2},
+		talent_on_hit = { [Talents.T_FLAMESHOCK] = {level=3, chance=10} },
+	},
+	wielder = {
+		inc_damage={
+			[DamageType.PHYSICAL] = 15,
+		},
+		melee_project={[DamageType.FIRE] = 30},
+	},
+}
+
 --[=[
 newEntity{
 	unique = true,