diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua
index 35ac8d5d7af9a79ec50760102092a078373128ff..460e461b21b5a4e35380dc46244811c39f3532ec 100644
--- a/game/modules/tome/data/birth/classes/mage.lua
+++ b/game/modules/tome/data/birth/classes/mage.lua
@@ -203,7 +203,7 @@ newBirthDescriptor{
 	talents = {
 		[ActorTalents.T_NECROTIC_AURA] = 1,
 		[ActorTalents.T_CREATE_MINIONS] = 1,
-		[ActorTalents.T_NECROMANTIC_FANG] = 1,
+--		[ActorTalents.T_NECROMANTIC_FANG] = 1,
 		[ActorTalents.T_INVOKE_DARKNESS] = 1,
 		[ActorTalents.T_BLURRED_MORTALITY] = 1,
 	},
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/undead_ghost_will_o__the_wisp.png b/game/modules/tome/data/gfx/shockbolt/npc/undead_ghost_will_o__the_wisp.png
new file mode 100644
index 0000000000000000000000000000000000000000..6061b1b5538434ad99fea3fc91854c8b4bea3022
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/undead_ghost_will_o__the_wisp.png differ
diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua
index 248079d17cd8f9ad13ab89f2eea4c488c957b4d9..7ce2fab1dec3b49cacdc2dd86cb5f5692724057d 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -1238,6 +1238,31 @@ newTalent{
 	end,
 }
 
+newTalent{
+	name = "Will o' the Wisp Explode",
+	type = {"technique/other", 1},
+	points = 5,
+	message = "@Source@ explodes! @target@ is enveloped in frost.",
+	cooldown = 1,
+	range = 1,
+	requires_target = true,
+	tactical = { ATTACK = 1 },
+	action = function(self, t)
+		local tg = {type="bolt", range=1}
+		local x, y, target = self:getTarget(tg)
+		if not x or not y then return nil end
+		if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
+		self:project(tg, x, y, DamageType.COLD, self.will_o_wisp_dam or 1)
+		game.level.map:particleEmitter(self.x, self.y, 1, "ball_ice", {radius = 1, r = 1, g = 0, b = 0})
+		self:die(self)
+		game:playSoundNear(self, "talents/ice")
+		return true
+	end,
+	info = function(self, t)
+		return ([[Explodes.]])
+	end,
+}
+
 newTalent{
 	name = "Elemental bolt",
 	type = {"spell/other", 1},
diff --git a/game/modules/tome/data/talents/spells/grave.lua b/game/modules/tome/data/talents/spells/grave.lua
index 6556703bd023b1cd0513e09c6d1b45d4ba2082f5..37a824f1b581632f387962f2aaeb5d4503f21619 100644
--- a/game/modules/tome/data/talents/spells/grave.lua
+++ b/game/modules/tome/data/talents/spells/grave.lua
@@ -20,37 +20,120 @@
 local Object = require "mod.class.Object"
 
 newTalent{
-	name = "Necromantic Fang",
+	name = "Chill of the Tomb",
 	type = {"spell/grave",1},
 	require = spells_req1,
 	points = 5,
-	random_ego = "attack",
-	mana = 12,
-	cooldown = 3,
-	tactical = { ATTACK = 2 },
-	range = 10,
-	reflectable = true,
-	proj_speed = 20,
+	mana = 30,
+	cooldown = 8,
+	tactical = { ATTACKAREA = 2 },
+	range = 7,
+	radius = function(self, t)
+		return 1 + self:getTalentLevelRaw(t)
+	end,
+	proj_speed = 4,
+	direct_hit = true,
 	requires_target = true,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 230) end,
+	target = function(self, t)
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=self:spellFriendlyFire(), talent=t, display={particle="bolt_ice", trail="icetrail"}}
+	end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 28, 280) end,
 	action = function(self, t)
+		local tg = self:getTalentTarget(t)
+		local x, y = self:getTarget(tg)
+		if not x or not y then return nil end
+		self:projectile(tg, x, y, DamageType.COLD, self:spellCrit(t.getDamage(self, t)), function(self, tg, x, y, grids)
+			game.level.map:particleEmitter(x, y, tg.radius, "iceflash", {radius=tg.radius, tx=x, ty=y})
+		end)
+		game:playSoundNear(self, "talents/ice")
 		return true
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Conjures up a bolt of darkness, doing %0.2f darkness damage.
-		At level 3 it will create a beam of shadows.
-		At level 5 it will not hurt your minions anymore.
+		local radius = self:getTalentRadius(t)
+		return ([[Conjures up a bolt of cold moving toward the target that explodes into a chilly circle of death doing %0.2f cold damage in a radius of %d.
 		The damage will increase with the Magic stat]]):
-		format(damDesc(self, DamageType.DARKNESS, damage))
+		format(damDesc(self, DamageType.COLD, damage), radius)
 	end,
 }
 
--- Kinda copied from Creeping Darkness
 newTalent{
-	name = "Cold Flames",
+	name = "Will o' the Wisp",
 	type = {"spell/grave",2},
 	require = spells_req2,
+	mode = "sustained",
+	points = 5,
+	mana = 60,
+	cooldown = 30,
+	tactical = { BUFF = 3 },
+	getParams = function(self, t) return util.bound(30 + self:getTalentLevel(t) * 10, 30, 100), 20 + self:combatTalentSpellDamage(t, 25, 300) end,
+	summon = function(self, t, dam, src, killer)
+		local minion = require("mod.class.NPC").new{
+			name = "will o' the wisp",
+			type = "undead", subtype = "ghost",
+			blood_color = colors.GREY,
+			display = "G", color=colors.WHITE,
+			combat = { dam=1, atk=1, apr=1 },
+			autolevel = "warriormage",
+			ai = "dumb_talented_simple", ai_state = { talent_in=1, },
+			dont_pass_target = true,
+			movement_speed = 2,
+			stats = { str=14, dex=18, mag=20, con=12 },
+			rank = 2,
+			size_category = 1,
+			infravision = 10,
+			can_pass = {pass_wall=70},
+			resists = {all = 35, [DamageType.LIGHT] = -70, [DamageType.DARKNESS] = 65},
+			no_breath = 1,
+			stone_immune = 1,
+			confusion_immune = 1,
+			fear_immune = 1,
+			teleport_immune = 0.5,
+			disease_immune = 1,
+			poison_immune = 1,
+			stun_immune = 1,
+			blind_immune = 1,
+			cut_immune = 1,
+			see_invisible = 80,
+			undead = 1,
+			will_o_wisp_dam = dam,
+			talents = {T_WILL_O__THE_WISP_EXPLODE = 1},
+		}
+		local x, y = util.findFreeGrid(src.x or self.x, src.y or self.y, 5, true, {[Map.ACTOR]=true})
+		if minion and x and y then
+			necroSetupSummon(self, minion, x, y, lev, true)
+			minion.on_die = nil
+			minion.on_act = nil
+			minion:setTarget(killer)
+		end
+
+	end,
+	activate = function(self, t)
+		local chance, dam = t.getParams(self, t)
+		game:playSoundNear(self, "talents/spell_generic2")
+		local ret = {
+			chance = chance,
+			dam = dam,
+		}
+		return ret
+	end,
+	deactivate = function(self, t, p)
+		return true
+	end,
+	info = function(self, t)
+		local chance, dam = t.getParams(self, t)
+		return ([[Surround yourself with undead energies, when one of your minions is destroyed while inside your necrotic aura it has %d%% chances to create a will o' the wisp.
+		Will o' the wisp will take a random target in sight and home on it, when they reach it they explode for %0.2f cold damage.
+		The damage will increase with the Magic stat]]):
+		format(chance, damDesc(self, DamageType.DARKNESS, dam))
+	end,
+}
+
+-- Kinda copied from Creeping Darkness
+newTalent{
+	name = "Cold Flames",
+	type = {"spell/grave",3},
+	require = spells_req3,
 	points = 5,
 	mana = 40,
 	cooldown = 22,
@@ -235,45 +318,6 @@ newTalent{
 	end,
 }
 
-newTalent{
-	name = "Chill of the Tomb",
-	type = {"spell/grave",3},
-	require = spells_req3,
-	points = 5,
-	random_ego = "attack",
-	mana = 40,
-	cooldown = 8,
-	tactical = { ATTACKAREA = 2 },
-	range = 7,
-	radius = function(self, t)
-		return 1 + self:getTalentLevelRaw(t)
-	end,
-	proj_speed = 4,
-	direct_hit = true,
-	requires_target = true,
-	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=self:spellFriendlyFire(), talent=t, display={particle="bolt_ice", trail="icetrail"}}
-	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 28, 280) end,
-	action = function(self, t)
-		local tg = self:getTalentTarget(t)
-		local x, y = self:getTarget(tg)
-		if not x or not y then return nil end
-		self:projectile(tg, x, y, DamageType.COLD, self:spellCrit(t.getDamage(self, t)), function(self, tg, x, y, grids)
-			game.level.map:particleEmitter(x, y, tg.radius, "iceflash", {radius=tg.radius, tx=x, ty=y})
-		end)
-		game:playSoundNear(self, "talents/ice")
-		return true
-	end,
-	info = function(self, t)
-		local damage = t.getDamage(self, t)
-		local radius = self:getTalentRadius(t)
-		return ([[Conjures up a bolt of cold moving toward the target that explodes into a chilly circle of death doing %0.2f cold damage in a radius of %d.
-		The damage will increase with the Magic stat]]):
-		format(damDesc(self, DamageType.COLD, damage), radius)
-	end,
-}
-
 newTalent{
 	name = "Vampiric Gift",
 	type = {"spell/grave",4},
diff --git a/game/modules/tome/data/talents/spells/spells.lua b/game/modules/tome/data/talents/spells/spells.lua
index d7c9264e9de4a36469b3d1507041195dd83b82e7..82e9b5417d1d94c017477527c2db32f0d39e1c52 100644
--- a/game/modules/tome/data/talents/spells/spells.lua
+++ b/game/modules/tome/data/talents/spells/spells.lua
@@ -191,6 +191,17 @@ function necroSetupSummon(self, m, x, y, level, no_control)
 		end
 	end
 
+	m.on_die = function(self, killer)
+		local src = self.summoner
+		local w = src:isTalentActive(src.T_WILL_O__THE_WISP)
+		local p = src:isTalentActive(src.T_NECROTIC_AURA)
+		if w and p and self.x and self.y and src.x and src.y and core.fov.distance(self.x, self.y, src.x, src.y) > self.summoner.necrotic_aura_radius then return end
+		if not rng.percent(w.chance) then return end
+
+		local t = src:getTalentFromId(src.T_WILL_O__THE_WISP)
+		t.summon(src, t, w.dam, self, killer)
+	end
+
 	-- Summons never flee
 	m.ai_tactic = m.ai_tactic or {}
 	m.ai_tactic.escape = 0
diff --git a/game/modules/tome/data/talents/techniques/2hweapon.lua b/game/modules/tome/data/talents/techniques/2hweapon.lua
index 908a1430d3c662181b5e031859c85dce6855f658..6cca1dfd541d34a6f24ab0373bdef4e18eb23678 100644
--- a/game/modules/tome/data/talents/techniques/2hweapon.lua
+++ b/game/modules/tome/data/talents/techniques/2hweapon.lua
@@ -30,7 +30,7 @@ newTalent{
 	range = 0,
 	radius = 1,
 	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
+		return {type="ball", range=self:getTalentRange(t), selffire=false, radius=self:getTalentRadius(t)}
 	end,
 	on_pre_use = function(self, t, silent) if not self:hasTwoHandedWeapon() then if not silent then game.logPlayer(self, "You require a two handed weapon to use this talent.") end return false end return true end,
 	action = function(self, t)
diff --git a/ideas/spells.ods b/ideas/spells.ods
index 44450083aa805627c559c22885bb3417bcfd9250..f2029f33d673dd5f950fdbdcbf5117cfbc26cffd 100644
Binary files a/ideas/spells.ods and b/ideas/spells.ods differ