diff --git a/game/engines/default/engine/interface/ActorProject.lua b/game/engines/default/engine/interface/ActorProject.lua
index 90c1bd0e073cc0271ed1d8a6239bc35ad8d49fdf..fd6035105a3c22a44b27b5e0f8239f49c8dfcf5b 100644
--- a/game/engines/default/engine/interface/ActorProject.lua
+++ b/game/engines/default/engine/interface/ActorProject.lua
@@ -305,6 +305,8 @@ function _M:projectile(t, x, y, damtype, dam, particles)
 
 	local proj = require(self.projectile_class):makeProject(self, t.display, {x=x, y=y, start_x=typ.start_x, start_y=typ.start_y, damtype=damtype, tg=t, typ=typ, dam=dam, particles=particles})
 	game.zone:addEntity(game.level, proj, "projectile", typ.start_x, typ.start_y)
+
+	self:check("on_projectile_fired", proj, typ, x, y, damtype, dam, particles)
 end
 
 -- @param typ a target type table
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index be69284ac01b1242d31ee3f9c792e2c0c4ba3ad7..e4f994a925d698cdc2685d921bc18d7248a2ec33 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -1510,11 +1510,11 @@ function _M:onTakeHit(value, src)
 	end
 
 	if self:attr("disruption_shield") then
-		local mana = self:getMana()
+		local mana = self:getMaxMana() - self:getMana()
 		local mana_val = value * self:attr("disruption_shield")
 		-- We have enough to absorb the full hit
 		if mana_val <= mana then
-			self:incMana(-mana_val)
+			self:incMana(mana_val)
 			self.disruption_shield_absorb = self.disruption_shield_absorb + value
 			return 0
 		-- Or the shield collapses in a deadly arcane explosion
@@ -3740,6 +3740,15 @@ function _M:projected(tx, ty, who, t, x, y, damtype, dam, particles)
 	return false
 end
 
+--- Called when we fire a projectile
+function _M:on_projectile_fired(proj, typ, x, y, damtype, dam, particles)
+	if self:attr("slow_projectiles_outgoing") then
+		print("Projectile slowing down from", proj.energy.mod)
+		proj.energy.mod = proj.energy.mod * (100 - self.slow_projectiles_outgoing) / 100
+		print("Projectile slowing down to", proj.energy.mod)
+	end
+end
+
 --- Called when we are targeted by a projectile
 function _M:on_projectile_target(x, y, p)
 	if self:attr("slow_projectiles") then
diff --git a/game/modules/tome/class/generator/actor/OnSpots.lua b/game/modules/tome/class/generator/actor/OnSpots.lua
index 4823493fc7e5e2c8c40f74cb35041469bc9cf820..5b1b03237333655970bfbca66e8995dff12e4444 100644
--- a/game/modules/tome/class/generator/actor/OnSpots.lua
+++ b/game/modules/tome/class/generator/actor/OnSpots.lua
@@ -31,7 +31,7 @@ end
 function _M:generateOne()
 	local f = nil
 	if self.filters then f = self.filters[rng.range(1, #self.filters)] end
-	if rng.chance(self.randelite) and self.zone:level_adjust_level(self.level, "actor") > 1 then
+	if self.randelite > 0 and rng.chance(self.randelite) and self.zone:level_adjust_level(self.level, "actor") > 1 then
 		print("Random elite generating")
 		if not f then f = {} else f = table.clone(f, true) end
 		f.random_elite = f.random_elite or true
diff --git a/game/modules/tome/class/generator/actor/Random.lua b/game/modules/tome/class/generator/actor/Random.lua
index 88c3d4482ae3babc41604f2f00bccb04907107bf..9a5cd1b2e58cd65eb2eec0b6dc3effeaf69f0ca7 100644
--- a/game/modules/tome/class/generator/actor/Random.lua
+++ b/game/modules/tome/class/generator/actor/Random.lua
@@ -31,7 +31,7 @@ end
 function _M:generateOne()
 	local f = nil
 	if self.filters then f = self.filters[rng.range(1, #self.filters)] end
-	if rng.chance(self.randelite) and self.zone:level_adjust_level(self.level, "actor") > 1 then
+	if self.randelite > 0 and rng.chance(self.randelite) and self.zone:level_adjust_level(self.level, "actor") > 1 then
 		print("Random elite generating")
 		if not f then f = {} else f = table.clone(f, true) end
 		f.random_elite = f.random_elite or true
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 5b6d68c19e1e2abdd903026f8578be61e2a619fc..b619c4b0d2b0e31bd8df957426d0729c50b7ab6d 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -1143,6 +1143,18 @@ newDamageType{
 	end,
 }
 
+newDamageType{
+	name = "congeal time", type = "CONGEAL_TIME",
+	projector = function(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target then
+			-- Freeze it, if we pass the test
+			local sx, sy = game.level.map:getTileToScreen(x, y)
+			target:setEffect(target.EFF_CONGEAL_TIME, 7, {slow=dam.slow, proj=dam.proj, apply_power=src:combatSpellpower()})
+		end
+	end,
+}
+
 -- Time prison, invulnerability and stun
 newDamageType{
 	name = "time prison", type = "TIME_PRISON",
diff --git a/game/modules/tome/data/general/objects/egos/charms.lua b/game/modules/tome/data/general/objects/egos/charms.lua
index 5f210341aa91c43556b4f6c72351f111217a7edc..e907a5ecd483edf2bd0c978d02a0f5f62fd84ed7 100644
--- a/game/modules/tome/data/general/objects/egos/charms.lua
+++ b/game/modules/tome/data/general/objects/egos/charms.lua
@@ -31,7 +31,7 @@ newEntity{
 }
 
 newEntity{
-	name = "supercharded ", prefix=true,
+	name = "supercharged ", prefix=true,
 	keywords = {['super.c']=true},
 	level_range = {1, 50},
 	rarity = 15,
diff --git a/game/modules/tome/data/gfx/particles/arcane_vortex.lua b/game/modules/tome/data/gfx/particles/arcane_vortex.lua
new file mode 100644
index 0000000000000000000000000000000000000000..6a8908742ada1f98b0fc798f75b89ec42be2ee2d
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/arcane_vortex.lua
@@ -0,0 +1,48 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+return { generator = function()
+	local ad = rng.range(0, 360)
+	local a = math.rad(ad)
+	local dir = math.rad(ad + 90)
+	local r = rng.range(1, 20)
+	local dirv = math.rad(1)
+
+	return {
+		trail = 1,
+		life = 10,
+		size = 6, sizev = -0.1, sizea = 0,
+
+		x = r * math.cos(a), xv = rng.float(-0.4, 0.4), xa = 0,
+		y = r * math.sin(a), yv = rng.float(-0.4, 0.4), ya = 0,
+		dir = dir, dirv = dirv, dira = dir / 20,
+		vel = 2, velv = 0, vela = 0.1,
+
+		r = rng.range(180, 220)/255,  rv = 0, ra = 0,
+		g = rng.range(0, 0)/255,      gv = 0, ga = 0,
+		b = rng.range(200, 255)/255,      bv = 0, ba = 0,
+		a = rng.range(80, 220)/255,   av = 0, aa = 0,
+	}
+end, },
+function(self)
+	self.ps:emit(4)
+end,
+40
diff --git a/game/modules/tome/data/gfx/particles/disruption_shield.lua b/game/modules/tome/data/gfx/particles/disruption_shield.lua
index e7f9c025ec47dc19dd2db9468f01577238db34ff..288a578a8261951f7fe9cf3a6bd7569cafdf9a48 100644
--- a/game/modules/tome/data/gfx/particles/disruption_shield.lua
+++ b/game/modules/tome/data/gfx/particles/disruption_shield.lua
@@ -19,29 +19,33 @@
 
 base_size = 32
 
-return { generator = function()
-	local ad = rng.range(0, 360)
-	local a = math.rad(ad)
-	local dir = math.rad(ad)
-	local r = rng.range(15, 18)
+local i = 0
+local r = 1
+local g = 1
+local b = 1
+local a = 1
 
+return { generator = function()
 	return {
-		trail = 1,
-		life = 10,
-		size = 4, sizev = -0.1, sizea = 0,
+		trail = 0,
+		life = 30,
+		size = 36, sizev = -0.33, sizea = 0,
 
-		x = r * math.cos(a), xv = 0, xa = 0,
-		y = r * math.sin(a), yv = 0, ya = 0,
-		dir = dir, dirv = 0.1, dira = 0,
-		vel = 1, velv = 0, vela = -0.2,
+		x = 0, xv = 0, xa = 0,
+		y = 0, yv = 0, ya = 0,
+		dir = 0, dirv = dirv, dira = 0,
+		vel = 0, velv = 0, vela = 0,
 
-		r = rng.range(130, 220)/255, rv = rng.range(0, 10), ra = 0,
-		g = 0,   gv = 0, ga = 0,
-		b = rng.range(170, 255)/255, bv = rng.range(0, 10), ba = 0,
-		a = rng.range(70, 255)/255,   av = 0, aa = 0,
+		r = r, rv = 0, ra = 0,
+		g = g, gv = 0, ga = 0,
+		b = b, bv = 0, ba = 0,
+		a = a, av = -1/90, aa = 0,
 	}
 end, },
 function(self)
-	self.ps:emit(10)
+	if i == 0 then self.ps:emit(1) end
+	i = i + 1
+	if i == 10 then i = 0 end
 end,
-100
+30,
+"particles_images/shield_bubble_arcane", true
diff --git a/game/modules/tome/data/gfx/particles/temporal_vortex.lua b/game/modules/tome/data/gfx/particles/temporal_vortex.lua
new file mode 100644
index 0000000000000000000000000000000000000000..62bc90d127a24538de548d7a1f2798bfa7c8bc31
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/temporal_vortex.lua
@@ -0,0 +1,48 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+return { generator = function()
+	local ad = rng.range(0, 360)
+	local a = math.rad(ad)
+	local dir = math.rad(ad + 90)
+	local r = rng.range(1, 20)
+	local dirv = math.rad(1)
+
+	return {
+		trail = 1,
+		life = 10,
+		size = 3, sizev = -0.1, sizea = 0,
+
+		x = r * math.cos(a), xv = rng.float(-0.4, 0.4), xa = 0,
+		y = r * math.sin(a), yv = rng.float(-0.4, 0.4), ya = 0,
+		dir = dir, dirv = dirv, dira = dir / 20,
+		vel = 2, velv = 0, vela = 0.1,
+
+		r = rng.range(176, 250)/255, rv = 0, ra = 0,
+		g = rng.range(196, 250)/255, gv = 0, ga = 0,
+		b = rng.range(222, 0)/255, bv = 0, ba = 0,
+		a = rng.range(230, 255)/255, av = 0, aa = 0,
+	}
+end, },
+function(self)
+	self.ps:emit(4)
+end,
+40
diff --git a/game/modules/tome/data/gfx/particles/time_shield_bubble.lua b/game/modules/tome/data/gfx/particles/time_shield_bubble.lua
new file mode 100644
index 0000000000000000000000000000000000000000..6e155d2c0a5e01a6c1fb5f5f196ce45a98e54f09
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/time_shield_bubble.lua
@@ -0,0 +1,48 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+local r = 1
+local g = 1
+local b = 1
+local a = 1
+
+return { generator = function()
+	return {
+		trail = 0,
+		life = 10,
+		size = 36, sizev = 0, sizea = 0,
+
+		x = 0, xv = 0, xa = 0,
+		y = 0, yv = 0, ya = 0,
+		dir = 0, dirv = dirv, dira = 0,
+		vel = 0, velv = 0, vela = 0,
+
+		r = r, rv = 0, ra = 0,
+		g = g, gv = 0, ga = 0,
+		b = b, bv = 0, ba = 0,
+		a = a, av = -0.02, aa = 0.005,
+	}
+end, },
+function(self)
+	self.ps:emit(1)
+end,
+1,
+"particles_images/shield_bubble_temporal"
diff --git a/game/modules/tome/data/gfx/particles_images/shield_bubble_arcane.png b/game/modules/tome/data/gfx/particles_images/shield_bubble_arcane.png
new file mode 100644
index 0000000000000000000000000000000000000000..786ea77957127a3a229bedac02dad84efb0b16f1
Binary files /dev/null and b/game/modules/tome/data/gfx/particles_images/shield_bubble_arcane.png differ
diff --git a/game/modules/tome/data/gfx/particles_images/shield_bubble_temporal.png b/game/modules/tome/data/gfx/particles_images/shield_bubble_temporal.png
new file mode 100644
index 0000000000000000000000000000000000000000..408f16a3c4ce1a12186ced6ada4ecb5025ef74b7
Binary files /dev/null and b/game/modules/tome/data/gfx/particles_images/shield_bubble_temporal.png differ
diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua
index 091c45ce045b13a733dec5bb60f5440f60cdbcdd..a65aef6cffac40c83567f89e8f68d31af54124f2 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -1635,3 +1635,25 @@ newTalent{
 		format(damDesc(self, DamageType.ACID, damage), duration)
 	end,
 }
+
+newTalent{
+	name = "Manaflow",
+	type = {"spell/other", 1},
+	points = 5,
+	mana = 0,
+	cooldown = 25,
+	tactical = { MANA = 3 },
+	getManaRestoration = function(self, t) return 5 + self:combatTalentSpellDamage(t, 10, 20) end,
+	on_pre_use = function(self, t) return not self:hasEffect(self.EFF_MANASURGE) end,
+	action = function(self, t)
+		self:setEffect(self.EFF_MANASURGE, 10, {power=t.getManaRestoration(self, t)})
+		game:playSoundNear(self, "talents/arcane")
+		return true
+	end,
+	info = function(self, t)
+		local restoration = t.getManaRestoration(self, t)
+		return ([[Engulf yourself in a surge of mana, quickly restoring %d mana every turn for 10 turns.
+		The mana restored will increase with your Spellpower.]]):
+		format(restoration)
+	end,
+}
diff --git a/game/modules/tome/data/talents/spells/aegis.lua b/game/modules/tome/data/talents/spells/aegis.lua
index b21d279b29379ce9775497dcdeba1493fffdbb71..e5efaeb04887c7c85b33f7a094f0cc483fc544a8 100644
--- a/game/modules/tome/data/talents/spells/aegis.lua
+++ b/game/modules/tome/data/talents/spells/aegis.lua
@@ -71,7 +71,7 @@ newTalent{
 		local shield = t.getShield(self, t)
 		local dur = t.getDur(self, t)
 		return ([[Surround yourself with strengthening arcane forces.
-		Every damage shield, time shield or displacement shield affecting you has its power increased by %d%%.
+		Every damage shield, time shield, displacement shield, disruption shield affecting you has its power increased by %d%%.
 		At level 5 it also increases the duration of all shields by 1 turn.
 		The shield value will increase with your Spellpower.]]):
 		format(shield, dur)
diff --git a/game/modules/tome/data/talents/spells/arcane.lua b/game/modules/tome/data/talents/spells/arcane.lua
index c2715c89a09c7347563885e4c82761d63f2bf9a8..7c24b341479544337540c7f1f468457d243af334 100644
--- a/game/modules/tome/data/talents/spells/arcane.lua
+++ b/game/modules/tome/data/talents/spells/arcane.lua
@@ -26,10 +26,10 @@ newTalent{
 	points = 5,
 	cooldown = 30,
 	tactical = { BUFF = 2 },
-	spellpower_increase = { 5, 9, 13, 16, 18 },
+	spellpower_increase = { 5, 9, 14, 17, 20 },
 	getSpellpowerIncrease = function(self, t)
 		local v = t.spellpower_increase[self:getTalentLevelRaw(t)]
-		if v then return v else return 18 + (self:getTalentLevelRaw(t) - 5) * 2 end
+		if v then return v else return 20 + (self:getTalentLevelRaw(t) - 5) * 2 end
 	end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/arcane")
@@ -93,25 +93,36 @@ newTalent{
 }
 
 newTalent{
-	name = "Manaflow",
+	name = "Arcane Vortex",
 	type = {"spell/arcane", 3},
 	require = spells_req3,
 	points = 5,
-	mana = 0,
-	cooldown = 25,
-	tactical = { MANA = 3 },
-	getManaRestoration = function(self, t) return 5 + self:combatTalentSpellDamage(t, 10, 20) end,
-	on_pre_use = function(self, t) return not self:hasEffect(self.EFF_MANASURGE) end,
+	mana = 35,
+	cooldown = 12,
+	range = 10,
+	direct_hit = true,
+	reflectable = true,
+	requires_target = true,
+	tactical = { ATTACK = { ARCANE = 2 } },
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 340) / 6 end,
 	action = function(self, t)
-		self:setEffect(self.EFF_MANASURGE, 10, {power=t.getManaRestoration(self, t)})
+		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
+		local tx, ty, target = self:getTarget(tg)
+		if not tx or not ty then return nil end
+		local _ _, tx, ty = self:canProject(tg, tx, ty)
+		target = game.level.map(tx, ty, Map.ACTOR)
+		if not target then return nil end
+
+		target:setEffect(target.EFF_ARCANE_VORTEX, 6, {src=self, dam=t.getDamage(self, t)})
 		game:playSoundNear(self, "talents/arcane")
 		return true
 	end,
 	info = function(self, t)
-		local restoration = t.getManaRestoration(self, t)
-		return ([[Engulf yourself in a surge of mana, quickly restoring %d mana every turn for 10 turns.
-		The mana restored will increase with your Spellpower.]]):
-		format(restoration)
+		local dam = t.getDamage(self, t)
+		return ([[Creates a vortex of arcane energies on the target for 6 turns. Each turn the vortex will look for an other foe in sight and fire a manathrust doing %0.2f arcane damage to all foes in line.
+		If no foes are found the target will take 150%% more arcane damage.
+		The damage will increase with your Spellpower.]]):
+		format(damDesc(self, DamageType.ARCANE, dam))
 	end,
 }
 
@@ -124,9 +135,10 @@ newTalent{
 	cooldown = 30,
 	sustain_mana = 10,
 	no_energy = true,
-	tactical = { DEFEND = 2 },
-	getManaRatio = function(self, t) return math.max(3 - self:combatTalentSpellDamage(t, 10, 200) / 100, 0.5) end,
-	getArcaneResist = function(self, t) return 10 + self:combatTalentSpellDamage(t, 10, 500) / 10 end,
+	tactical = { MANA = 3, DEFEND = 2, },
+	getManaRatio = function(self, t) return math.max(3 - self:combatTalentSpellDamage(t, 10, 200) / 100, 0.5) * (100 - util.bound(self:attr("shield_factor") or 0, 0, 70)) / 100 end,
+	getArcaneResist = function(self, t) return 50 + self:combatTalentSpellDamage(t, 10, 500) / 10 end,
+	on_pre_use = function(self, t) return self:getMana() / self:getMaxMana() <= 0.25 end,
 	explode = function(self, t, dam)
 		game.logSeen(self, "#VIOLET#%s's disruption shield collapses and then explodes in a powerful manastorm!", self.name:capitalize())
 
@@ -158,9 +170,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Uses mana instead of life to take damage. Uses %0.2f mana per damage point taken.
-		If your mana is brought too low by the shield, it will de-activate and the chain reaction will release a deadly arcane storm with radius 3 for 10 turns, dealing 10%% of the damage absorbed each turn.
+		return ([[Surround yourself with arcane forces, disrupting any attemps to harm you and instead generating mana.
+		Generates %0.2f mana per damage point taken (Aegis Shielding talent affects the ratio).
+		If your mana is brought too high by the shield, it will de-activate and the chain reaction will release a deadly arcane storm with radius 3 for 10 turns, dealing 10%% of the damage absorbed each turn.
 		While the arcane storm rages you also get a %d%% arcane resistance.
+		Only usable when bellow 25%% mana.
 		The damage to mana ratio increases with your Spellpower.]]):
 		format(t.getManaRatio(self, t), t.getArcaneResist(self, t))
 	end,
diff --git a/game/modules/tome/data/talents/spells/temporal.lua b/game/modules/tome/data/talents/spells/temporal.lua
index 43a3e0c4a656673d8269165ea4d0c33295363de3..90f126b09987add53d42f606d97a451c1a084564 100644
--- a/game/modules/tome/data/talents/spells/temporal.lua
+++ b/game/modules/tome/data/talents/spells/temporal.lua
@@ -32,18 +32,23 @@ newTalent{
 	direct_hit = true,
 	requires_target = true,
 	getSlow = function(self, t) return math.min(self:getTalentLevel(t) * 0.08, 0.6) end,
+	getProj = function(self, t) return math.min(90, 5 + self:combatTalentSpellDamage(t, 5, 700) / 10) end,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t, display={particle="bolt_arcane"}}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:projectile(tg, x, y, DamageType.SLOW, 1 - 1 / (1 + t.getSlow(self, t)), {type="manathrust"})
+		self:projectile(tg, x, y, DamageType.CONGEAL_TIME, {
+			slow = 1 - 1 / (1 + t.getSlow(self, t)),
+			proj = t.getProj(self, t),
+		}, {type="manathrust"})
 		game:playSoundNear(self, "talents/spell_generic")
 		return true
 	end,
 	info = function(self, t)
 		local slow = t.getSlow(self, t)
-		return ([[Project a bolt of time distortion, decreasing the target's global speed by %d%% for 7 turns.]]):
-		format(100 * slow)
+		local proj = t.getProj(self, t)
+		return ([[Project a bolt of time distortion, decreasing the target's global speed by %d%% and all projectiles it fires by %d%% for 7 turns.]]):
+		format(100 * slow, proj)
 	end,
 }
 
@@ -61,7 +66,7 @@ newTalent{
 	getDuration = function(self, t) return util.bound(5 + math.floor(self:getTalentLevel(t)), 5, 15) end,
 	getDotDuration = function(self, t) return util.bound(4 + math.floor(self:getTalentLevel(t)), 4, 12) end,
 	getTimeReduction = function(self, t) return util.bound(15 + math.floor(self:getTalentLevel(t) * 2), 15, 35) end,
-	action = function(self, t)
+		action = function(self, t)
 		self:setEffect(self.EFF_TIME_SHIELD, t.getDuration(self, t), {power=t.getMaxAbsorb(self, t), dot_dur=t.getDotDuration(self, t), time_reducer=t.getTimeReduction(self, t)})
 		game:playSoundNear(self, "talents/spell_generic")
 		return true
@@ -72,7 +77,8 @@ newTalent{
 		local dotdur = t.getDotDuration(self,t)
 		local time_reduc = t.getTimeReduction(self,t)
 		return ([[This intricate spell instantly erects a time shield around the caster, preventing any incoming damage and sending it forward in time.
-		Once either the maximum damage (%d) is absorbed, or the time runs out (%d turns), the stored damage will return as self-damage over time (%d turns).
+		Once either the maximum damage (%d) is absorbed, or the time runs out (%d turns), the stored damage will return as a temporal wake over time (%d turns).
+		Each turn the temporal wake is active a temporal vortex will spawn at your feet, damaging any inside after one turn for three turns.
 		While under the effect of Time Shield all newly applied magical, physical and mental effects will have their durations reduced by %d%%.
 		Max absorption will increase with your Spellpower.]]):
 		format(maxabsorb, duration, dotdur, time_reduc)
diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua
index a6b956b1010918fed3ca50c4102f82a32116a284..39745a18bb4b6c00a24bd18ec52681f1f7b9802f 100644
--- a/game/modules/tome/data/timed_effects/magical.lua
+++ b/game/modules/tome/data/timed_effects/magical.lua
@@ -230,7 +230,7 @@ newEffect{
 	on_gain = function(self, err) return "#Target# loses sight!", "+Blind" end,
 	on_lose = function(self, err) return "#Target# recovers sight.", "-Blind" end,
 	on_timeout = function(self, eff)
-		DamageType:get(DamageType.FIRE).projector(eff.src, self.x, self.y, DamageType.DARKNESS, eff.dam)
+		DamageType:get(DamageType.DARKNESS).projector(eff.src, self.x, self.y, DamageType.DARKNESS, eff.dam)
 	end,
 	activate = function(self, eff)
 		eff.tmpid = self:addTemporaryValue("blind", 1)
@@ -259,7 +259,7 @@ newEffect{
 	on_gain = function(self, err) return "#Target# wanders around!.", "+Confused" end,
 	on_lose = function(self, err) return "#Target# seems more focused.", "-Confused" end,
 	on_timeout = function(self, eff)
-		DamageType:get(DamageType.FIRE).projector(eff.src, self.x, self.y, DamageType.DARKNESS, eff.dam)
+		DamageType:get(DamageType.DARKNESS).projector(eff.src, self.x, self.y, DamageType.DARKNESS, eff.dam)
 	end,
 	activate = function(self, eff)
 		eff.power = eff.power - (self:attr("confusion_immune") or 0) / 2
@@ -1693,3 +1693,59 @@ newEffect{
 		self:removeTemporaryValue("blood_lock", eff.tmpid)
 	end,
 }
+
+newEffect{
+	name = "CONGEAL_TIME", image = "talents/congeal_time.png",
+	desc = "Congeal Time",
+	long_desc = function(self, eff) return ("Reduces global action speed by %d%% and all outgoing projectiles speed by %d%%."):format(eff.slow * 100, eff.proj) end,
+	type = "magical",
+	subtype = { temporal=true, slow=true },
+	status = "detrimental",
+	parameters = { slow=0.1, proj=15 },
+	on_gain = function(self, err) return "#Target# slows down.", "+Congeal Time" end,
+	on_lose = function(self, err) return "#Target# speeds up.", "-Congeal Time" end,
+	activate = function(self, eff)
+		eff.tmpid = self:addTemporaryValue("global_speed_add", -eff.slow)
+		eff.prjid = self:addTemporaryValue("slow_projectiles_outgoing", eff.proj)
+	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("global_speed_add", eff.tmpid)
+		self:removeTemporaryValue("slow_projectiles_outgoing", eff.prjid)
+	end,
+}
+
+newEffect{
+	name = "ARCANE_VORTEX", image = "talents/arcane_vortex.png",
+	desc = "Arcane Vortex",
+	long_desc = function(self, eff) return ("An arcane vortex followes the target. Each turn a manathrust fires from it to a random foe in sight doing %0.2f arcane damage to all. If no foes are found the main target takes 150%% more arcane damage this turn."):format(eff.dam) end,
+	type = "magical",
+	subtype = { arcane=true },
+	status = "detrimental",
+	parameters = { dam=10 },
+	on_gain = function(self, err) return "#Target# is focused by an arcane vortex!.", "+Arcane Vortex" end,
+	on_lose = function(self, err) return "#Target# is free from the arcane vortex.", "-Arcane Vortex" end,
+	on_timeout = function(self, eff)
+		local l = {}
+		self:project({type="ball", x=self.x, y=self.y, radius=7, selffire=false}, self.x, self.y, function(px, py)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if target and target ~= self and eff.src:reactionToward(target) < 0 then l[#l+1] = target end
+		end)
+
+		if #l == 0 then
+			DamageType:get(DamageType.ARCANE).projector(eff.src, self.x, self.y, DamageType.ARCANE, eff.dam * 1.5)
+		else
+			DamageType:get(DamageType.ARCANE).projector(eff.src, self.x, self.y, DamageType.ARCANE, eff.dam)
+			local act = rng.table(l)
+			eff.src:project({type="beam", x=self.x, y=self.y}, act.x, act.y, DamageType.ARCANE, eff.dam, nil)
+			game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(act.x-self.x), math.abs(act.y-self.y)), "mana_beam", {tx=act.x-self.x, ty=act.y-self.y})
+		end
+
+		game:playSoundNear(self, "talents/arcane")
+	end,
+	activate = function(self, eff)
+		eff.particle = self:addParticles(Particles.new("arcane_vortex", 1))
+	end,
+	deactivate = function(self, eff)
+		self:removeParticles(eff.particle)
+	end,
+}
diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua
index 8611c4e3b061847f1283b48c1e3246c2469625a5..b2e5182b4f5a9d3312fbe30a753c8c3dcfb4904e 100644
--- a/game/modules/tome/data/timed_effects/other.lua
+++ b/game/modules/tome/data/timed_effects/other.lua
@@ -121,7 +121,7 @@ newEffect{
 		--- Warning there can be only one time shield active at once for an actor
 		self.time_shield_absorb = eff.power
 		self.time_shield_absorb_max = eff.power
-		eff.particle = self:addParticles(Particles.new("time_shield", 1))
+		eff.particle = self:addParticles(Particles.new("time_shield_bubble", 1))
 	end,
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("reduce_status_effects_time", eff.durid)
@@ -141,16 +141,30 @@ newEffect{
 
 newEffect{
 	name = "TIME_DOT",
-	desc = "Time Shield Backfire",
-	long_desc = function(self, eff) return ("The time distortion protecting the target has ended. All damage forwarded in time is now applied, doing %d arcane damage per turn."):format(eff.power) end,
+	desc = "Temporal Wake",
+	long_desc = function(self, eff) return ("The time distortion protecting the target has ended. All damage forwarded in time is now appearing as temporal vortexes each turn. Temporal Vortexes do %0.2f temporal damage per turn for 3 turn."):format(eff.power) end,
 	type = "other",
 	subtype = { time=true },
 	status = "detrimental",
 	parameters = { power=10 },
-	on_gain = function(self, err) return "The powerful time-altering energies come crashing down on #target#.", "+Time Shield Backfire" end,
-	on_lose = function(self, err) return "The fabric of time around #target# returns to normal.", "-Time Shield Backfire" end,
+	on_gain = function(self, err) return "The powerful time-altering energies come crashing down on #target#.", "+Temporal Wake" end,
+	on_lose = function(self, err) return "The fabric of time around #target# returns to normal.", "-Temporal Wake" end,
+	activate = function(self, eff)
+		eff.particle = self:addParticles(Particles.new("time_shield", 1))
+	end,
+	deactivate = function(self, eff)
+		self:removeParticles(eff.particle)
+	end,
 	on_timeout = function(self, eff)
-		DamageType:get(DamageType.ARCANE).projector(self, self.x, self.y, DamageType.ARCANE, eff.power)
+		-- Add a lasting map effect
+		game.level.map:addEffect(self,
+			self.x, self.y, 3,
+			DamageType.TEMPORAL, eff.power,
+			0,
+			5, nil,
+			{type="temporal_vortex"},
+			nil, true
+		)
 	end,
 }
 
@@ -1363,7 +1377,7 @@ newEffect{
 	on_merge = function(self, old_eff, new_eff)
 		old_eff.source = new_eff.source
 		old_eff.range = new_eff.range
-		
+
 		return old_eff
 	end,
 	on_timeout = function(self, eff)
@@ -1418,7 +1432,7 @@ newEffect{
 		eff.firstHit = true
 		eff.increase = 1
 		self.tempeffect_def[self.EFF_CURSED_FORM].updateEffect(self, eff)
-		
+
 		game.level.map:particleEmitter(self.x, self.y, 1, "cursed_form", {power=eff.increase})
 	end,
 	deactivate = function(self, eff)
@@ -1444,7 +1458,7 @@ newEffect{
 			eff.statChange = tGrimResolve.getStatChange(self, tGrimResolve, eff.increase)
 			eff.neutralizeChance = tGrimResolve.getNeutralizeChance(self, tGrimResolve)
 		end
-		
+
 		if eff.incDamageId then
 			self:removeTemporaryValue("inc_damage", eff.incDamageId)
 			eff.incDamageId = nil
@@ -1468,7 +1482,7 @@ newEffect{
 			if eff.increase < 5 then
 				eff.increase = eff.increase + 1
 				self.tempeffect_def[self.EFF_CURSED_FORM].updateEffect(self, eff)
-				
+
 				game.level.map:particleEmitter(self.x, self.y, 1, "cursed_form", {power=eff.increase})
 			end
 			eff.hit = false
diff --git a/game/modules/tome/data/zones/town-lumberjack-village/zone.lua b/game/modules/tome/data/zones/town-lumberjack-village/zone.lua
index 594159783a5763b55102b6afecc22fa9e5e0c9df..7f080074f1f79b3a7f89be8a96972a86c385567f 100644
--- a/game/modules/tome/data/zones/town-lumberjack-village/zone.lua
+++ b/game/modules/tome/data/zones/town-lumberjack-village/zone.lua
@@ -39,6 +39,7 @@ return {
 		actor = {
 			class = "mod.class.generator.actor.Random",
 			nb_npc = {20, 20},
+			randelite = 0,
 		},
 		object = {
 			class = "engine.generator.object.Random",