diff --git a/game/engine/Savefile.lua b/game/engine/Savefile.lua
index e2c24fa9cf95930c2d1999d6f3aeca209449e108..a6adb5b4e4d2f9036b09ccbe4e8ad60b144accee 100644
--- a/game/engine/Savefile.lua
+++ b/game/engine/Savefile.lua
@@ -130,7 +130,7 @@ end
 function _M:loadReal(load)
 	if self.loaded[load] then return self.loaded[load] end
 	local f = fs.open(self.load_dir..load, "r")
-	print("loading", load)
+--	print("loading", load)
 	local lines = {}
 	while true do
 		local l = f:read()
diff --git a/game/engine/class.lua b/game/engine/class.lua
index eb31aeb0a1feff99ad1e4cf6f99f396d91cd4621..4094960f107e04b8290d467206b7fa261686f926 100644
--- a/game/engine/class.lua
+++ b/game/engine/class.lua
@@ -173,7 +173,7 @@ local function deserialize(string, src)
 	if err then print("error deserializing", string, err) end
 	setfenv(f, {
 		setLoaded = function(name, t)
-			print("[setLoaded]", name, t)
+--			print("[setLoaded]", name, t)
 			engine.Savefile.current_save.loaded[name] = t
 		end,
 		loadstring = loadstring,
diff --git a/game/engine/interface/GameMusic.lua b/game/engine/interface/GameMusic.lua
index 4e6eac82bd976ffdbbb62df54923aabb0880d54d..7594d27281ec595deea7c6763afac940be1bd94c 100644
--- a/game/engine/interface/GameMusic.lua
+++ b/game/engine/interface/GameMusic.lua
@@ -16,6 +16,7 @@ end
 
 function _M:playMusic(name)
 	name = name or self.current_music
+	if not name then return end
 	local m = self.loaded_musics[name]
 	if not m then
 		self.loaded_musics[name] = core.sound.newMusic("/data/music/"..name)
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 0934f53ff34dd5c94a226f6a783975cbe256c270..463d04adadaab84ff084ac0277445307dd9f7ab4 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -108,6 +108,8 @@ function _M:act()
 		t.do_storm(self, t)
 	end
 
+	if self:attr("stunned") then self.energy.value = 0 end
+
 	-- Suffocate ?
 	local air_level = game.level.map:checkEntity(self.x, self.y, Map.TERRAIN, "air_level")
 	if air_level then self:suffocate(-air_level, self) end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index f0567ca2e43e62f7474effdca8e3ca12b8a7d222..a59d40da9cb866955448fd977b8f4a8450180f09 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -382,7 +382,7 @@ function _M:setupCommands()
 
 	self.key:addCommands{
 		[{"_d","ctrl"}] = function()
-			if config.settings.tome.cheat then self:changeLevel(5, "tower-amon-sul") end
+			if config.settings.tome.cheat then self:changeLevel(7, "sandworm-lair") end
 		end,
 	}
 	self.key:addBinds
diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua
index 51dce4c06dca45f14017ab5be1b4d54707c873eb..401ee5fc6cd5c4a5718a8350d6573bb43ff9be54 100644
--- a/game/modules/tome/class/Object.lua
+++ b/game/modules/tome/class/Object.lua
@@ -14,6 +14,8 @@ module(..., package.seeall, class.inherit(
 ))
 
 function _M:init(t, no_default)
+	t.encumber = t.encumber or 0
+
 	engine.Object.init(self, t, no_default)
 	engine.interface.ObjectActivable.init(self, t)
 	engine.interface.ObjectIdentify.init(self, t)
diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index 438a96dff39451a0cecba20928aaa97e41585977..4662b2866c3357c9fee18c2ba3e4df0b52384cf0 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -152,7 +152,7 @@ function _M:archeryShoot(damtype, mult, on_hit, tg, params)
 				dam = rng.range(dam, dam * damrange)
 				print("[ATTACK] after range", dam)
 				local crit
-				dam, crit = self:physicalCrit(dam, ammo)
+				dam, crit = self:physicalCrit(dam, ammo, target)
 				print("[ATTACK] after crit", dam)
 				dam = dam * mult
 				print("[ATTACK] after mult", dam)
@@ -233,7 +233,7 @@ function _M:attackTargetWith(target, weapon, damtype, mult)
 		dam = rng.range(dam, dam * damrange)
 		print("[ATTACK] after range", dam)
 		local crit
-		dam, crit = self:physicalCrit(dam, weapon)
+		dam, crit = self:physicalCrit(dam, weapon, target)
 		print("[ATTACK] after crit", dam)
 		dam = dam * mult
 		print("[ATTACK] after mult", dam)
@@ -381,15 +381,16 @@ function _M:combatSpellSpeed()
 end
 
 --- Computes physical crit for a damage
-function _M:physicalCrit(dam, weapon)
+function _M:physicalCrit(dam, weapon, target)
 	if self:isTalentActive(self.T_STEALTH) and self:knowTalent(self.T_SHADOWSTRIKE) then
 		return dam * (2 + self:getTalentLevel(self.T_SHADOWSTRIKE) / 5), true
 	end
 
 	local chance = self:combatCrit(weapon)
 	local crit = false
-	if self:knowTalent(self.T_BACKSTAB) then chance = chance + self:getTalentLevel(self.T_BACKSTAB) * 10 end
+	if self:knowTalent(self.T_BACKSTAB) and target:attr("stunned") then chance = chance + self:getTalentLevel(self.T_BACKSTAB) * 10 end
 
+	print("[PHYS CRIT %]", chance)
 	if rng.percent(chance) then
 		dam = dam * 2
 		crit = true
@@ -405,8 +406,9 @@ function _M:spellCrit(dam)
 
 	local chance = self:combatSpellCrit()
 	local crit = false
-	if self:knowTalent(self.T_BACKSTAB) then chance = chance + self:getTalentLevel(self.T_BACKSTAB) * 10 end
+--	if self:knowTalent(self.T_BACKSTAB) then chance = chance + self:getTalentLevel(self.T_BACKSTAB) * 10 end
 
+	print("[SPELL CRIT %]", chance)
 	if rng.percent(chance) then
 		dam = dam * 2
 		crit = true
diff --git a/game/modules/tome/data/talents/cunning/dirty.lua b/game/modules/tome/data/talents/cunning/dirty.lua
index 4f17e97a3c8ce591b1e1aea1e69c62cbccb60d82..01820d09a7cd4542b10b383ffd077d0d8caf5797 100644
--- a/game/modules/tome/data/talents/cunning/dirty.lua
+++ b/game/modules/tome/data/talents/cunning/dirty.lua
@@ -76,3 +76,39 @@ newTalent{
 	end,
 }
 
+newTalent{
+	name = "Cripple",
+	type = {"cunning/dirty", 4},
+	points = 5,
+	cooldown = 25,
+	stamina = 30,
+	require = cuns_req4,
+	action = function(self, t)
+		local tg = {type="hit", range=self:getTalentRange(t)}
+		local x, y, target = self:getTarget(tg)
+		if not x or not y or not target then return nil end
+		if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
+		local hitted = self:attackTarget(target, nil, 0.9 + self:getTalentLevel(t) / 9, true)
+
+		if hitted then
+			if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 5 - self:getTalentLevel(t) / 2) then
+				local tw = target:getInven("MAINHAND")
+				if tw then
+					tw = tw[1] and tw[1].combat
+				end
+				tw = tw or target.combat
+				local atk = target:combatAttack(tw) * (10 + self:getTalentLevel(t) * 3) / 100
+				local dam = target:combatDamage(tw) * (10 + self:getTalentLevel(t) * 4) / 100
+				target:setEffect(target.EFF_CRIPPLE, 3 + math.ceil(self:getTalentLevel(t)), {atk=atk, dam=dam})
+			else
+				game.logSeen(target, "%s is not crippled!", target.name:capitalize())
+			end
+		end
+
+		return true
+	end,
+	info = function(self, t)
+		return ([[You hit your target doing %d%% damage. If your attack hits the target is cripple for %d turns, losing %d%% attack and %d%% damage.]]):
+		format(100 * (0.9 + self:getTalentLevel(t) / 9), 3 + math.ceil(self:getTalentLevel(t)), 10 + self:getTalentLevel(t) * 3, 10 + self:getTalentLevel(t) * 4)
+	end,
+}
diff --git a/game/modules/tome/data/talents/cunning/lethality.lua b/game/modules/tome/data/talents/cunning/lethality.lua
index 7df0d51221e712df80d9799251620cdbf48ef153..fb72020e0dfe7ff462d58998e10d6a74ce31dd37 100644
--- a/game/modules/tome/data/talents/cunning/lethality.lua
+++ b/game/modules/tome/data/talents/cunning/lethality.lua
@@ -37,4 +37,23 @@ newTalent{
 		The APR will increase with Cunning.]]):
 		format(100 * (0.8 + self:getTalentLevel(t) / 10), 4 + (self:getTalentLevel(t) * self:getCun()) / 20, 5 + math.ceil(self:getTalentLevel(t)))
 	end,
-}
\ No newline at end of file
+}
+
+newTalent{
+	name = "Willful Combat",
+	type = {"cunning/lethality", 3},
+	points = 5,
+	cooldown = 60,
+	stamina = 25,
+	require = cuns_req3,
+	action = function(self, t)
+		local dur = 3 + math.ceil(self:getTalentLevel(t) * 1.5)
+		local power = self:getWil(70)
+		self:setEffect(self.EFF_WILLFUL_COMBAT, dur, {power=power})
+		return true
+	end,
+	info = function(self, t)
+		return ([[For a %d turns you put all your will into your blows, additing %d (based on Willpower) damage to each strikes.]]):
+		format(3 + math.ceil(self:getTalentLevel(t) * 1.5), self:getWil(70))
+	end,
+}
diff --git a/game/modules/tome/data/talents/cunning/survival.lua b/game/modules/tome/data/talents/cunning/survival.lua
index 405513c2a42db072933e121c1ee10b347f1fed30..8079d77ed3ae0bdb5bf4c01ee183605a81780917 100644
--- a/game/modules/tome/data/talents/cunning/survival.lua
+++ b/game/modules/tome/data/talents/cunning/survival.lua
@@ -40,3 +40,15 @@ newTalent{
 		format(self:getTalentLevel(t) * self:getCun(25))
 	end,
 }
+
+newTalent{
+	name = "Long Strides",
+	type = {"cunning/survival", 4},
+	require = cuns_req4,
+	mode = "passive",
+	points = 5,
+	info = function(self, t)
+		return ([[Reduces the movement penality when moving over dangerous terrain.]]):
+		format()
+	end,
+}
diff --git a/game/modules/tome/data/talents/techniques/archery.lua b/game/modules/tome/data/talents/techniques/archery.lua
index e56e1c3f6a8087302cd0e6e8647b119517176d6c..66f99469f6b30727f16c218d91a6733ea08c6ba8 100644
--- a/game/modules/tome/data/talents/techniques/archery.lua
+++ b/game/modules/tome/data/talents/techniques/archery.lua
@@ -128,7 +128,7 @@ newTalent{
 	end,
 }
 
--------------------------------- Urtility -----------------------------------
+-------------------------------- Utility -----------------------------------
 
 newTalent{
 	name = "Ammo Creation",
diff --git a/game/modules/tome/data/timed_effects.lua b/game/modules/tome/data/timed_effects.lua
index cd5aadcf90bfc8ae4a1c196cc22a97316851118c..dcb94c33c4dfa33ba26775413df266fc879e3238 100644
--- a/game/modules/tome/data/timed_effects.lua
+++ b/game/modules/tome/data/timed_effects.lua
@@ -89,14 +89,10 @@ newEffect{
 		self.color_b = 155
 		game.level.map:updateMap(self.x, self.y)
 
-		-- Frozen, cannot act
-		self.energy.value = 0
-	end,
-	on_timeout = function(self, eff)
-		-- Frozen, cannot act
-		self.energy.value = 0
+		eff.tmpid = self:addTemporaryValue("stunned", 1)
 	end,
 	deactivate = function(self, eff)
+		self:removeTemporaryValue("stunned", eff.tmpid)
 		self.color_r = eff.old_r
 		self.color_g = eff.old_g
 		self.color_b = eff.old_b
@@ -112,12 +108,14 @@ newEffect{
 	on_gain = function(self, err) return "#Target# is stunned by the burning flame!", "+Burning Shock" end,
 	on_lose = function(self, err) return "#Target# is not stunned anymore.", "-Burning Shock" end,
 	activate = function(self, eff)
-		self.energy.value = 0
+		eff.tmpid = self:addTemporaryValue("stunned", 1)
 	end,
 	on_timeout = function(self, eff)
-		self.energy.value = 0
 		DamageType:get(DamageType.FIRE).projector(eff.src, self.x, self.y, DamageType.FIRE, eff.power)
 	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("stunned", eff.tmpid)
+	end,
 }
 
 newEffect{
@@ -129,12 +127,10 @@ newEffect{
 	on_gain = function(self, err) return "#Target# is stunned!", "+Stunned" end,
 	on_lose = function(self, err) return "#Target# is not stunned anymore.", "-Stunned" end,
 	activate = function(self, eff)
-		-- Frozen, cannot act
-		self.energy.value = 0
+		eff.tmpid = self:addTemporaryValue("stunned", 1)
 	end,
-	on_timeout = function(self, eff)
-		-- Frozen, cannot act
-		self.energy.value = 0
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("stunned", eff.tmpid)
 	end,
 }
 
@@ -550,3 +546,37 @@ newEffect{
 		self:removeTemporaryValue("inc_stats", eff.tmpid)
 	end,
 }
+
+newEffect{
+	name = "CRIPPLE",
+	desc = "Cripple",
+	type = "physical",
+	status = "detrimental",
+	parameters = { atk=10, dam=10 },
+	on_gain = function(self, err) return "#Target# is crippled." end,
+	on_lose = function(self, err) return "#Target# is not cripple anymore." end,
+	activate = function(self, eff)
+		eff.atkid = self:addTemporaryValue("combat_atk", -eff.atk)
+		eff.damid = self:addTemporaryValue("combat_dam", -eff.dam)
+	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("combat_atk", eff.atkid)
+		self:removeTemporaryValue("combat_dam", eff.damid)
+	end,
+}
+
+newEffect{
+	name = "WILLFUL_COMBAT",
+	desc = "Willful Combat",
+	type = "physical",
+	status = "beneficial",
+	parameters = { power=10 },
+	on_gain = function(self, err) return "#Target# lashes out with pure willpower." end,
+	on_lose = function(self, err) return "#Target# willpower rush ends.." end,
+	activate = function(self, eff)
+		eff.tmpid = self:addTemporaryValue("combat_dam", eff.power)
+	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("combat_dam", eff.tmpid)
+	end,
+}
diff --git a/ideas/cunning.ods b/ideas/cunning.ods
index 58e479e81f19319e7c7f14322aef39f7e20fe018..4f3b823ab01ac7fe9959d7d006d265c14ab24e8c 100644
Binary files a/ideas/cunning.ods and b/ideas/cunning.ods differ