diff --git a/game/modules/tome/class/NPC.lua b/game/modules/tome/class/NPC.lua
index 4c57637995353834e32a17faa1451b6545de1b08..e64214c51c15d87a9198a7127f3838f3c50cac7d 100644
--- a/game/modules/tome/class/NPC.lua
+++ b/game/modules/tome/class/NPC.lua
@@ -552,23 +552,6 @@ function _M:addedToLevel(level, x, y)
 		if self:knowTalent(self.T_COMMAND_STAFF) then -- make sure staff aspect is appropriate to talents
 			self:forceUseTalent(self.T_COMMAND_STAFF, {ignore_energy = true, ignore_cd=true, silent=true})
 		end
-
-		if profile and profile.auth and profile.auth.login == "raderak" then
-			if self.rank <= 3 and self.name == "snow giant boulder thrower" then
-				local b = game.state:createRandomBoss(self, {level=self.level})
-				if b then
-					local uid = self.uid
-					self:replaceWith(b)
-					self.uid = uid
-					self.desc = (self.desc or "").."\n#CRIMSON#Well Raderak, you wanted them buffed. I did... but ONLY FOR YOU ! :) *CACKLES EVILY*\n-- yours truly, DarkGod#LAST#"
-				end
-			end
-			if self.type == "vermin" and self.subtype == "rodent" then
-				self.max_life = self.max_life * 20
-				self.life = self.life * 20
-				self.desc = (self.desc or "").."\n#CRIMSON#Well Raderak, you wanted them buffed. I did... but ONLY FOR YOU ! :) *CACKLES EVILY*\n-- yours truly, DarkGod#LAST#"
-			end
-		end
 	end
 
 	-- Bosses that can pass through things should be smart about finding their target
diff --git a/game/modules/tome/data/gfx/particles_images/tentacles_shader/whispy_tentacles_better.png b/game/modules/tome/data/gfx/particles_images/tentacles_shader/whispy_tentacles_better.png
new file mode 100644
index 0000000000000000000000000000000000000000..14d5121d3f18cf0c2ee4fbb7d6be8f831cedb803
Binary files /dev/null and b/game/modules/tome/data/gfx/particles_images/tentacles_shader/whispy_tentacles_better.png differ
diff --git a/game/modules/tome/data/talents/cunning/stealth.lua b/game/modules/tome/data/talents/cunning/stealth.lua
index aba927ebbc48827e4433460126cbd096c371f280..829d1f95aa3c4c88b22e17b3a95a266d0b0c40d8 100644
--- a/game/modules/tome/data/talents/cunning/stealth.lua
+++ b/game/modules/tome/data/talents/cunning/stealth.lua
@@ -103,7 +103,21 @@ newTalent{
 			local t = self:getTalentFromId(self.T_TERRORIZE)
 			t.terrorize(self,t)
 		end
-		
+
+		if self:knowTalent(self.T_SHADOWSTRIKE) then
+			local power = self:callTalent(self.T_SHADOWSTRIKE, "getMultiplier") * 100
+			local dur = self:callTalent(self.T_SHADOWSTRIKE, "getDuration")
+			
+			self:setEffect(self.EFF_SHADOWSTRIKE, dur, {power=power})
+		end
+
+		if self:knowTalent(self.T_SOOTHING_DARKNESS) then
+			local life = self:callTalent(self.T_SOOTHING_DARKNESS, "getLife") * 5
+			local sta = self:callTalent(self.T_SOOTHING_DARKNESS, "getStamina")
+			local dur = self:callTalent(self.T_SOOTHING_DARKNESS, "getDuration")
+			self:setEffect(self.EFF_SOOTHING_DARKNESS, dur, {life=life, stamina=sta})
+		end
+
 		local sd = self:hasEffect(self.EFF_SHADOW_DANCE)
 		if sd then
 			sd.no_cancel_stealth = true
@@ -140,15 +154,18 @@ newTalent{
 	require = cuns_req2,
 	mode = "passive",
 	points = 5,
-	getMultiplier = function(self, t) return self:combatTalentScale(t, .10, .35) end,
-
+	getMultiplier = function(self, t) return self:combatTalentScale(t, 0.15, 0.40) end,
+	getDuration = function(self,t) if self:getTalentLevel(t) >= 3 then return 4 else return 3 end end,
 	passives = function(self, t, p) -- attribute that increases crit multiplier vs targets that cannot see us
 		self:talentTemporaryValue(p, "unseen_critical_power", t.getMultiplier(self, t))
 	end,
 	info = function(self, t)
-	local multiplier = t.getMultiplier(self, t)*100
-	return ([[You know how to make the most out of being unseen.  Your critical multiplier against targets that cannot see you is increased by up to %d%%. (You must be able to see your target and the bonus is reduced from its full value at range 3 to 0 at range 10.)
-	Also, when striking from stealth, your attacks are automatically critical if the target does not notice you just before you land it.  (Spell and mind attacks critically strike even if the target notices you.)]]):format(multiplier)
+		local multiplier = t.getMultiplier(self, t)*100
+		local dur = t.getDuration(self, t)
+		return ([[You know how to make the most out of being unseen.
+		When striking from stealth, your attacks are automatically critical if the target does not notice you just before you land it.  (Spell and mind attacks critically strike even if the target notices you.)
+		Your critical multiplier against targets that cannot see you is increased by up to %d%%. (You must be able to see your target and the bonus is reduced from its full value at range 3 to 0 at range 10.)
+		Also when you exit stealth for any reasons you conserve the critical multiplier for %d turns (with no range restriction).]]):format(multiplier, dur)
 	end,
 }
 
@@ -158,18 +175,19 @@ newTalent{
 	require = cuns_req3,
 	points = 5,
 	mode = "passive",
-	getLife = function(self, t) return self:combatStatScale("cun", 0.5, 5, 0.75) + self:combatTalentScale(t, 0.5, 5, 0.75) end, -- Primarily for out of combat recovery
+	getLife = function(self, t) return self:combatStatScale("cun", 0.5, 5, 0.75) + self:combatTalentScale(t, 0.5, 5, 0.75) end,
 	getStamina = function(self, t) return self:combatTalentScale(t, 1, 2.5) end, --2.9 @TL5
 	getRadius = function(self, t, fake)
 		if not fake and game.level.map.lites(self.x, self.y) then return 0 end
 		return math.floor(self:combatTalentLimit(t, 10, 2, 5))
 	end,
-	getDuration = function(self,t) if self:getTalentLevel(t) >= 3 then return 3 else return 2 end end,
+	getDuration = function(self,t) if self:getTalentLevel(t) >= 3 then return 4 else return 3 end end,
 	info = function(self, t)
 		return ([[You have a special affinity for darkness and shadows.
 		When standing in an unlit grid, the minimum range to your foes for activating stealth or for maintaining it after a Shadow Dance is reduced by %d.
-		While stealthed, and for %d turns thereafter, your life regeneration is increased by %0.1f (based on your Cunning) and your stamina regeneration is increased %0.1f.]]):
-		format(t.getRadius(self, t, true), t.getDuration(self, t), t.getLife(self,t), t.getStamina(self,t))
+		While stealthed your life regeneration is increased by %0.1f (based on your Cunning) and your stamina regeneration is increased %0.1f.
+		For %d turns thereafter you keep the stamina regeneration and gain 500%% of the life regeneration.]]):
+		format(t.getRadius(self, t, true), t.getLife(self,t), t.getStamina(self,t), t.getDuration(self, t))
 	end,
 }
 
@@ -205,4 +223,4 @@ newTalent{
 		When your Shadow Dance ends, you must make a stealth check against targets in radius %d%s or be revealed.]]):
 		format(t.getDuration(self, t), radius, xs)
 	end,
-}
\ No newline at end of file
+}
diff --git a/game/modules/tome/data/talents/misc/races.lua b/game/modules/tome/data/talents/misc/races.lua
index a8ffca306e81840bd195e12e72afea59d132d315..49f252f6ca4ad06bd02439b4fb5aee2baecaae05 100644
--- a/game/modules/tome/data/talents/misc/races.lua
+++ b/game/modules/tome/data/talents/misc/races.lua
@@ -168,9 +168,7 @@ newTalent{
 	critChance = function(self, t) return self:combatTalentScale(t, 3, 10, 0.75) end,
 	critPower = function(self, t) return self:combatTalentScale(t, 5, 20, 0.75) end,
 	passives = function(self, t, p)
-		self:talentTemporaryValue(p, "combat_physcrit", t.critChance(self, t))
-		self:talentTemporaryValue(p, "combat_spellcrit", t.critChance(self, t))
-		self:talentTemporaryValue(p, "combat_mindcrit", t.critChance(self, t))
+		self:talentTemporaryValue(p, "combat_generic_crit", t.critChance(self, t))
 		self:talentTemporaryValue(p, "combat_critical_power", t.critPower(self, t))
 	end,
 	info = function(self, t)
diff --git a/game/modules/tome/data/talents/techniques/combat-training.lua b/game/modules/tome/data/talents/techniques/combat-training.lua
index 3ce7884fc594c6952f77f33bb1e3aac8556ccadf..c88b8949cffcfeb07d6c138e0e84c8fd5fb315dc 100644
--- a/game/modules/tome/data/talents/techniques/combat-training.lua
+++ b/game/modules/tome/data/talents/techniques/combat-training.lua
@@ -109,6 +109,7 @@ newTalent{
 	mode = "passive",
 	levelup_screen_break_line = true,
 	points = 5,
+	no_npc_use = true,
 	require = {stat = {dex = function(level) return 16 + (level + 2) * (level - 1) end}},
 	getArmorHardiness = function(self, t)
 		return math.max(0, self:combatLimit(self:getTalentLevel(t) * 4, 100, 5, 3.75, 50, 37.5))
diff --git a/game/modules/tome/data/talents/uber/cun.lua b/game/modules/tome/data/talents/uber/cun.lua
index 522017b4bbd15c61571e5a083f19ef06d0b373fa..ac7d5cb7ea6b108975c0c263606d84821451401d 100644
--- a/game/modules/tome/data/talents/uber/cun.lua
+++ b/game/modules/tome/data/talents/uber/cun.lua
@@ -213,6 +213,23 @@ uberTalent{
 	end,
 }
 
+eye_of_the_tiger_data = {
+	physical = {
+		desc = "All physical criticals reduce the remaining cooldown of a random technique or cunning talent by 2.",
+		types = { "^technique/", "^cunning/" },
+		reduce = 2,
+	},
+	spell = {
+		desc = "All spell criticals reduce the remaining cooldown of a random spell talent by 1.",
+		types = { "^spell/", "^corruption/", "^celestial/", "^chronomancy/" },
+		reduce = 1,
+	},
+	mind = {
+		desc = "All mind criticals reduce the remaining cooldown of a random wild gift/psionic/afflicted talent by 2.",
+		types = { "^wild%-gift/", "^cursed/", "^psionic/" },
+		reduce = 2,
+	},
+}
 uberTalent{
 	name = "Eye of the Tiger",
 	mode = "passive",
@@ -224,46 +241,30 @@ uberTalent{
 		for tid, _ in pairs(self.talents_cd) do
 			local t = self:getTalentFromId(tid)
 			if not t.fixed_cooldown then
-				if
-					(kind == "physical" and
-						(
-							t.type[1]:find("^technique/") or
-							t.type[1]:find("^cunning/")
-						)
-					) or
-					(kind == "spell" and
-						(
-							t.type[1]:find("^spell/") or
-							t.type[1]:find("^corruption/") or
-							t.type[1]:find("^celestial/") or
-							t.type[1]:find("^chronomancy/")
-						)
-					) or
-					(kind == "mind" and
-						(
-							t.type[1]:find("^wild%-gift/") or
-							t.type[1]:find("^cursed/") or
-							t.type[1]:find("^psionic/")
-						)
-					)
-					then
+				local ok = false
+				local d = eye_of_the_tiger_data[kind]
+				if d then for _, check in ipairs(d.types) do
+						if t.type[1]:find(check) then ok = true break end
+				end end
+				if ok then
 					tids[#tids+1] = tid
 				end
 			end
 		end
 		if #tids == 0 then return end
 		local tid = rng.table(tids)
-		self.talents_cd[tid] = self.talents_cd[tid] - (kind == "spell" and 1 or 2)
+		local d = eye_of_the_tiger_data[kind]
+		self.talents_cd[tid] = self.talents_cd[tid] - (d and d.reduce or 1)
 		if self.talents_cd[tid] <= 0 then self.talents_cd[tid] = nil end
 		self.changed = true
 		self.turn_procs.eye_tiger = true
 	end,
 	info = function(self, t)
-		return ([[All physical criticals reduce the remaining cooldown of a random technique or cunning talent by 2.
-		All spell criticals reduce the remaining cooldown of a random spell talent by 1.
-		All mind criticals reduce the remaining cooldown of a random wild gift/psionic/afflicted talent by 2.
+		local list = {}
+		for _, d in pairs(eye_of_the_tiger_data) do list[#list+1] = d.desc end
+		return ([[%s		
 		This can only happen once per turn, and cannot affect the talent that triggers it.]])
-		:format()
+		:format(table.concat(list, "\n"))
 	end,
 }
 
diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua
index eede47416f5437da0169f658c894d6f5ea693fd1..30ea6520c07ee20370e75b11d56a62add73e9791 100644
--- a/game/modules/tome/data/timed_effects/physical.lua
+++ b/game/modules/tome/data/timed_effects/physical.lua
@@ -3948,4 +3948,19 @@ newEffect{
 			self:removeTemporaryValue("confused", eff.cid)
 		end
 	end,
-}
\ No newline at end of file
+}
+
+newEffect{
+	name = "SHADOWSTRIKE", image = "talents/shadowstrike.png",
+	desc = "Shadowstrike",
+	long_desc = function(self, eff) return ("The target's critical strike damage bonus is increased by %d%%."):format(eff.power) end,
+	type = "magical",
+	subtype = { darkness=true },
+	status = "beneficial",
+	parameters = { power=1 },
+	on_gain = function(self, err) return nil, true end,
+	on_lose = function(self, err) return nil, true end,
+	activate = function(self, eff)
+		self:effectTemporaryValue(eff, "combat_critical_power", eff.power)
+	end,
+}