diff --git a/game/engines/default/engine/resolvers.lua b/game/engines/default/engine/resolvers.lua
index 2b66361c2e5fa530463b26c9607547ca826eea9c..d36a070763e3bbb287c1a2e13c0d5563a1c39155 100644
--- a/game/engines/default/engine/resolvers.lua
+++ b/game/engines/default/engine/resolvers.lua
@@ -133,6 +133,16 @@ function resolvers.calc.rngtalent(t, e)
 	return nil
 end
 
+--- Talents resolver, random choice of set of talents
+function resolvers.rngtalentsets(list)
+	return {__resolver="rngtalentsets", list}
+end
+function resolvers.calc.rngtalentsets(t, e)
+	local set = rng.table(t[1])
+	resolvers.calc.talents({set}, e)
+	return nil
+end
+
 --- Talents masteries
 function resolvers.tmasteries(list)
 	return {__resolver="tmasteries", list}
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 65b2f85879c2fd285efc876e0b0327a19227539f..aa1c33e2ee4fd66a61a32794cf3c41dbbc95f03e 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -8133,4 +8133,4 @@ end
 
 function _M:getShieldDuration(duration)
 	return duration + (self:attr("shield_dur") or 0)
-end
\ No newline at end of file
+end
diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua
index e7f8604166fc80d9652bdd8843c9b640a2794ee8..d04f5f720b623225f2793428b1d680e18bdeee1f 100644
--- a/game/modules/tome/data/birth/classes/mage.lua
+++ b/game/modules/tome/data/birth/classes/mage.lua
@@ -271,6 +271,7 @@ newBirthDescriptor{
 	},
 	birth_example_particles = {
 		"necrotic-aura",
+		-- DGDGDGDG: update
 		function(actor)
 			if core.shader.active(4) then local x, y = actor:attachementSpot("back", true) actor:addParticles(Particles.new("shader_wings", 1, {x=x, y=y, infinite=1, img="darkwings"}))
 			end
diff --git a/game/modules/tome/data/general/npcs/orc-rak-shor.lua b/game/modules/tome/data/general/npcs/orc-rak-shor.lua
index b0141f1e7f2fc9e3cbdafc832858a85b626066e2..13ee9b582281fb8678b0206daffa117adb8c26b2 100644
--- a/game/modules/tome/data/general/npcs/orc-rak-shor.lua
+++ b/game/modules/tome/data/general/npcs/orc-rak-shor.lua
@@ -61,25 +61,54 @@ newEntity{ base = "BASE_NPC_ORC_RAK_SHOR",
 	},
 	combat_armor = 0, combat_def = 5,
 
-	soul = resolvers.rngavg(5, 10),
---[[DGDGDGDG
+	soul = 10,
+
 	resolvers.talents{
-		[Talents.T_NECROTIC_AURA] = 1,
-		[Talents.T_AURA_MASTERY] = 5,
-		[Talents.T_CREATE_MINIONS]={base=4, every=5, max=7},
-		[Talents.T_RIGOR_MORTIS]={base=3, every=5, max=7},
-		[Talents.T_INVOKE_DARKNESS]={base=5, every=5, max=9},
-		[Talents.T_VAMPIRIC_GIFT]={base=2, every=7, max=7},
+		[Talents.T_HIEMAL_SHIELD]={base=2, every=7, max=7},
+		[Talents.T_DESOLATE_WASTE]={last=25, base=0, every=7, max=7},
+		[Talents.T_BLEAK_GUARD]={last=30, base=0, every=7, max=7},
+		[Talents.T_BLURRED_MORTALITY]={base=3, every=5, max=7},
+		[Talents.T_SOUL_LEECH]={base=2, every=8, max=5},
 		[Talents.T_STAFF_MASTERY]={base=2, every=8, max=5},
 	},
-	resolvers.rngtalent{
-		[Talents.T_CIRCLE_OF_DEATH]={base=3, every=5, max=7},
-		[Talents.T_SURGE_OF_UNDEATH]={base=3, every=5, max=7},
-		[Talents.T_WILL_O__THE_WISP]={base=3, every=5, max=7},
-		[Talents.T_FORGERY_OF_HAZE]={base=3, every=5, max=7},
-		[Talents.T_FROSTDUSK]={base=3, every=5, max=7},
+	resolvers.rngtalentsets{
+		-- Skeleton theme
+		{
+			[Talents.T_CALL_OF_THE_CRYPT]={base=5, every=5, max=9},
+			[Talents.T_ASSEMBLE]={base=3, every=5, max=7},
+			[Talents.T_LORD_OF_SKULLS]={last=25, base=0, every=5, max=7},
+			[Talents.T_NECROTIC_AURA]={base=1, every=5, max=7},
+			[Talents.T_SURGE_OF_UNDEATH]={base=3, every=5, max=7},
+			[Talents.T_RECALL_MINIONS]={base=3, every=5, max=7},
+		},
+		-- Ghoul theme
+		{
+			[Talents.T_CALL_OF_THE_MAUSOLEUM]={base=5, every=5, max=9},
+			[Talents.T_CORPSE_EXPLOSION]={base=3, every=5, max=7},
+			[Talents.T_PUTRESCENT_LIQUEFACTION]={last=25, base=0, every=5, max=7},
+			[Talents.T_NECROTIC_AURA]={base=1, every=5, max=7},
+			[Talents.T_SURGE_OF_UNDEATH]={base=3, every=5, max=7},
+			[Talents.T_SUFFER_FOR_ME]={base=3, every=5, max=7},
+		},
+		-- Darkness theme
+		{
+			[Talents.T_INVOKE_DARKNESS]={base=5, every=5, max=9},
+			[Talents.T_CIRCLE_OF_DEATH]={base=3, every=5, max=7},
+			[Talents.T_ERUPTING_SHADOWS]={last=25, base=0, every=5, max=7},
+			[Talents.T_RIVER_OF_SOULS]={last=40, base=0, every=5, max=7},
+			[Talents.T_DREAD]={base=3, every=5, max=7},
+			[Talents.T_CREPUSCULE]={base=3, every=5, max=7},
+		},
+		-- Cold theme
+		{
+			[Talents.T_CHILL_OF_THE_TOMB]={base=5, every=5, max=9},
+			[Talents.T_BLACK_ICE]={base=3, every=5, max=7},
+			[Talents.T_CORPSELIGHT]={base=3, every=5, max=7},
+			[Talents.T_RIME_WRAITH]={base=3, every=5, max=7},
+			[Talents.T_FRIGID_PLUNGE]={base=3, every=5, max=7},
+			[Talents.T_PERMAFROST]={base=3, every=5, max=7},
+		},
 	},
-]]
 	resolvers.sustains_at_birth(),
 }
 
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/immovable_jelly_malevolent_dimensional_jelly.png b/game/modules/tome/data/gfx/shockbolt/npc/immovable_jelly_malevolent_dimensional_jelly.png
index ba5cd43443b456c6f1a3e7de2ec8a818aa2c5415..02e3b8672c947c0af16f83c8b7b769c9ca908b29 100644
Binary files a/game/modules/tome/data/gfx/shockbolt/npc/immovable_jelly_malevolent_dimensional_jelly.png and b/game/modules/tome/data/gfx/shockbolt/npc/immovable_jelly_malevolent_dimensional_jelly.png differ
diff --git a/game/modules/tome/data/talents/spells/necrosis.lua b/game/modules/tome/data/talents/spells/necrosis.lua
index 1985f51e40b2243e8f2d49f3a94f29689b1bd9d0..4f67c183213ccf00480c567cd3c3b5b53c9c75e9 100644
--- a/game/modules/tome/data/talents/spells/necrosis.lua
+++ b/game/modules/tome/data/talents/spells/necrosis.lua
@@ -39,6 +39,7 @@ newTalent{
 		self:updateTalentPassives(t)
 	end),
 	passives = function(self, t, p)
+		if type(self.max_life) ~= "number" then return end -- Prevent running on NPCs being spawned
 		local bonus = t.getLifeBonus(self, t)
 		self:talentTemporaryValue(p, "die_at", -bonus)
 		self:talentTemporaryValue(p, "max_life", -math.ceil(bonus * t.getLifeLostFactor(self, t)))
diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua
index f698475d5f629279646ee66e8af31b5e4abeea32..13b50ac037582be070b9b7afe0c3df4b6dbe92cf 100644
--- a/game/modules/tome/data/timed_effects/magical.lua
+++ b/game/modules/tome/data/timed_effects/magical.lua
@@ -772,7 +772,7 @@ newEffect{
 	on_merge = function(self, old_eff, new_eff)
 		local new_eff_adj = {} -- Adjust for shield modifiers
 		new_eff_adj.power = self:getShieldAmount(new_eff.power)
-		new_eff_adj.dur = self:getShieldDuration(new_eff_adj.dur)
+		new_eff_adj.dur = self:getShieldDuration(new_eff.dur)
 		-- If the new shield would be stronger than the existing one, just replace it
 		if old_eff.dur > new_eff_adj.dur then return old_eff end
 		if math.max(self.damage_shield_absorb, self.damage_shield_absorb_max) <= new_eff_adj.power then
@@ -4962,11 +4962,8 @@ newEffect{
 		self:removeEffect(self.EFF_CORPSELIGHT, true, true)
 	end,
 	explode = function(self, eff)
-		game.log("====================1")
 		if not self:knowTalent(self.T_GRAVE_MISTAKE) then return end
-		game.log("====================2")
 		if eff.exploded then return end
-		game.log("====================3")
 		eff.exploded = true
 		self:callTalent(self.T_GRAVE_MISTAKE, "explode", eff.x, eff.y, eff.effective_radius, eff.stacks)
 	end,