diff --git a/game/engines/default/data/gfx/background/tome.png b/game/engines/default/data/gfx/background/tome.png
index a62bfd1a23d617e50bf3d250712fb6f13f5f6dd8..3a12105ded55a45ed575d7b8d7c1c9436338bc89 100644
Binary files a/game/engines/default/data/gfx/background/tome.png and b/game/engines/default/data/gfx/background/tome.png differ
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 25b8fad1bde392c7908886adf6c98498fa5c666b..4b2f51a0997e28fe018d09d493a20940732995bc 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -381,6 +381,16 @@ function _M:actBase()
 			local t = self:getTalentFromId(self.T_CARBON_SPIKES)
 			t.do_carbonRegrowth(self, t)
 		end
+		if self:knowTalent(self.T_UNFLINCHING_RESOLVE) then
+			local t = self:getTalentFromId(self.T_UNFLINCHING_RESOLVE)
+			t.do_unflinching_resolve(self, t)
+		end
+		if self:isTalentActive(self.T_DAUNTING_PRESENCE) then
+			local t = self:getTalentFromId(self.T_DAUNTING_PRESENCE)
+			if self.life < t.getMinimumLife(self, t) then
+				self:forceUseTalent(self.T_DAUNTING_PRESENCE, {ignore_energy=true})
+			end
+		end
 	end
 
 	-- Suffocate ?
@@ -401,12 +411,16 @@ function _M:act()
 	if self.mana < 1 or self.stamina < 1 or self.psi < 1 then
 		for tid, _ in pairs(self.sustain_talents) do
 			local t = self:getTalentFromId(tid)
-			if (t.sustain_mana and self.mana < 1) or (t.sustain_stamina and self.stamina < 1) then
+			if (t.sustain_mana and self.mana < 1) or (t.sustain_stamina and self.stamina < 1 and not self:hasEffect(self.EFF_ADRENALINE_SURGE)) then
 				self:forceUseTalent(tid, {ignore_energy=true})
 			elseif (t.sustain_psi and self.psi < 1) and t.remove_on_zero then
 				self:forceUseTalent(tid, {ignore_energy=true})
 			end
 		end
+		-- clear grappling
+		if self:hasEffect(self.EFF_GRAPPLING) and not self:hasEffect(self.EFF_ADRENALINE_SURGE) then
+			self:removeEffect(self.EFF_GRAPPLING)
+		end
 	end
 
 	-- Conduit talent prevents all auras from cooling down
@@ -1275,6 +1289,18 @@ function _M:onTakeHit(value, src)
 	end
 
 	if self.on_takehit then value = self:check("on_takehit", value, src) end
+	
+	-- VITALITY?
+	if self:knowTalent(self.T_VITALITY) and self.life > self.max_life /2 and self.life - value <= self.max_life/2 then
+		local t = self:getTalentFromId(self.T_VITALITY)
+		t.do_vitality_recovery(self, t)
+	end
+	
+	-- Daunting Presence?
+	if self:isTalentActive(self.T_DAUNTING_PRESENCE) and value > (self.max_life / 20) then
+		local t = self:getTalentFromId(self.T_DAUNTING_PRESENCE)
+		t.do_daunting_presence(self, t)
+	end
 
 	-- Shield of Light
 	if value > 0 and self:isTalentActive(self.T_SHIELD_OF_LIGHT) then
@@ -1300,14 +1326,7 @@ function _M:onTakeHit(value, src)
 		game.logSeen(self, "%s has been saved by a blast of positive energy!", self.name:capitalize())
 		self:forceUseTalent(self.T_SECOND_LIFE, {ignore_energy=true})
 	end
-
-	-- Unflinching Resolve
-	if self:knowTalent(self.T_UNFLINCHING_RESOLVE) and value >= (self.max_life / 10) then
-		local t = self:getTalentFromId(self.T_UNFLINCHING_RESOLVE)
-		local dam = value
-		t.on_hit(self, t, dam)
-	end
-
+	
 	-- Shade's reform
 	if value >= self.life and self.ai_state and self.ai_state.can_reform then
 		local t = self:getTalentFromId(self.T_SHADOW_REFORM)
@@ -2179,6 +2198,24 @@ function _M:incParadox(paradox)
 	return previous_incParadox(self, paradox)
 end
 
+-- Overwrite incStamina to set up Adrenaline Surge
+local previous_incStamina = _M.incStamina
+
+function _M:incStamina(stamina)
+	if stamina < 0 and self:hasEffect(self.EFF_ADRENALINE_SURGE) then
+		local stamina_cost = math.abs(stamina)
+		if self.stamina - stamina_cost < 0 then
+			local damage = stamina_cost - (self.stamina or 0)
+			self:incStamina(-self.stamina or 0)
+			self.life = self.life - damage -- directly spend life; no resistance applies
+		else
+			return previous_incStamina(self, stamina)
+		end
+	else
+		return previous_incStamina(self, stamina)
+	end
+end
+
 --- Called before a talent is used
 -- Check the actor can cast it
 -- @param ab the talent (not the id, the table)
@@ -2197,7 +2234,7 @@ function _M:preUseTalent(ab, silent, fake)
 		if not silent then game.logSeen(self, "The spell fizzles.") end
 		return false
 	end
-
+	
 	-- when using unarmed techniques check for weapons and heavy armor
 	if ab.is_unarmed and not (ab.mode == "sustained" and self:isTalentActive(ab.id)) then
 		-- first check for heavy and massive armor
@@ -2248,7 +2285,7 @@ function _M:preUseTalent(ab, silent, fake)
 			if not silent then game.logPlayer(self, "You do not have enough mana to cast %s.", ab.name) end
 			return false
 		end
-		if ab.stamina and self:getStamina() < ab.stamina * (100 + self:combatFatigue()) / 100 then
+		if ab.stamina and self:getStamina() < ab.stamina * (100 + self:combatFatigue()) / 100 and not self:hasEffect(self.EFF_ADRENALINE_SURGE) then
 			if not silent then game.logPlayer(self, "You do not have enough stamina to use %s.", ab.name) end
 			return false
 		end
@@ -2921,7 +2958,6 @@ function _M:on_set_temporary_effect(eff_id, e, p)
 		end
 		p.total_dur = p.dur
 		p.apply_power = nil
-		
 	end
 
 	if e.status == "detrimental" and self:knowTalent(self.T_RESILIENT_BONES) then
@@ -2935,6 +2971,10 @@ function _M:on_set_temporary_effect(eff_id, e, p)
 		local t = self:getTalentFromId(self.T_SUPPRESSION)
 		p.dur = math.ceil(p.dur * (1 - (t.getPercent(self, t)/100)))
 	end
+	if self:knowTalent(self.T_VITALITY) and e.status == "detrimental" and (e.subtype.wound or e.subtype.poison or e.subtype.disease) then
+		local t = self:getTalentFromId(self.T_VITALITY) 
+		p.dur = math.ceil(p.dur * (1 - t.getWoundReduction(self, t)))
+	end
 	if e.status == "detrimental" and self:attr("negative_status_effect_immune") then
 		p.dur = 0
 	end
diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index 0e86bfc7950084367dc79f9940ce106d4ca894a7..233469fea306b2c92ba713966206d2cd379a5eeb 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -572,10 +572,6 @@ function _M:combatArmor()
 	if self:hasHeavyArmor() and self:knowTalent(self.T_ARMOUR_TRAINING) then
 		add = add + self:getTalentLevel(self.T_ARMOUR_TRAINING) * 1.4
 	end
-	if self:knowTalent(self.T_PHYSICAL_CONDITIONING) then
-		local t = self:getTalentFromId(self.T_PHYSICAL_CONDITIONING)
-		add = add + t.getArmor(self, t)
-	end
 	if self:knowTalent(self.T_CARBON_SPIKES) and self:isTalentActive(self.T_CARBON_SPIKES) then
 		add = add + self.carbon_armor
 	end
@@ -886,10 +882,6 @@ end
 --- Computes physical resistance
 function _M:combatPhysicalResist()
 	local add = 0
-	if self:knowTalent(self.T_PHYSICAL_CONDITIONING) then
-		local t = self:getTalentFromId(self.T_PHYSICAL_CONDITIONING)
-		add = add + t.getPhysical(self, t)
-	end
 	if self:knowTalent(self.T_POWER_IS_MONEY) then
 		add = add + util.bound(self.money / (80 - self:getTalentLevelRaw(self.T_POWER_IS_MONEY) * 5), 0, self:getTalentLevelRaw(self.T_POWER_IS_MONEY) * 10)
 	end
diff --git a/game/modules/tome/data/birth/classes/warrior.lua b/game/modules/tome/data/birth/classes/warrior.lua
index 06780509c8d2564b9bedb0148da0268c4de6e658..5045bf89752e3b98dbb6b104fa511dfef38e5446 100644
--- a/game/modules/tome/data/birth/classes/warrior.lua
+++ b/game/modules/tome/data/birth/classes/warrior.lua
@@ -42,90 +42,90 @@ newBirthDescriptor{
 
 newBirthDescriptor{
 	type = "subclass",
-	name = "Fighter",
+	name = "Berserker",
 	desc = {
-		"A Fighter specializes in weapon and shield combat, rarely leaving the cover of her many protective techniques.",
-		"A good Fighter is able to withstand terrible attacks from all sides, protected by her shield, and when the time comes lash out at her foes with incredible strength.",
-		"Their most important stats are: Strength and Dexterity",
+		"A Berserker wields huge two-handed weapons of destruction, bringing pain and death to his foes as he cleaves them in two.",
+		"A Berserker usually forfeits all ideas of self-defense to concentrate on what he does best: killing things.",
+		"Their most important stats are: Strength and Constitution",
 		"#GOLD#Stat modifiers:",
-		"#LIGHT_BLUE# * +5 Strength, +2 Dexterity, +2 Constitution",
+		"#LIGHT_BLUE# * +5 Strength, +1 Dexterity, +3 Constitution",
 		"#LIGHT_BLUE# * +0 Magic, +0 Willpower, +0 Cunning",
 	},
-	stats = { str=5, con=2, dex=2, },
+	stats = { str=5, con=3, dex=1, },
 	talents_types = {
 		["technique/archery-training"]={false, 0.1},
-		["technique/shield-offense"]={true, 0.3},
-		["technique/shield-defense"]={true, 0.3},
-		["technique/2hweapon-offense"]={false, -0.1},
+		["technique/shield-defense"]={false, -0.1},
+		["technique/2hweapon-offense"]={true, 0.3},
+		["technique/2hweapon-cripple"]={true, 0.3},
 		["technique/combat-techniques-active"]={true, 0.3},
 		["technique/combat-techniques-passive"]={true, 0.3},
 		["technique/combat-training"]={true, 0.3},
 		["technique/superiority"]={false, 0.3},
 		["technique/warcries"]={false, 0.3},
-		["technique/battle-tactics"]={false, 0.3},
 		["technique/field-control"]={false, 0},
+		["technique/bloodthirst"]={false, 0.2},
 		["cunning/survival"]={true, 0},
 		["cunning/dirty"]={false, 0},
 	},
 	talents = {
-		[ActorTalents.T_SHIELD_PUMMEL] = 1,
-		[ActorTalents.T_SHIELD_WALL] = 1,
+		[ActorTalents.T_DEATH_DANCE] = 1,
+		[ActorTalents.T_STUNNING_BLOW] = 1,
 		[ActorTalents.T_WEAPON_COMBAT] = 1,
-		[ActorTalents.T_ARMOUR_TRAINING] = 3,
+		[ActorTalents.T_ARMOUR_TRAINING] = 2,
 	},
 	copy = {
 		resolvers.equip{ id=true,
-			{type="weapon", subtype="longsword", name="iron longsword", autoreq=true, ego_chance=-1000, ego_chance=-1000},
-			{type="armor", subtype="shield", name="iron shield", autoreq=true, ego_chance=-1000, ego_chance=-1000},
-			{type="armor", subtype="heavy", name="iron mail armour", autoreq=true, ego_chance=-1000, ego_chance=-1000}
+			{type="weapon", subtype="greatsword", name="iron greatsword", autoreq=true, ego_chance=-1000, ego_chance=-1000},
+			{type="armor", subtype="heavy", name="iron mail armour", autoreq=true, ego_chance=-1000, ego_chance=-1000},
 		},
 	},
 	copy_add = {
-		life_rating = 2,
+		life_rating = 3,
 	},
 }
 
 newBirthDescriptor{
 	type = "subclass",
-	name = "Berserker",
+	name = "Fighter",
 	desc = {
-		"A Berserker wields huge two-handed weapons of destruction, bringing pain and death to his foes as he cleaves them in two.",
-		"A Berserker usually forfeits all ideas of self-defense to concentrate on what he does best: killing things.",
-		"Their most important stats are: Strength and Constitution",
+		"A Fighter specializes in weapon and shield combat, rarely leaving the cover of her many protective techniques.",
+		"A good Fighter is able to withstand terrible attacks from all sides, protected by her shield, and when the time comes lash out at her foes with incredible strength.",
+		"Their most important stats are: Strength and Dexterity",
 		"#GOLD#Stat modifiers:",
-		"#LIGHT_BLUE# * +5 Strength, +1 Dexterity, +3 Constitution",
+		"#LIGHT_BLUE# * +5 Strength, +2 Dexterity, +2 Constitution",
 		"#LIGHT_BLUE# * +0 Magic, +0 Willpower, +0 Cunning",
 	},
-	stats = { str=5, con=3, dex=1, },
+	stats = { str=5, con=2, dex=2, },
 	talents_types = {
 		["technique/archery-training"]={false, 0.1},
-		["technique/shield-defense"]={false, -0.1},
-		["technique/2hweapon-offense"]={true, 0.3},
-		["technique/2hweapon-cripple"]={true, 0.3},
+		["technique/shield-offense"]={true, 0.3},
+		["technique/shield-defense"]={true, 0.3},
+		["technique/2hweapon-offense"]={false, -0.1},
 		["technique/combat-techniques-active"]={true, 0.3},
 		["technique/combat-techniques-passive"]={true, 0.3},
 		["technique/combat-training"]={true, 0.3},
 		["technique/superiority"]={false, 0.3},
 		["technique/warcries"]={false, 0.3},
+		["technique/battle-tactics"]={false, 0.3},
 		["technique/field-control"]={false, 0},
-		["technique/bloodthirst"]={false, 0.2},
 		["cunning/survival"]={true, 0},
 		["cunning/dirty"]={false, 0},
 	},
 	talents = {
-		[ActorTalents.T_DEATH_DANCE] = 1,
-		[ActorTalents.T_STUNNING_BLOW] = 1,
+		[ActorTalents.T_SHIELD_PUMMEL] = 1,
+		[ActorTalents.T_SHIELD_WALL] = 1,
 		[ActorTalents.T_WEAPON_COMBAT] = 1,
-		[ActorTalents.T_ARMOUR_TRAINING] = 2,
+		[ActorTalents.T_ARMOUR_TRAINING] = 3,
 	},
 	copy = {
 		resolvers.equip{ id=true,
-			{type="weapon", subtype="greatsword", name="iron greatsword", autoreq=true, ego_chance=-1000, ego_chance=-1000},
-			{type="armor", subtype="heavy", name="iron mail armour", autoreq=true, ego_chance=-1000, ego_chance=-1000},
+			{type="weapon", subtype="longsword", name="iron longsword", autoreq=true, ego_chance=-1000, ego_chance=-1000},
+			{type="armor", subtype="shield", name="iron shield", autoreq=true, ego_chance=-1000, ego_chance=-1000},
+			{type="armor", subtype="heavy", name="iron mail armour", autoreq=true, ego_chance=-1000, ego_chance=-1000}
 		},
 	},
 	copy_add = {
-		life_rating = 3,
+		life_rating = 2,
 	},
 }
 
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 4d7ca5598bea95b0410f8144fe3c0c0d8f76da06..8c9dbe778306847f66704fc6ac67c1719950fa36 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -1514,7 +1514,7 @@ newDamageType{
 			if src then src:incParadox(-dam.reduction) end
 			if chance == 1 then
 				if target:canBe("stun") then
-					target:setEffect(target.EFF_DAZED, 3, {apply_power=src:combatSpellpower()})
+					target:setEffect(target.EFF_STUNNED, 3, {apply_power=src:combatSpellpower()})
 				else
 					game.logSeen(target, "%s resists the daze!", target.name:capitalize())
 				end
diff --git a/game/modules/tome/data/general/npcs/horror.lua b/game/modules/tome/data/general/npcs/horror.lua
index a7d2322b0fcc8d1b774b56ec40a89b35b02a1c7f..3d606de30459446cb523afb25335807b62559f47 100644
--- a/game/modules/tome/data/general/npcs/horror.lua
+++ b/game/modules/tome/data/general/npcs/horror.lua
@@ -752,5 +752,3 @@ newEntity{ base="BASE_NPC_HORROR", define_as = "GRGGLCK_TENTACLE",
 		end
 	end,
 }
-
-
diff --git a/game/modules/tome/data/general/npcs/telugoroth.lua b/game/modules/tome/data/general/npcs/telugoroth.lua
index 8af421aa419cb0d62d4dd01674c1ebd174ba0b34..aa590e7925234a7da91085e682b12ba520c66f03 100644
--- a/game/modules/tome/data/general/npcs/telugoroth.lua
+++ b/game/modules/tome/data/general/npcs/telugoroth.lua
@@ -171,7 +171,7 @@ newEntity{ base = "BASE_NPC_TELUGOROTH",
 
 	resolvers.talents{
 		[Talents.T_ANOMALY_TEMPORAL_STORM]=1,
-		[Talents.T_QUANTUM_SPIKE]={base=5, every=7},
+		[Talents.T_QUANTUM_SPIKE]={base=2, every=7},
 		[Talents.T_DIMENSIONAL_STEP]={base=5, every=7},
 		[Talents.T_ANOMALY_REARRANGE]=1,
 		[Talents.T_TEMPORAL_WAKE]={base=4, every=7},
diff --git a/game/modules/tome/data/gfx/lore/kryl_feijan_sacrificial_altar.png b/game/modules/tome/data/gfx/lore/kryl_feijan_sacrificial_altar.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c4e9f5677b4edaf78ba903e2fa3686e0a74d71d
Binary files /dev/null and b/game/modules/tome/data/gfx/lore/kryl_feijan_sacrificial_altar.png differ
diff --git a/game/modules/tome/data/gfx/particles/beckoned.lua b/game/modules/tome/data/gfx/particles/beckoned.lua
new file mode 100644
index 0000000000000000000000000000000000000000..5521027032564c36bafe233f58d50b56944046ae
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/beckoned.lua
@@ -0,0 +1,66 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+local nb = 0
+local length = 0
+local life = 0
+local angle = 0
+local r = 0
+local distance = 0
+local color = 0
+local dir = 0
+local waveCount = 0
+local vel = 0
+
+return { generator = function()
+	local colorChoice = rng.percent(50)
+	return {
+		life = life,
+		size = 3.5, sizev = 0, sizea = 0,
+
+		x = r * math.cos(angle) + rng.float(-2, 2), xv = -distance * math.cos(angle) / life, xa = 0,
+		y = r * math.sin(angle) + rng.float(-2, 2), yv = -distance * math.sin(angle) / life, ya = 0,
+		dir = dir, dirv = 2 * math.pi * waveCount / life, dira = 0,
+		vel = vel, velv = 0, vela = 0,
+
+		r = color * (colorChoice and 240 or 240) / 255, rv = 0, ra = 0,
+		g = color * (colorChoice and 240 or 160) / 255, gv = 0, ga = 0,
+		b = color * (colorChoice and 240 or 220) / 255, bv = 0, ba = 0,
+		a = rng.float(0.75, 1), av = -0.3 / life, aa = 0,
+	}
+end, },
+function(self)
+	if nb == 0 then
+		-- initialize a new strand
+		 length = rng.range(10, 15) -- length of particle strand
+		 life = length + rng.range(3, 8) -- time particles stay alive
+		 angle = math.rad(rng.range(0, 360)) -- starting point angle
+		 r = rng.range(12, 20) -- starting point distance
+		 distance = rng.range(20, 30) -- distance traveled
+		 color = rng.float(0.7, 1) -- color
+		 dir = math.rad(rng.range(0, 360)) -- initial wave direction
+		 waveCount = rng.float(0.8, 1.2) -- number of full waves
+		 vel = rng.float(.5, 1) -- power of wave effect
+	end
+	self.ps:emit(1)
+	nb = (nb + 1) % (life + 2)
+end,
+100, nil, true
diff --git a/game/modules/tome/data/gfx/particles/beckoned_move.lua b/game/modules/tome/data/gfx/particles/beckoned_move.lua
new file mode 100644
index 0000000000000000000000000000000000000000..3a7234c00f847f9853914a0c8e71848d8fc0677b
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/beckoned_move.lua
@@ -0,0 +1,70 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010, 2011 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+dx = dx * base_size
+dy = dy * base_size
+local angle = math.atan2(dy, dx)
+
+local nb = 0
+local strands = {}
+local strandCount = 5
+local length = 10
+for i = 1, strandCount do
+	strands[i] = {
+		x = rng.float(-12, 12), -- initial offset
+		y = rng.float(-12, 12), -- initial offset
+		life = length + rng.range(5, 10), -- time particles stay alive
+		color = rng.float(0.7, 1), -- color
+		dir = math.rad(rng.range(0, 360)), -- initial wave direction
+		waveCount = rng.float(0.5, 1.5), -- number of full waves
+		vel = rng.float(.6, 1) -- power of wave effect
+	}
+end
+local strandIndex = 1
+
+return { generator = function()
+	local size = 4
+	local colorChoice = rng.percent(50)
+	
+	local strand = strands[strandIndex]
+	strandIndex = (strandIndex + 1) % strandCount
+
+	return {
+		life = strand.life,
+		size = size, sizev = 0, sizea = 0,
+		x = strand.x, xv = (-base_size * 1 * math.cos(angle) - strand.x) / strand.life, xa = 0,
+		y = strand.y, yv = (-base_size * 1 * math.sin(angle) - strand.y) / strand.life, ya = 0,
+		dir = strand.dir, dirv = 2 * math.pi * strand.waveCount / strand.life, dira = 0,
+		vel = strand.vel, velv = 0, vela = 0,
+
+		r = strand.color * (colorChoice and 240 or 240) / 255,  rv = 0, ra = 0,
+		g = strand.color * (colorChoice and 240 or 160) / 255,  gv = 0, ga = 0,
+		b = strand.color * (colorChoice and 240 or 220) / 255,  bv = 0, ba = 0,
+		a = rng.float(0.75, 1), av = -0.3 / strand.life, aa = 0,
+	}
+end, },
+function(self)
+	if nb < length then
+		self.ps:emit(strandCount)
+	end
+	nb = nb + 1
+end,
+strandCount * 30
\ No newline at end of file
diff --git a/game/modules/tome/data/gfx/particles/harassed.lua b/game/modules/tome/data/gfx/particles/harassed.lua
new file mode 100644
index 0000000000000000000000000000000000000000..20f9645fdac8faed7c1b642256e70b53365b7dd3
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/harassed.lua
@@ -0,0 +1,51 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+local nb = 0
+
+return { generator = function()
+	local angle = rng.float(-math.pi, math.pi)
+	local r1 = rng.float(10, 18)
+	local r2 = rng.float(10, 18)
+	local life = rng.range(8, 14)
+	local colorChoice = rng.percent(50)
+	return {
+		life = life,
+		size = rng.float(5, 8), sizev = 0, sizea = 0,
+
+		x = r1 * math.cos(angle), xv = -(r1 + r2) * math.cos(angle) / life, xa = 0,
+		y = r1 * math.sin(angle), yv = -(r1 + r2) * math.sin(angle) / life, ya = 0,
+		dir = 0, dirv = 0, dira = 0,
+		vel = 0, velv = 0, vela = 0,
+
+		r = (colorChoice and 10 or 160) / 255,  rv = 0, ra = 0,
+		g = 0,  gv = 0, ga = 0,
+		b = 20 / 255,  bv = 0, ba = 0,
+		a = rng.float(0.6, 0.9), av = -0.2 / life, aa = 0,
+	}
+end, },
+function(self)
+	if nb == 0 then
+		self.ps:emit(1)
+	end
+	nb = (nb + 1) % 2
+end,
+40, nil, true
diff --git a/game/modules/tome/data/gfx/particles/overwhelmed.lua b/game/modules/tome/data/gfx/particles/overwhelmed.lua
new file mode 100644
index 0000000000000000000000000000000000000000..e4389caa05b52b314338dcfdd742adc5a04c274e
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/overwhelmed.lua
@@ -0,0 +1,50 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+local nb = 0
+
+return { generator = function()
+	local angle = rng.float(-math.pi, math.pi)
+	local r1 = rng.float(10, 18)
+	local r2 = rng.float(10, 18)
+	local life = rng.range(5, 12)
+	return {
+		life = life,
+		size = rng.float(3.5, 6), sizev = 0, sizea = 0,
+
+		x = r1 * math.cos(angle), xv = -(r1 + r2) * math.cos(angle) / life, xa = 0,
+		y = r1 * math.sin(angle), yv = -(r1 + r2) * math.sin(angle) / life, ya = 0,
+		dir = 0, dirv = 0, dira = 0,
+		vel = 0, velv = 0, vela = 0,
+
+		r = 240 / 255, rv = 0, ra = 0,
+		g = 240 / 255, gv = 0, ga = 0,
+		b = 240 / 255, bv = 0, ba = 0,
+		a = rng.float(0.4, 0.7), av = -0.2 / life, aa = 0,
+	}
+end, },
+function(self)
+	if nb == 0 then
+		self.ps:emit(1)
+	end
+	nb = (nb + 1) % 2
+end,
+40, nil, true
diff --git a/game/modules/tome/data/gfx/particles/stalked_start.lua b/game/modules/tome/data/gfx/particles/stalked_start.lua
new file mode 100644
index 0000000000000000000000000000000000000000..e0860e9998d92203e45938bf43ef29e3aa01613d
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/stalked_start.lua
@@ -0,0 +1,56 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+local nb = 0
+
+return { generator = function()
+	local angle = math.rad(rng.range(0, 360))
+	local r = 18
+	local life = 12
+
+	return {
+		life = life,
+		size = 3, sizev = 0, sizea = 0,
+
+		x = r * math.cos(angle), xv = -r * math.cos(angle) / life, xa = 0,
+		y = r * math.sin(angle), yv = -r * math.sin(angle) / life, ya = 0,
+		dir = 0, dirv = 0, dira = 0,
+		vel = 0, velv = 0, vela = 0,
+
+		r = 228 / 255,  rv = 0, ra = 0,
+		g = 40 / 255,  gv = 0, ga = 0,
+		b = 5 / 255,  bv = 0, ba = 0,
+		a = 230 / 255,  av = 0, aa = 0,
+	}
+end, },
+function(self)
+	if nb == 0 then
+		self.ps:emit(100)
+	elseif nb == 4 then
+		self.ps:emit(100)
+	elseif nb == 8 then
+		self.ps:emit(100)
+	elseif nb < 8 then
+		self.ps:emit(10)
+	end
+	nb = nb + 1
+end,
+400
diff --git a/game/modules/tome/data/gfx/talents/adrenaline_surge.png b/game/modules/tome/data/gfx/talents/adrenaline_surge.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4b6eba38c95f7010e229120b59b503880765ac4
Binary files /dev/null and b/game/modules/tome/data/gfx/talents/adrenaline_surge.png differ
diff --git a/game/modules/tome/data/gfx/talents/daunting_presence.png b/game/modules/tome/data/gfx/talents/daunting_presence.png
new file mode 100644
index 0000000000000000000000000000000000000000..75e2f30bac584f984e5d3e49101843bbe7114087
Binary files /dev/null and b/game/modules/tome/data/gfx/talents/daunting_presence.png differ
diff --git a/game/modules/tome/data/gfx/talents/unflinching_resolve.png b/game/modules/tome/data/gfx/talents/unflinching_resolve.png
index 704e71ee6e1a275da1e8819f3644235a513f8329..59db60c8ed30f770d5e2178d307e1f480a7bb4a7 100644
Binary files a/game/modules/tome/data/gfx/talents/unflinching_resolve.png and b/game/modules/tome/data/gfx/talents/unflinching_resolve.png differ
diff --git a/game/modules/tome/data/gfx/talents/vitality.png b/game/modules/tome/data/gfx/talents/vitality.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b7e5dea752cd0431fe1adc5784bdd0be40377b7
Binary files /dev/null and b/game/modules/tome/data/gfx/talents/vitality.png differ
diff --git a/game/modules/tome/data/lore/fearscape.lua b/game/modules/tome/data/lore/fearscape.lua
index 1ac4617751e843646e5eff4303830c3d673b1016..d4a22089a7e0fe16bda66e65d75a65cd80f90840 100644
--- a/game/modules/tome/data/lore/fearscape.lua
+++ b/game/modules/tome/data/lore/fearscape.lua
@@ -29,3 +29,13 @@ newLore{
 
 In the distance you see looming, demonic shapes of absolute darkness, towering above the blazing land like wardens of doom. The sky is black, but above your head hangs a round world that you recognise as Eyal. Across the burning plains gather armies of fiendish figures, and glowing eyes turn up with hateful glowers to your home world. Suddenly both you and it and seem small and frail. As the flames fill your body with pain your only thought is of escape.]],
 }
+
+newLore{
+	id = "kryl-feijan-altar",
+	category = "fearscape",
+	name = "sacrificial altar", always_pop = true,
+	image = "kryl_feijan_sacrificial_altar.png",
+	lore = [[You see a female human lying unconscious on a black altar, twisted sigils scored into her naked flesh.
+Around her are several figures in dark robes.
+As they notice you one calls out 'Intruder! Protect the seed of Kryl-Feijan!']],
+}
diff --git a/game/modules/tome/data/talents/chronomancy/age-manipulation.lua b/game/modules/tome/data/talents/chronomancy/age-manipulation.lua
index 0e831514d775ced1504bd699acdb5eea029f55b5..23c144dcf073d46e153f0db4c1b1d1ba3df6f33c 100644
--- a/game/modules/tome/data/talents/chronomancy/age-manipulation.lua
+++ b/game/modules/tome/data/talents/chronomancy/age-manipulation.lua
@@ -86,7 +86,7 @@ newTalent{
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		print (check)
+
 		self:project(tg, x, y, DamageType.CONFUSION, {
 			dur = t.getConfuseDuration(self, t),
 			dam = t.getConfuseEfficency(self, t)
diff --git a/game/modules/tome/data/talents/chronomancy/timeline-threading.lua b/game/modules/tome/data/talents/chronomancy/timeline-threading.lua
index d25e45905a6812d8f3ead51f3d9a3e8c474ea352..457c9cf25be086ba0e5a8f33181f5d45e9613769 100644
--- a/game/modules/tome/data/talents/chronomancy/timeline-threading.lua
+++ b/game/modules/tome/data/talents/chronomancy/timeline-threading.lua
@@ -70,7 +70,7 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local reduction = t.getReduction(self, t)
-		return ([[Creates a wake of temporal energy that deals %0.2f damage in a beam as you attempt to rethread the timeline.  Affected targets may be dazed, blinded, pinned, or confused for 3 turns.
+		return ([[Creates a wake of temporal energy that deals %0.2f damage in a beam as you attempt to rethread the timeline.  Affected targets may be stunned, blinded, pinned, or confused for 3 turns.
 		Each target you hit with rethread will reduce your Paradox by %d.
 		The damage will increase with your Paradox and Spellpower.]]):
 		format(damDesc(self, DamageType.TEMPORAL, damage), reduction)
diff --git a/game/modules/tome/data/talents/chronomancy/timetravel.lua b/game/modules/tome/data/talents/chronomancy/timetravel.lua
index 0da1390a1940bb86c75c073aadc4cea8b0a242a3..a55a63d5d12366caecd26e30b6fb73ec89a45db3 100644
--- a/game/modules/tome/data/talents/chronomancy/timetravel.lua
+++ b/game/modules/tome/data/talents/chronomancy/timetravel.lua
@@ -230,22 +230,20 @@ newTalent{
 			return
 		end
 
-		game:onTickEnd(function()
-			if not game:chronoRestore("revision", true) then
-				game.logSeen(self, "#LIGHT_RED#The spell fizzles.")
-				return
-			end
-			game.logPlayer(game.player, "#LIGHT_BLUE#You unfold the spacetime continuum to a previous state!")
-
-			-- Manualy start the cooldown of the "old player"
-			game.player:startTalentCooldown(t)
-			game.player:incParadox(t.paradox * (1 + (game.player.paradox / 300)))
-			game.player:forceUseTalent(game.player.T_DOOR_TO_THE_PAST, {ignore_energy=true})
-			-- remove anomaly count
-			if self.dttp_anomaly_count then self.dttp_anomaly_count = nil end
-			if game._chronoworlds then game._chronoworlds = nil end
-		end)
+		if not game:chronoRestore("revision", true) then
+			game.logSeen(self, "#LIGHT_RED#The spell fizzles.")
+			return
+		end
+		game.logPlayer(game.player, "#LIGHT_BLUE#You unfold the spacetime continuum to a previous state!")
 
+		-- Manualy start the cooldown of the "old player"
+		game.player:startTalentCooldown(t)
+		game.player:incParadox(t.paradox * (1 + (game.player.paradox / 300)))
+		game.player:forceUseTalent(game.player.T_DOOR_TO_THE_PAST, {ignore_energy=true})
+		-- remove anomaly count
+		if self.dttp_anomaly_count then self.dttp_anomaly_count = nil end
+		if game._chronoworlds then game._chronoworlds = nil end
+	
 		return true
 	end,
 	info = function(self, t)
diff --git a/game/modules/tome/data/talents/techniques/conditioning.lua b/game/modules/tome/data/talents/techniques/conditioning.lua
index 23953827d0633967492d8f3fe9a8cce0222b2f78..1bd407c81da250947650ca65d3d22d54e03faf0a 100644
--- a/game/modules/tome/data/talents/techniques/conditioning.lua
+++ b/game/modules/tome/data/talents/techniques/conditioning.lua
@@ -18,86 +18,140 @@
 -- darkgod@te4.org
 
 newTalent{
-	name = "Physical Conditioning",
+	name = "Vitality",
 	type = {"technique/conditioning", 1},
-	require = techs_req1,
+	require = techs_con_req1,
 	mode = "passive",
 	points = 5,
-	getArmor = function(self, t) return self:combatTalentStatDamage(t, "str", 5, 35) end,
-	getPhysical = function(self, t) return self:combatTalentStatDamage(t, "str", 5, 35) end,
+	getWoundReduction = function(self, t) return self:getTalentLevel(t)/10 end,
+	getHealMod = function(self, t) return self:combatTalentStatDamage(t, "con", 20, 80) end,
+	getLifeRegen = function(self, t) return self:combatTalentStatDamage(t, "con", 1, 10) end,
+	getDuration = function(self, t) return 2 + math.ceil(self:getTalentLevel(t)) end,
+	do_vitality_recovery = function(self, t)
+		self:setEffect(self.EFF_RECOVERY, t.getDuration(self, t), {heal_mod = t.getHealMod(self, t), regen = t.getLifeRegen(self, t)})
+	end,
 	info = function(self, t)
-		local armor = t.getArmor(self, t)
-		local saves = t.getPhysical(self, t)
-		return ([[Physical conditioning that increases armor by %d and physical saves by %d.
-		The bonuses will scale with your Strength stat.]]):
-		format(armor, saves)
+		local wounds = t.getWoundReduction(self, t) * 100
+		local regen = t.getLifeRegen(self, t)
+		local healmod = t.getHealMod(self, t)
+		local duration = t.getDuration(self, t)
+		return ([[You recover faster from poisons, diseases and wounds; reducing the duration of all such affects by %d%%.  Additionally you gain %0.2f life regen and %d%% healing modifier for %d turns when your life drops below 50%%.
+		The healing modifier and life regen will scale with your Constitution stat.]]):
+		format(wounds, regen, healmod, duration)
 	end,
 }
 
 newTalent{
-	name = "Firm Footing",
+	name = "Daunting Presence",
 	type = {"technique/conditioning", 2},
-	require = techs_req2,
-	mode = "passive",
+	require = techs_con_req2,
 	points = 5,
-	getResists = function(self, t) return self:getTalentLevelRaw(t) * 15 end,
-	on_learn = function(self, t)
-		self:attr("knockback_immune", 0.15)
-		self:attr("pin_immune", 0.15)
+	mode = "sustained",
+	sustain_stamina = 20,
+	cooldown = 8,
+	tactical = { DEFEND = 2, DISABLE = 1, },
+	range = 0,
+	getRadius = function(self, t) return math.ceil(self:getTalentLevel(t)/2) end,
+	getPenalty = function(self, t) return self:combatTalentStatDamage(t, "con", 5, 25) end,
+	getMinimumLife = function(self, t)
+		return self.max_life * (0.5 - (self:getTalentLevel(t)/20))
+	end,
+	on_pre_use = function(self, t, silent) if t.getMinimumLife(self, t) > self.life then if not silent then game.logPlayer(self, "You are too injured to use this talent.") end return false end return true end,
+	do_daunting_presence = function(self, t)
+		local tg = {type="ball", range=0, radius=t.getRadius(self, t), friendlyfire=false, talent=t}
+		self:project(tg, self.x, self.y, function(px, py)
+			local target = game.level.map(px, py, engine.Map.ACTOR)
+			if target then
+				if target:canBe("fear") then
+					target:setEffect(target.EFF_INTIMIDATED, 4, {apply_power=self:combatAttackStr(), power=t.getPenalty(self, t)})
+					game.level.map:particleEmitter(target.x, target.y, 1, "flame")
+				else
+					game.logSeen(target, "%s is not intimidated!", target.name:capitalize())
+				end
+			end
+		end)
+		game:playSoundNear(self, "talents/fire")
 	end,
-	on_unlearn = function(self, t)
-		self:attr("knockback_immune", -0.15)
-		self:attr("pin_immune", -0.15)
+	activate = function(self, t)
+		local ret = {	}
+		return ret
+	end,
+	deactivate = function(self, t, p)
+		return true
 	end,
 	info = function(self, t)
-		local resists = t.getResists(self, t)
-		return ([[Increases Knockback and Pin resistance by %d%%.]]):
-		format(resists)
+		local radius = t.getRadius(self, t)
+		local penalty = t.getPenalty(self, t)
+		local min_life = t.getMinimumLife(self, t)
+		return ([[Enemies are intimidated by how composed you remain under fire.  When you take more then 5%% of your maximum life in a single hit all enemies in a radius of %d will be intimidated, reducing their physical power, mind power, and spellpower by %d for 4 turns.
+		If your health drops below %d you'll be unable to maintain your daunting presence and the sustain will deactivate.  The power of the intimidation effect will scale with your Constitution stat.]]):
+		format(radius, penalty, min_life)
 	end,
 }
 
 newTalent{
-	name = "Iron Skin",
+	name = "Unflinching Resolve",
 	type = {"technique/conditioning", 3},
-	require = techs_req3,
+	require = techs_con_req3,
 	mode = "passive",
 	points = 5,
-	getRes = function(self, t) return 2 * self:getTalentLevelRaw(t) end,
-	on_learn = function(self, t)
-		self.resists.all = (self.resists.all or 0) + 2
-	end,
-	on_unlearn = function(self, t)
-		self.resists.all = (self.resists.all or 0) - 2
+	getChance = function(self, t) return self:combatTalentStatDamage(t, "con", 20, 80) end,
+	do_unflinching_resolve = function(self, t)
+		local effs = {}
+		-- Go through all spell effects
+		for eff_id, p in pairs(self.tmp) do
+			local e = self.tempeffect_def[eff_id]
+			if e.status == "detrimental" then
+				if e.subtype.stun then 
+					effs[#effs+1] = {"effect", eff_id}
+				elseif e.subtype.blind and self:getTalentLevel(t) >=2 then
+					effs[#effs+1] = {"effect", eff_id}
+				elseif e.subtype.confusion and self:getTalentLevel(t) >=3 then
+					effs[#effs+1] = {"effect", eff_id}
+				elseif e.subtype.pin and self:getTalentLevel(t) >=4 then
+					effs[#effs+1] = {"effect", eff_id}
+				elseif e.subtype.slow and self:getTalentLevel(t) >=5 then
+					effs[#effs+1] = {"effect", eff_id}
+				end
+			end
+		end
+		
+		if #effs > 0 then
+			local eff = rng.tableRemove(effs)
+			if eff[1] == "effect" and rng.percent(t.getChance(self, t)) then
+				self:removeEffect(eff[2])
+				game.logSeen(self, "%s recovers!", self.name:capitalize())
+			end
+		end
 	end,
 	info = function(self, t)
-		local res = t.getRes(self, t)
-		return ([[You've learned to shrug off more damage then is normal.  Increases all damage reduction by %d%%.]]):
-		format(res)
+		local chance = t.getChance(self, t)
+		return ([[You've learned to shake off effects that would disable you. Each turn you have a %d%% chance to remove a single stun effect.
+		At talent level 2 you may also shake off blindness, at level 3 confusion, level 4 pins, and level 5 slows. 
+		Only one effect may be removed each turn and the chance to remove an effect scales with your Constitution stat.]]):
+		format(chance)
 	end,
 }
 
 newTalent{
-	name = "Unflinching Resolve",
+	name = "Adrenaline Surge", -- no stamina cost; it's main purpose is to give the player an alternative means of using stamina based talents
 	type = {"technique/conditioning", 4},
-	require = techs_req4,
-	mode = "passive",
+	require = techs_con_req4,
 	points = 5,
-	getRegen = function(self, t) return self:getTalentLevel(t) * 0.05 end,
-	getResist = function(self, t) return self:getTalentLevelRaw(t) * 15 end,
-	on_hit = function(self, t, dam)
-		local power = (dam * t.getRegen(self, t)) / 3
-		self:setEffect(self.EFF_RECOVERY, 3, {power = power})
-	end,
-	on_learn = function(self, t)
-		self:attr("stun_immune", 0.15)
-	end,
-	on_unlearn = function(self, t)
-		self:attr("stun_immune", -0.15)
+	cooldown = 24,
+	tactical = { STAMINA = 1, BUFF = 2 },
+	getAttackPower = function(self, t) return self:combatTalentStatDamage(t, "con", 5, 25) end,
+	getDuration = function(self, t) return 2 + math.ceil(self:getTalentLevel(t)) end,
+	action = function(self, t)
+		self:setEffect(self.EFF_ADRENALINE_SURGE, t.getDuration(self, t), {power = t.getAttackPower(self, t)})
+		return true
 	end,
 	info = function(self, t)
-		local resist = t.getResist(self, t)
-		local regen = t.getRegen(self, t)
-		return ([[Your stun immunity is increased by %d%%.  Also anytime you're hit for 10%% or more of your maximum life in a single blow you recover %d%% of the damage over three turns.]]):
-		format(resist, regen * 100)
+		local attack_power = t.getAttackPower(self, t)
+		local duration = t.getDuration(self, t)
+		return ([[You release a surge of adrenaline that increases your physical power by %d for %d turns. While the effect is active you may continue to fight beyond the point of exhaustion.
+		Your stamina based sustains will not be disabled if your stamina reaches zero and you may continue to use stamina based talents while at zero stamina at the cost of life.
+		The attack power increase will scale with your Constitution stat.]]):
+		format(attack_power, duration)
 	end,
 }
diff --git a/game/modules/tome/data/talents/techniques/grappling.lua b/game/modules/tome/data/talents/techniques/grappling.lua
index 0856798eb121d76bad34ee66ad7b55a10cce8d59..41c7b583186a476f0613584b8d1591d827d358fe 100644
--- a/game/modules/tome/data/talents/techniques/grappling.lua
+++ b/game/modules/tome/data/talents/techniques/grappling.lua
@@ -61,7 +61,7 @@ newTalent{
 	requires_target = true,
 	getDuration = function(self, t) return 4 + math.floor(self:getTalentLevel(t)) end,
 	getPower = function(self, t) return 5 + self:combatTalentStatDamage(t, "str", 1, 50) end,
-	getDrain = function(self, t) return 6 - (self:getTalentLevelRaw(t) or 0) end,
+	getDrain = function(self, t) return 6 - math.max(1, self:getTalentLevelRaw(t) or 0) end,
 	-- Learn the appropriate stance
 	on_learn = function(self, t)
 		if not self:knowTalent(self.T_GRAPPLING_STANCE) then
diff --git a/game/modules/tome/data/talents/techniques/unarmed-training.lua b/game/modules/tome/data/talents/techniques/unarmed-training.lua
index 5cd01634fe63679a5854140f31966a3797b0abed..e75dc040f91f7b9acf7d122eb871e49690b9f767 100644
--- a/game/modules/tome/data/talents/techniques/unarmed-training.lua
+++ b/game/modules/tome/data/talents/techniques/unarmed-training.lua
@@ -27,6 +27,12 @@ newTalent{
 	mode = "passive",
 	points = 1,
 	getDamage = function(self, t) return self.level * 0.5 end,
+	on_learn = function(self, t)
+		self.combat.sound = "actions/melee"
+		self.combat.sound_miss = "actions/melee_miss"
+	end,
+	on_unlearn = function(self, t)
+	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		return ([[Adds %d damage to all glove and gauntlet strikes.
@@ -46,7 +52,8 @@ newTalent{
 	getDamage = function(self, t) return math.sqrt(self:getTalentLevel(t) / 10) end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Increases damage done with unarmed attacks by %d%%.]]):
+		return ([[Increases damage done with unarmed attacks by %d%% 
+		Note this only applies to your base unarmed damage and things that work off of it (pugilism and finishing moves for instance) and will not increase grappling or kick damage.]]):
 		format(100 * damage)
 	end,
 }
diff --git a/game/modules/tome/data/talents/techniques/weaponshield.lua b/game/modules/tome/data/talents/techniques/weaponshield.lua
index f6d7a3702761782b571449a58d56de1523eca83d..dc67fb58edeb5431bbbe2e126b24d65cdc791966 100644
--- a/game/modules/tome/data/talents/techniques/weaponshield.lua
+++ b/game/modules/tome/data/talents/techniques/weaponshield.lua
@@ -48,8 +48,8 @@ newTalent{
 
 		-- Try to stun !
 		if hit then
-			if target:checkHit(self:combatAttack(shield.special_combat), target:combatPhysicalResist(), 0, 95, 5 - self:getTalentLevel(t) / 2) and target:canBe("stun") then
-				target:setEffect(target.EFF_STUNNED, 2 + self:getTalentLevel(t) / 2, {})
+			if target:canBe("stun") then
+				target:setEffect(target.EFF_STUNNED, 2 + self:getTalentLevel(t) / 2, {apply_power=self:combatAttackStr()})
 			else
 				game.logSeen(target, "%s resists the shield bash!", target.name:capitalize())
 			end
diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua
index a6f19d3ae082f043662be357d11026123ab776a0..e16c57218ed9e8802ffe95c2370dadd3f392e3a1 100644
--- a/game/modules/tome/data/timed_effects/magical.lua
+++ b/game/modules/tome/data/timed_effects/magical.lua
@@ -1095,7 +1095,7 @@ newEffect{
 	long_desc = function(self, eff) return "The target is retuning the fabric of spacetime; any damage will stop it." end,
 	type = "magical",
 	subtype = { temporal=true },
-	status = "detrimental",
+	status = "beneficial",
 	parameters = {},
 	on_timeout = function(self, eff)
 		local t = self:getTalentFromId(self.T_SPACETIME_TUNING)
diff --git a/game/modules/tome/data/timed_effects/mental.lua b/game/modules/tome/data/timed_effects/mental.lua
index 0436ce35285c1a651854fa0306024d241042bff3..b5e0e3289b65e6e7342fc676305c13623425d030 100644
--- a/game/modules/tome/data/timed_effects/mental.lua
+++ b/game/modules/tome/data/timed_effects/mental.lua
@@ -1451,4 +1451,26 @@ newEffect{
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("inc_damage", eff.pid)
 	end,
+}
+
+newEffect{
+	name = "INTIMIDATED",
+	desc = "Intimidated",
+	long_desc = function(self, eff) return ("The target's morale is weakened; reducing it's attack power, mind power, and spellpower by %d."):format(eff.power) end,
+	type = "mental",
+	subtype = { morale=true, fear=true},
+	status = "detrimental",
+	on_gain = function(self, err) return "#Target#'s morale has been lowered.", "+Intimidated" end,
+	on_lose = function(self, err) return "#Target# has regained it's confidence.", "-Intimidated" end,
+	parameters = { power=1 },
+	activate = function(self, eff)
+		eff.damid = self:addTemporaryValue("combat_dam", -eff.power)
+		eff.spellid = self:addTemporaryValue("combat_spellpower", -eff.power)
+		eff.mindid = self:addTemporaryValue("combat_mindpower", -eff.power)
+	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("combat_dam", eff.damid)
+		self:removeTemporaryValue("combat_spellpower", eff.spellid)
+		self:removeTemporaryValue("combat_mindpower", eff.mindid)
+	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua
index 3a0a7395236a94c0718168e62b102cdef86971d8..be78c46b776709b5f812905e7cec8b02132c762d 100644
--- a/game/modules/tome/data/timed_effects/physical.lua
+++ b/game/modules/tome/data/timed_effects/physical.lua
@@ -1123,16 +1123,16 @@ newEffect{
 	on_lose = function(self, err) return "#Target# has released the hold.", "-Grappling" end,
 	on_timeout = function(self, eff)
 		local p = eff.trgt:hasEffect(eff.trgt.EFF_GRAPPLED)
+		local drain = 6 - (self:getTalentLevelRaw(self.T_CLINCH) or 0)
 		if not p or p.src ~= self or core.fov.distance(self.x, self.y, eff.trgt.x, eff.trgt.y) > 1 or eff.trgt.dead or not game.level:hasEntity(eff.trgt) then
 			self:removeEffect(self.EFF_GRAPPLING)
+		else
+			self:incStamina(-drain)
 		end
 	end,
 	activate = function(self, eff)
-		local drain = 6 - (self:getTalentLevelRaw(self.T_CLINCH) or 0)
-		eff.tmpid = self:addTemporaryValue("stamina_regen", - drain)
 	end,
 	deactivate = function(self, eff)
-		self:removeTemporaryValue("stamina_regen", eff.tmpid)
 	end,
 }
 
@@ -1297,20 +1297,22 @@ newEffect{
 }
 
 newEffect{
-	name = "RECOVERY",
+	name = "Recovery",
 	desc = "Recovery",
-	long_desc = function(self, eff) return ("The target is recovering from a damaging blow and regaining %d life each turn."):format(eff.power) end,
+	long_desc = function(self, eff) return ("The target is recovering %d life each turn and it's healing modifier has been increased by %d%%."):format(eff.regen, eff.heal_mod) end,
 	type = "physical",
-	subtype = { conditioning=true, heal=true },
+	subtype = { heal=true },
 	status = "beneficial",
 	parameters = { power=10 },
-	on_gain = function(self, err) return "#Target# is recovering from the attack!", "+Recovery" end,
-	on_lose = function(self, err) return "#Target# has finished recovering from the attack.", "-Recovery" end,
+	on_gain = function(self, err) return "#Target# is recovering!", "+Recovery" end,
+	on_lose = function(self, err) return "#Target# has finished recovering.", "-Recovery" end,
 	activate = function(self, eff)
-		eff.tmpid = self:addTemporaryValue("life_regen", eff.power)
+		eff.regenid = self:addTemporaryValue("life_regen", eff.regen)
+		eff.healid = self:addTemporaryValue("healing_factor", eff.heal_mod / 100)
 	end,
 	deactivate = function(self, eff)
-		self:removeTemporaryValue("life_regen", eff.tmpid)
+		self:removeTemporaryValue("life_regen", eff.regenid)
+		self:removeTemporaryValue("healing_factor", eff.healid)
 	end,
 }
 
@@ -1537,7 +1539,7 @@ newEffect{
 	desc = "Immobilized",
 	long_desc = function(self, eff) return "Immobilized by telekinetic forces." end,
 	type = "physical",
-	subtype = { telekinesis=true, pin=true },
+	subtype = { telekinesis=true, stun=true },
 	status = "detrimental",
 	parameters = {},
 	on_gain = function(self, err) return "#F53CBE##Target# is bound by telekinetic forces!", "+Paralyzed" end,
@@ -1596,4 +1598,22 @@ newEffect{
 		self:removeTemporaryValue("daze_immune", eff.daze)
 		self:removeTemporaryValue("pin_immune", eff.pin)
 	end,
+}
+
+newEffect{
+	name = "ADRENALINE_SURGE",
+	desc = "Adrenaline Surge",
+	long_desc = function(self, eff) return ("The target's combat damage is improved by %d and it an continue to fight past the point of exhaustion, supplementing life for stamina."):format(eff.power) end,
+	type = "physical",
+	subtype = { frenzy=true },
+	status = "beneficial",
+	parameters = { power=10 },
+	on_gain = function(self, err) return "#Target# feels a surge of adrenaline." end,
+	on_lose = function(self, err) return "#Target#'s adrenaline surge has come to an end." 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,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/zones/crypt-kryl-feijan/zone.lua b/game/modules/tome/data/zones/crypt-kryl-feijan/zone.lua
index e70e4e461205cb88ed17bf849635c4dc8e2873a6..b5998aa4b71627280b544c19a2b91d98079ed47d 100644
--- a/game/modules/tome/data/zones/crypt-kryl-feijan/zone.lua
+++ b/game/modules/tome/data/zones/crypt-kryl-feijan/zone.lua
@@ -67,9 +67,9 @@ return {
 		elseif lev == 4 then
 			require("engine.ui.Dialog"):simplePopup("Crypt", "The chanting grows louder. You hear a sudden high-pitched scream.")
 		elseif lev == 5 then
-			require("engine.ui.Dialog"):simpleLongPopup("Crypt", "You see a female human lying unconscious on a black altar, twisted sigils scored into her naked flesh.\nAround her are several figures in dark robes.\As they notice you one calls out 'Intruder! Protect the seed of Kryl-Feijan!'", 400)
 			game.level.turn_counter = 20 * 10
 			game.player:grantQuest("kryl-feijan-escape")
+			game.player:learnLore("kryl-feijan-altar")
 		end
 	end,
 	on_turn = function(self)