diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index 164521a397205101bc0f325359c5f8d9dbce1d95..90e8162d877a0784e27fea5263057c3890c95e5d 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -91,6 +91,8 @@ function _M:init(t, no_default)
 	self.died_times = self.died_times or {}
 	self.last_learnt_talents = self.last_learnt_talents or { class={}, generic={} }
 	self.puuid = self.puuid or util.uuid()
+
+	self.damage_log = self.damage_log or {}
 end
 
 function _M:onBirth(birther)
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index ff8da71095caafa4390f8eb498cb439a580100f7..df59d26f6e56c3804f8ab11e5d1428f1fc8abd31 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -341,6 +341,10 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 			game.logSeen(target, "%s is healed by the %s%s#LAST# damage!", target.name:capitalize(), DamageType:get(type).text_color or "#aaaaaa#", DamageType:get(type).name)
 		end
 
+		if dam > 0 and src.damage_log then
+			src.damage_log[type] = (src.damage_log[type] or 0) + dam
+		end
+
 		if dam > 0 and source_talent then
 			local t = source_talent
 
diff --git a/game/modules/tome/data/general/objects/special-artifacts.lua b/game/modules/tome/data/general/objects/special-artifacts.lua
index e0ac36e7774ceda5b3a06abd82b5f8dbe21c1b7c..3d8313ebe08907b74fce3817d6eead0081d2e827 100644
--- a/game/modules/tome/data/general/objects/special-artifacts.lua
+++ b/game/modules/tome/data/general/objects/special-artifacts.lua
@@ -20,6 +20,8 @@
 local Stats = require "engine.interface.ActorStats"
 local Talents = require "engine.interface.ActorTalents"
 
+load("/data/general/objects/staves.lua")
+
 -- This file describes artifacts not bound to a special location or quest, but still special(they do not get randomly generated)
 
 newEntity{ base = "BASE_STAFF", define_as = "TELOS_SPIRE",
@@ -59,6 +61,5 @@ newEntity{ base = "BASE_STAFF", define_as = "TELOS_SPIRE",
 		damage_affinity = { [DamageType.ARCANE] = 15, [DamageType.BLIGHT] = 15, [DamageType.COLD] = 15, [DamageType.DARKNESS] = 15, [DamageType.ACID] = 15, [DamageType.LIGHT] = 15, },
 		confusion_immune = 0.4,
 		vim_on_crit = 6,
-		learn_talent = {[Talents.T_COMMAND_STAFF] = 1,},
 	},
 }
diff --git a/game/modules/tome/data/gfx/talents/elemental_surge.png b/game/modules/tome/data/gfx/talents/elemental_surge.png
new file mode 100644
index 0000000000000000000000000000000000000000..b193c4657cdba8d9211242cfbaebcb2d39cc1aaa
Binary files /dev/null and b/game/modules/tome/data/gfx/talents/elemental_surge.png differ
diff --git a/game/modules/tome/data/gfx/talents/secrets_of_telos.png b/game/modules/tome/data/gfx/talents/secrets_of_telos.png
new file mode 100644
index 0000000000000000000000000000000000000000..d142b503f6bca0be078a9b404b90dce2f204b6ca
Binary files /dev/null and b/game/modules/tome/data/gfx/talents/secrets_of_telos.png differ
diff --git a/game/modules/tome/data/talents/uber/cun.lua b/game/modules/tome/data/talents/uber/cun.lua
index 4d3b6368f99d134239e411b48cec798fda0a400c..b7bc6c93018ee3524be99776ea96bcdb3a6e220d 100644
--- a/game/modules/tome/data/talents/uber/cun.lua
+++ b/game/modules/tome/data/talents/uber/cun.lua
@@ -81,6 +81,13 @@ uberTalent{
 uberTalent{
 	name = "Endless Woes",
 	mode = "passive",
+	require = { special={desc="Dealt over 50000 acid, blight or darkness damage", fct=function(self) return 
+		self.damage_log and (
+			(self.damage_log[DamageType.ACID] and self.damage_log[DamageType.ACID] >= 50000) or
+			(self.damage_log[DamageType.BLIGHT] and self.damage_log[DamageType.BLIGHT] >= 50000) or
+			(self.damage_log[DamageType.DARKNESS] and self.damage_log[DamageType.DARKNESS] >= 50000)
+		)
+	end} },
 	trigger = function(self, t, target, damtype, dam)
 		if dam < 150 then return end
 		if damtype == DamageType.ACID and rng.percent(15) then
@@ -141,6 +148,16 @@ uberTalent{
 uberTalent{
 	name = "Elemental Surge",
 	mode = "passive",
+	require = { special={desc="Dealt over 50000 arcane, fire, cold, lightning, light or nature damage", fct=function(self) return 
+		self.damage_log and (
+			(self.damage_log[DamageType.ARCANE] and self.damage_log[DamageType.ARCANE] >= 50000) or
+			(self.damage_log[DamageType.FIRE] and self.damage_log[DamageType.FIRE] >= 50000) or
+			(self.damage_log[DamageType.COLD] and self.damage_log[DamageType.COLD] >= 50000) or
+			(self.damage_log[DamageType.LIGHTNING] and self.damage_log[DamageType.LIGHTNING] >= 50000) or
+			(self.damage_log[DamageType.LIGHT] and self.damage_log[DamageType.LIGHT] >= 50000) or
+			(self.damage_log[DamageType.NATURE] and self.damage_log[DamageType.NATURE] >= 50000)
+		)
+	end} },
 	trigger = function(self, t, target, damtype, dam)
 		if dam < 150 then return end
 		if damtype == DamageType.ARCANE and rng.percent(15) then