diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index ea268f59f688a64f309a40677ac9974dc18976fc..4caf86150ecd34ef98fa2f7897da8d60cb52d4fc 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -57,26 +57,6 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 			end
 		end
 
-		-- Reduce damage with resistance
-		if target.resists then
-			local pen = 0
-			if src.resists_pen then pen = (src.resists_pen.all or 0) + (src.resists_pen[type] or 0) end
-			local res = math.min((target.resists.all or 0) + (target.resists[type] or 0), (target.resists_cap.all or 0) + (target.resists_cap[type] or 0))
-			res = res * (100 - pen) / 100
-			print("[PROJECTOR] res", res, (100 - res) / 100, " on dam", dam)
-			if res >= 100 then dam = 0
-			elseif res <= -100 then dam = dam * 2
-			else dam = dam * ((100 - res) / 100)
-			end
-		end
-		print("[PROJECTOR] after resists dam", dam)
-
-		-- Static reduce damage
-		if target.isTalentActive and target:isTalentActive(target.T_ANTIMAGIC_SHIELD) then
-			local t = target:getTalentFromId(target.T_ANTIMAGIC_SHIELD)
-			dam = t.on_damage(target, t, type, dam)
-		end
-
 		-- Static reduce damage for psionic kinetic shield
 		if target.isTalentActive and target:isTalentActive(target.T_KINETIC_SHIELD) then
 			local t = target:getTalentFromId(target.T_KINETIC_SHIELD)
@@ -107,6 +87,26 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 			local t = target:getTalentFromId(target.T_CHARGED_SHIELD)
 			dam = t.css_on_damage(target, t, type, dam)
 		end
+		
+		-- Reduce damage with resistance
+		if target.resists then
+			local pen = 0
+			if src.resists_pen then pen = (src.resists_pen.all or 0) + (src.resists_pen[type] or 0) end
+			local res = math.min((target.resists.all or 0) + (target.resists[type] or 0), (target.resists_cap.all or 0) + (target.resists_cap[type] or 0))
+			res = res * (100 - pen) / 100
+			print("[PROJECTOR] res", res, (100 - res) / 100, " on dam", dam)
+			if res >= 100 then dam = 0
+			elseif res <= -100 then dam = dam * 2
+			else dam = dam * ((100 - res) / 100)
+			end
+		end
+		print("[PROJECTOR] after resists dam", dam)
+
+		-- Static reduce damage
+		if target.isTalentActive and target:isTalentActive(target.T_ANTIMAGIC_SHIELD) then
+			local t = target:getTalentFromId(target.T_ANTIMAGIC_SHIELD)
+			dam = t.on_damage(target, t, type, dam)
+		end
 
 		print("[PROJECTOR] final dam", dam)
 
diff --git a/game/modules/tome/data/general/objects/boss-artifacts.lua b/game/modules/tome/data/general/objects/boss-artifacts.lua
index 49e44e41d7d4d3dbe5c2c13223f034f20a08dc8d..4e3b7666c2cddca2e71ce334ff27b0c9056f8ce1 100644
--- a/game/modules/tome/data/general/objects/boss-artifacts.lua
+++ b/game/modules/tome/data/general/objects/boss-artifacts.lua
@@ -842,3 +842,25 @@ newEntity{ base = "BASE_WAND", define_as = "ROD_OF_ANNULMENT",
 		end
 	},
 }
+
+newEntity{ base = "BASE_WARAXE",
+	power_source = {arcane=true},
+	define_as = "SKULLCLEAVER", rarity=false,
+	unided_name = "crimson waraxe",
+	name = "Skullcleaver", unique=true,
+	desc = [[A small but sharp axe, with a handle made of polished bone.  The blade has chopped through the skulls of many, and has been stained a deep crimson.]],
+	require = { stat = { str=18 }, },
+	level_range = {5, 12},
+	rarity = 220,
+	cost = 50,
+	combat = {
+		dam = 16,
+		apr = 3,
+		physcrit = 12,
+		dammod = {str=1},
+		talent_on_hit = { [Talents.T_GREATER_WEAPON_FOCUS] = {level=2, chance=10} },
+	},
+	wielder = {
+		inc_damage = { [DamageType.BLIGHT] = 8 },
+	},
+}
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index 398a695171f75e93bd26337c3b05157b8fbbde82..92031b80d592fdd569b70579f97c7a55d04c50b8 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -1279,6 +1279,10 @@ newEntity{ base = "BASE_GEM",
 		fear_immune = 0.7,
 		resists={[DamageType.MIND] = 35,},
 	},
+	wielder = {
+		inc_stats = { [Stats.STAT_STR] = 5, [Stats.STAT_DEX] = 5, [Stats.STAT_MAG] = 5, [Stats.STAT_WIL] = 5, [Stats.STAT_CUN] = 5, [Stats.STAT_CON] = 5, },
+		lite = 2,
+	},
 	imbue_powers = {
 		inc_stats = { [Stats.STAT_STR] = 5, [Stats.STAT_DEX] = 5, [Stats.STAT_MAG] = 5, [Stats.STAT_WIL] = 5, [Stats.STAT_CUN] = 5, [Stats.STAT_CON] = 5, },
 		lite = 2,
diff --git a/game/modules/tome/data/talents/psionic/absorption.lua b/game/modules/tome/data/talents/psionic/absorption.lua
index 80e55e6b1f78e21398fad420e44bde3fa029929e..1359df1bea1f1ad1114b3fade4ac594b912904e2 100644
--- a/game/modules/tome/data/talents/psionic/absorption.lua
+++ b/game/modules/tome/data/talents/psionic/absorption.lua
@@ -48,7 +48,13 @@ newTalent{
 	range = 10,
 	no_energy = true,
 	tactical = { DEFEND = 2 },
-
+	on_pre_use = function(self, t, silent)
+		if self:isTalentActive(self.T_THERMAL_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then
+			if not silent then game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.") end
+			return false
+		end
+		return true
+	end,
 	--called when damage gets absorbed by kinetic shield
 	ks_on_damage = function(self, t, damtype, dam)
 		local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self)
@@ -71,10 +77,10 @@ newTalent{
 
 
 	activate = function(self, t)
-		if self:isTalentActive(self.T_THERMAL_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then
-			game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.")
-			return false
-		end
+		--if self:isTalentActive(self.T_THERMAL_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then
+		--	game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.")
+		--	return false
+		--end
 		game:playSoundNear(self, "talents/heal")
 		local s_str = getShieldStrength(self, t)
 		return {
@@ -145,6 +151,13 @@ newTalent{
 	range = 10,
 	no_energy = true,
 	tactical = { DEFEND = 2 },
+	on_pre_use = function(self, t, silent)
+		if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then
+			if not silent then game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.") end
+			return false
+		end
+		return true
+	end,
 
 	--called when damage gets absorbed by thermal shield
 	ts_on_damage = function(self, t, damtype, dam)
@@ -167,10 +180,10 @@ newTalent{
 
 
 	activate = function(self, t)
-		if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then
-			game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.")
-			return false
-		end
+		--if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then
+		--	game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.")
+		--	return false
+		--end
 		game:playSoundNear(self, "talents/heal")
 		local s_str = getShieldStrength(self, t)
 		return {
@@ -239,7 +252,13 @@ newTalent{
 	range = 10,
 	no_energy = true,
 	tactical = { DEFEND = 2 },
-
+	on_pre_use = function(self, t, silent)
+		if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_THERMAL_SHIELD) then
+			if not silent then game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.") end
+			return false
+		end
+		return true
+	end,
 	--called when damage gets absorbed by charged shield
 	cs_on_damage = function(self, t, damtype, dam)
 		local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self)
@@ -261,10 +280,10 @@ newTalent{
 
 
 	activate = function(self, t)
-		if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_THERMAL_SHIELD) then
-			game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.")
-			return false
-		end
+		--if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_THERMAL_SHIELD) then
+		--	game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.")
+		--	return false
+		--end
 		game:playSoundNear(self, "talents/heal")
 		local s_str = getShieldStrength(self, t)
 		return {
diff --git a/game/modules/tome/data/talents/psionic/augmented-mobility.lua b/game/modules/tome/data/talents/psionic/augmented-mobility.lua
index cccb694ce5d3a380c3c99500b8e2053c53e7e8c0..8adec10c9148ef3f8bdd6fdc146182f3da75e61a 100644
--- a/game/modules/tome/data/talents/psionic/augmented-mobility.lua
+++ b/game/modules/tome/data/talents/psionic/augmented-mobility.lua
@@ -21,7 +21,9 @@ newTalent{
 	name = "Mindhook",
 	type = {"psionic/augmented-mobility", 1},
 	require = psi_wil_high1,
-	cooldown = 40,
+	cooldown = function(self, t)
+		return math.ceil(20 - self:getTalentLevel(t)*2)
+	end,
 	psi = 20,
 	points = 5,
 	tactical = { CLOSEIN = 2 },
@@ -55,7 +57,7 @@ newTalent{
 	info = function(self, t)
 		local range = self:getTalentRange(t)
 		return ([[Briefly extend your telekinetic reach to grab an enemy and haul them towards you.
-		Works on enemies up to %d squares away.]]):
+		Works on enemies up to %d squares away. The cooldown decreases and the range increases with additional talent points spent.]]):
 		format(range)
 	end,
 }
diff --git a/game/modules/tome/data/talents/psionic/mental-discipline.lua b/game/modules/tome/data/talents/psionic/mental-discipline.lua
index cfbe0ceea362d6564a69fbacda48ed402c0f5704..d9ffc40f149160958ecbe95886d5f7076f3adea1 100644
--- a/game/modules/tome/data/talents/psionic/mental-discipline.lua
+++ b/game/modules/tome/data/talents/psionic/mental-discipline.lua
@@ -18,36 +18,45 @@
 -- darkgod@te4.org
 
 
+
+
 newTalent{
-	name = "Highly Trained Mind",
+	name = "Aura Discipline",
 	type = {"psionic/mental-discipline", 1},
-	mode = "passive",
 	require = psi_wil_req1,
 	points = 5,
-	on_learn = function(self, t)
-		self.inc_stats[self.STAT_WIL] = self.inc_stats[self.STAT_WIL] + 1
-		self:onStatChange(self.STAT_WIL, 1)
-		self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] + 1
-		self:onStatChange(self.STAT_CUN, 1)
-	end,
-	on_unlearn = function(self, t)
-		self.inc_stats[self.STAT_WIL] = self.inc_stats[self.STAT_WIL] - 1
-		self:onStatChange(self.STAT_WIL, -1)
-		self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] - 1
-		self:onStatChange(self.STAT_CUN, -1)
-	end,
+	mode = "passive",
 	info = function(self, t)
-		return ([[A life of the mind has had predictably good effects on your Willpower and Cunning.
-		Increases Willpower and Cunning by %d.]]):format(self:getTalentLevelRaw(t))
+		local cooldown = self:getTalentLevelRaw(t)
+		local mast = (self:getTalentLevel(t) or 0)
+		return ([[Your expertise in the art of energy projection grows.
+		Aura cooldowns are all reduced by %d turns. Aura damage drains energy more slowly (+%0.2f damage required to lose a point of energy).]]):format(cooldown, mast)
 	end,
 }
 
 newTalent{
-	name = "Iron Will",
+	name = "Shield Discipline",
 	type = {"psionic/mental-discipline", 2},
 	require = psi_wil_req2,
 	points = 5,
 	mode = "passive",
+	info = function(self, t)
+		local cooldown = 2*self:getTalentLevelRaw(t)
+		local mast = 2*self:getTalentLevel(t)
+		return ([[Your expertise in the art of energy absorption grows. Shield cooldowns are all reduced by %d turns, and the amount of damage absorption required to gain a point of energy is reduced by %0.2f.]]):
+		format(cooldown, mast)
+	end,
+
+}
+
+
+
+newTalent{
+	name = "Iron Will",
+	type = {"psionic/mental-discipline", 3},
+	require = psi_wil_req3,
+	points = 5,
+	mode = "passive",
 	on_learn = function(self, t)
 		self.combat_mentalresist = self.combat_mentalresist + 6
 		self.stun_immune = (self.stun_immune or 0) + .1
@@ -64,31 +73,25 @@ newTalent{
 }
 
 newTalent{
-	name = "Shield Discipline",
-	type = {"psionic/mental-discipline", 3},
-	require = psi_wil_req3,
-	points = 5,
-	mode = "passive",
-	info = function(self, t)
-		local cooldown = 2*self:getTalentLevelRaw(t)
-		local mast = 2*self:getTalentLevel(t)
-		return ([[Your expertise in the art of energy absorption grows. Shield cooldowns are all reduced by %d turns, and the amount of damage absorption required to gain a point of energy is reduced by %0.2f.]]):
-		format(cooldown, mast)
-	end,
-
-}
-
-newTalent{
-	name = "Aura Discipline",
+	name = "Highly Trained Mind",
 	type = {"psionic/mental-discipline", 4},
+	mode = "passive",
 	require = psi_wil_req4,
 	points = 5,
-	mode = "passive",
+	on_learn = function(self, t)
+		self.inc_stats[self.STAT_WIL] = self.inc_stats[self.STAT_WIL] + 2
+		self:onStatChange(self.STAT_WIL, 2)
+		self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] + 2
+		self:onStatChange(self.STAT_CUN, 2)
+	end,
+	on_unlearn = function(self, t)
+		self.inc_stats[self.STAT_WIL] = self.inc_stats[self.STAT_WIL] - 2
+		self:onStatChange(self.STAT_WIL, -2)
+		self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] - 2
+		self:onStatChange(self.STAT_CUN, -2)
+	end,
 	info = function(self, t)
-		local cooldown = self:getTalentLevelRaw(t)
-		local mast = (self:getTalentLevel(t) or 0)
-		return ([[Your expertise in the art of energy projection grows.
-		Aura cooldowns are all reduced by %d turns. Aura damage drains energy more slowly (+%0.2f damage required to lose a point of energy).]]):format(cooldown, mast)
+		return ([[A life of the mind has had predictably good effects on your Willpower and Cunning.
+		Increases Willpower and Cunning by %d.]]):format(2*self:getTalentLevelRaw(t))
 	end,
 }
-
diff --git a/game/modules/tome/data/talents/psionic/projection.lua b/game/modules/tome/data/talents/psionic/projection.lua
index 0a079d537c6057f1070d8336b7c01520051b3cc6..804f63f27d05de3cb7ea4d9a4b94d2fdd3494f4c 100644
--- a/game/modules/tome/data/talents/psionic/projection.lua
+++ b/game/modules/tome/data/talents/psionic/projection.lua
@@ -16,82 +16,17 @@
 --
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
-
-local function combatTalentDamage(self, t, min, max)
-	return self:combatTalentSpellDamage(t, min, max, self.level + self:getWil())
-end
-
--- damage: initial physical damage and used for fractional knockback damage
--- knockback: distance to knockback
--- knockbackDamage: when knockback strikes something, both parties take damage - percent of damage * remaining knockback
--- power: used to determine the initial radius of particles
-local function forceHit(self, target, sourceX, sourceY, damage, knockback, knockbackDamage, power)
-	-- apply initial damage
-	if not target then return end
-	if damage > 0 then
-		self:project(target, target.x, target.y, DamageType.PHYSICAL, damage)
-		game.level.map:particleEmitter(target.x, target.y, 1, "force_hit", {power=power, dx=target.x - sourceX, dy=target.y - sourceY})
+local function aura_strength(self, t)
+	local add = 0
+	if self:knowTalent(self.T_FOCUSED_CHANNELING) then
+		add = getGemLevel(self)*(1 + 0.1*(self:getTalentLevel(self.T_FOCUSED_CHANNELING) or 0))
 	end
+	--return 5 + (1+ self:getWil(5))*self:getTalentLevel(t) + add
+	return self:combatTalentIntervalDamage(t, "wil", 10, 50) + add
+end
 
-	-- knockback?
-	if not target.dead and knockback and knockback > 0 and target:canBe("knockback") and (target.never_move or 0) < 1 then
-		-- give direct hit a direction?
-		if sourceX == target.x and sourceY == target.y then
-			local newDirection = rng.range(1, 8)
-			sourceX = sourceX + dir_to_coord[newDirection][1]
-			sourceY = sourceY + dir_to_coord[newDirection][2]
-		end
-
-		local lineFunction = line.new(sourceX, sourceY, target.x, target.y, true)
-		local finalX, finalY = target.x, target.y
-		local knockbackCount = 0
-		local blocked = false
-		while knockback > 0 do
-			blocked = true
-			local x, y = lineFunction(true)
-
-			if not game.level.map:isBound(x, y) or game.level.map:checkAllEntities(x, y, "block_move", target) then
-				-- blocked
-				local nextTarget = game.level.map(x, y, Map.ACTOR)
-				if nextTarget then
-					if knockbackCount > 0 then
-						game.logPlayer(self, "%s was blasted %d spaces into %s!", target.name:capitalize(), knockbackCount, nextTarget.name)
-					else
-						game.logPlayer(self, "%s was blasted into %s!", target.name:capitalize(), nextTarget.name)
-					end
-				elseif knockbackCount > 0 then
-					game.logPlayer(self, "%s was smashed back %d spaces!", target.name:capitalize(), knockbackCount)
-				else
-					game.logPlayer(self, "%s was smashed!", target.name:capitalize())
-				end
-
-				-- take partial damage
-				local blockDamage = damage * knockback * knockbackDamage / 100
-				self:project(target, target.x, target.y, DamageType.PHYSICAL, blockDamage)
-
-				if nextTarget then
-					-- start a new force hit with the knockback damage and current knockback
-
-					forceHit(self, nextTarget, sourceX, sourceY, blockDamage, knockback, knockbackDamage, power / 2)
-				end
-
-				knockback = 0
-			else
-				-- allow move
-				finalX, finalY = x, y
-				knockback = knockback - 1
-				knockbackCount = knockbackCount + 1
-			end
-		end
-
-		if not blocked and knockbackCount > 0 then
-			game.logPlayer(self, "%s was blasted back %d spaces!", target.name:capitalize())
-		end
-
-		if not target.dead and (finalX ~= target.x or finalY ~= target.y) then
-			target:move(finalX, finalY, true)
-		end
-	end
+local function aura_mastery(self, t)
+	return 10 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self)
 end
 
 local function aura_range(self, t)
@@ -142,6 +77,13 @@ newTalent{
 		return 15 - (self:getTalentLevelRaw(self.T_AURA_DISCIPLINE) or 0)
 	end,
 	tactical = { ATTACKAREA = 2 },
+	on_pre_use = function(self, t, silent)
+		if self:isTalentActive(self.T_THERMAL_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then
+			if not silent then game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.") end
+			return false
+		end
+		return true
+	end,
 	range = aura_range,
 	radius = aura_radius,
 	target = aura_target,
@@ -180,33 +122,28 @@ newTalent{
 		return t.sustain_psi - 2*getGemLevel(self)
 	end,
 	getAuraStrength = function(self, t)
-		local add = 0
-		if self:knowTalent(self.T_FOCUSED_CHANNELING) then
-			add = getGemLevel(self)*(1 + 0.1*(self:getTalentLevel(self.T_FOCUSED_CHANNELING) or 0))
-		end
-		--return 5 + (1+ self:getWil(5))*self:getTalentLevel(t) + add
-		return self:combatTalentIntervalDamage(t, "wil", 6, 50) + add
+		return aura_strength(self, t)
 	end,
 	getKnockback = function(self, t)
 		return 3 + math.floor(self:getTalentLevel(t))
 	end,
 	do_kineticaura = function(self, t)
-		local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self)
+		local mast = aura_mastery(self, t)
 		local dam = t.getAuraStrength(self, t)
 		local tg = t.getNormalTarget(self, t)
 		self:project(tg, self.x, self.y, function(tx, ty)
-			DamageType:get(DamageType.PHYSICAL).projector(self, tx, ty, DamageType.PHYSICAL, dam)
 			local act = game.level.map(tx, ty, engine.Map.ACTOR)
 			if act then
 				self:incPsi(-dam/mast)
 			end
+			DamageType:get(DamageType.PHYSICAL).projector(self, tx, ty, DamageType.PHYSICAL, dam)
 		end)
 	end,
 	activate = function(self, t)
-		if self:isTalentActive(self.T_THERMAL_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then
-			game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.")
-			return false
-		end
+		--if self:isTalentActive(self.T_THERMAL_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then
+		--	game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.")
+		--	return false
+		--end
 		return true
 	end,
 	deactivate = function(self, t, p)
@@ -234,7 +171,7 @@ newTalent{
 	info = function(self, t)
 		local dam = t.getAuraStrength(self, t)
 		local spikedam = 50 + 0.4 * dam * dam
-		local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self)
+		local mast = aura_mastery(self, t)
 		local spikecost = t.getSpikeCost(self, t)
 		return ([[Fills the air around you with reactive currents of force that do %d physical damage to all who approach. All damage done by the aura will drain one point of energy per %0.2f points of damage dealt.
 		When deactivated, if you have at least %d energy, a massive spike of kinetic energy is released as a beam, smashing targets for %d physical damage and sending them flying. Telekinetically wielding a gem instead of a weapon will result in improved spike efficiency.
@@ -256,6 +193,13 @@ newTalent{
 		return 15 - (self:getTalentLevelRaw(self.T_AURA_DISCIPLINE) or 0)
 	end,
 	tactical = { ATTACKAREA = 2 },
+	on_pre_use = function(self, t, silent)
+		if self:isTalentActive(self.T_KINETIC_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then
+			if not silent then game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.") end
+			return false
+		end
+		return true
+	end,
 	range = aura_range,
 	radius = aura_radius,
 	target = aura_target,
@@ -290,33 +234,28 @@ newTalent{
 		end
 	end,
 	getAuraStrength = function(self, t)
-		local add = 0
-		if self:knowTalent(self.T_FOCUSED_CHANNELING) then
-			add = getGemLevel(self)*(1 + 0.1*(self:getTalentLevel(self.T_FOCUSED_CHANNELING) or 0))
-		end
-		--return 5 + (1+ self:getWil(5))*self:getTalentLevel(t) + add
-		return self:combatTalentIntervalDamage(t, "wil", 6, 50) + add
+		return aura_strength(self, t)
 	end,
 	getSpikeCost = function(self, t)
 		return t.sustain_psi - 2*getGemLevel(self)
 	end,
 	do_thermalaura = function(self, t)
-		local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self)
+		local mast = aura_mastery(self, t)
 		local dam = t.getAuraStrength(self, t)
 		local tg = t.getNormalTarget(self, t)
 		self:project(tg, self.x, self.y, function(tx, ty)
-			DamageType:get(DamageType.FIRE).projector(self, tx, ty, DamageType.FIRE, dam)
 			local act = game.level.map(tx, ty, engine.Map.ACTOR)
 			if act then
 				self:incPsi(-dam/mast)
 			end
+			DamageType:get(DamageType.FIRE).projector(self, tx, ty, DamageType.FIRE, dam)
 		end)
 	end,
 	activate = function(self, t)
-		if self:isTalentActive(self.T_KINETIC_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then
-			game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.")
-			return false
-		end
+		--if self:isTalentActive(self.T_KINETIC_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then
+		--	game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.")
+		--	return false
+		--end
 		return true
 	end,
 	deactivate = function(self, t, p)
@@ -345,7 +284,7 @@ newTalent{
 		local dam = t.getAuraStrength(self, t)
 		local rad = self:getTalentRange(t)
 		local spikedam = 50 + 0.4 * dam * dam
-		local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self)
+		local mast = aura_mastery(self, t)
 		local spikecost = t.getSpikeCost(self, t)
 		return ([[Fills the air around you with reactive currents of furnace-like heat that do %d fire damage to all who approach. All damage done by the aura will drain one point of energy per %0.2f points of damage dealt.
 		When deactivated, if you have at least %d energy, a massive spike of thermal energy is released as a conical blast (radius %d) of superheated air. Anybody caught in it will suffer %d fire damage. Telekinetically wielding a gem instead of a weapon will result in improved spike efficiency.
@@ -367,6 +306,13 @@ newTalent{
 		return 15 - (self:getTalentLevelRaw(self.T_AURA_DISCIPLINE) or 0)
 	end,
 	tactical = { ATTACKAREA = 2 },
+	on_pre_use = function(self, t, silent)
+		if self:isTalentActive(self.T_KINETIC_AURA) and self:isTalentActive(self.T_THERMAL_AURA) then
+			if not silent then game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.") end
+			return false
+		end
+		return true
+	end,
 	range = aura_range,
 	radius = aura_radius,
 	target = aura_target,
@@ -405,33 +351,28 @@ newTalent{
 		return t.sustain_psi - 2*getGemLevel(self)
 	end,
 	getAuraStrength = function(self, t)
-		local add = 0
-		if self:knowTalent(self.T_FOCUSED_CHANNELING) then
-			add = getGemLevel(self)*(1 + 0.1*(self:getTalentLevel(self.T_FOCUSED_CHANNELING) or 0))
-		end
-		--return 5 + (1+ self:getWil(5))*self:getTalentLevel(t) + add
-		return self:combatTalentIntervalDamage(t, "wil", 6, 50) + add
+		return aura_strength(self, t)
 	end,
 	getNumSpikeTargets = function(self, t)
 		return 1 + math.floor(0.5*self:getTalentLevel(t)) + getGemLevel(self)
 	end,
 	do_chargedaura = function(self, t)
-		local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self)
+		local mast = aura_mastery(self, t)
 		local dam = t.getAuraStrength(self, t)
 		local tg = t.getNormalTarget(self, t)
 		self:project(tg, self.x, self.y, function(tx, ty)
-			DamageType:get(DamageType.LIGHTNING).projector(self, tx, ty, DamageType.LIGHTNING, dam)
 			local act = game.level.map(tx, ty, engine.Map.ACTOR)
 			if act then
 				self:incPsi(-dam/mast)
 			end
+			DamageType:get(DamageType.LIGHTNING).projector(self, tx, ty, DamageType.LIGHTNING, dam)
 		end)
 	end,
 	activate = function(self, t)
-		if self:isTalentActive(self.T_THERMAL_AURA) and self:isTalentActive(self.T_KINETIC_AURA) then
-			game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.")
-			return false
-		end
+		--if self:isTalentActive(self.T_THERMAL_AURA) and self:isTalentActive(self.T_KINETIC_AURA) then
+		--	game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.")
+		--	return false
+		--end
 		game:playSoundNear(self, "talents/thunderstorm")
 		return true
 	end,
@@ -500,7 +441,7 @@ newTalent{
 	info = function(self, t)
 		local dam = t.getAuraStrength(self, t)
 		local spikedam = 50 + 0.4 * dam * dam
-		local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self)
+		local mast = aura_mastery(self, t)
 		local spikecost = t.getSpikeCost(self, t)
 		local nb = t.getNumSpikeTargets(self, t)
 		return ([[Fills the air around you with crackling energy, doing %d lightning damage to all who stand nearby. All damage done by the aura will drain one point of energy per %0.2f points of damage dealt.
diff --git a/game/modules/tome/data/zones/reknor-escape/npcs.lua b/game/modules/tome/data/zones/reknor-escape/npcs.lua
index 1f8ad98e59f620865f78851171e4a74a563edec5..9c019b129d6f7186b29e6ecba3abb3a1d1406328 100644
--- a/game/modules/tome/data/zones/reknor-escape/npcs.lua
+++ b/game/modules/tome/data/zones/reknor-escape/npcs.lua
@@ -44,7 +44,7 @@ newEntity{ define_as = "BROTOQ",
 
 	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 },
 	equipment = resolvers.equip{
-		{type="weapon", subtype="longsword", autoreq=true},
+		{type="weapon", subtype="waraxe", defined="SKULLCLEAVER", random_art_replace={chance=75}, autoreq=true},
 		{type="weapon", subtype="longsword", autoreq=true},
 		{type="armor", subtype="light", autoreq=true},
 	},