diff --git a/game/engines/default/engine/Map.lua b/game/engines/default/engine/Map.lua
index 26091e53f61fe4a79fe69401eaef9e4f2ec99a21..f874d7dac11292f778acccf69e507de3cb5c132f 100644
--- a/game/engines/default/engine/Map.lua
+++ b/game/engines/default/engine/Map.lua
@@ -800,9 +800,14 @@ function _M:addEffect(src, x, y, duration, damtype, dam, radius, dir, angle, ove
 
 	if not overlay.__CLASSNAME then
 		e.particles = {}
-		for lx, ys in pairs(grids) do
-			for ly, _ in pairs(ys) do
-				e.particles[#e.particles+1] = self:particleEmitter(lx, ly, 1, overlay.type, overlay.args)
+		if overlay.only_one then
+			e.particles[#e.particles+1] = self:particleEmitter(x, y, 1, overlay.type, overlay.args)
+			e.particles_only_one = true
+		else
+			for lx, ys in pairs(grids) do
+				for ly, _ in pairs(ys) do
+					e.particles[#e.particles+1] = self:particleEmitter(lx, ly, 1, overlay.type, overlay.args)
+				end
 			end
 		end
 	end
@@ -857,11 +862,16 @@ function _M:processEffects()
 				if e.dir == 5 then e.grids = core.fov.circle_grids(e.x, e.y, e.radius, true)
 				else e.grids = core.fov.beam_grids(e.x, e.y, e.radius, e.dir, e.angle, true) end
 				if e.particles then
-					for j, ps in ipairs(e.particles) do self:removeParticleEmitter(ps) end
-					e.particles = {}
-					for lx, ys in pairs(grids) do
-						for ly, _ in pairs(ys) do
-							e.particles[#e.particles+1] = self:particleEmitter(lx, ly, 1, overlay.type, overlay.args)
+					if e.particles_only_one then
+						e.particles[1].x = e.x
+						e.particles[1].y = e.y
+					else
+						for j, ps in ipairs(e.particles) do self:removeParticleEmitter(ps) end
+						e.particles = {}
+						for lx, ys in pairs(e.grids) do
+							for ly, _ in pairs(ys) do
+								e.particles[#e.particles+1] = self:particleEmitter(lx, ly, 1, overlay.type, overlay.args)
+							end
 						end
 					end
 				end
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index a0cd360e6a93916ffdfd8bf04de73f55e67f1add..e6fc48d33a7438ee3fa84cb44a673364a979afe0 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -861,6 +861,10 @@ function _M:onHeal(value, src)
 		end
 	end
 
+	if self:attr("arcane_shield") and value > 0 then
+		self:setEffect(self.EFF_DAMAGE_SHIELD, 3, {power=value * self.arcane_shield / 100})
+	end
+
 	print("[HEALING]", self.uid, self.name, "for", value)
 	return value
 end
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index 9669ed02abef206b81b63c6006dbb95f2a5aecc2..bdbd75952d222c38b7624536afa00110ff2c080f 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -495,7 +495,10 @@ function _M:restCheck()
 
 	-- Resting improves regen
 	local perc = math.min(self.resting.cnt / 10, 4)
+	local old_shield = self.arcane_shield
+	self.arcane_shield = nil
 	self:heal(self.life_regen * perc)
+	self.arcane_shield = old_shield
 	self:incStamina(self.stamina_regen * perc)
 	self:incMana(self.mana_regen * perc)
 
diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua
index 32d3d12b3e9cb421f6b305a1b47d6cc5e7086401..7a523b5e5cea0f14fa3305481451e2200655dfd7 100644
--- a/game/modules/tome/data/birth/classes/mage.lua
+++ b/game/modules/tome/data/birth/classes/mage.lua
@@ -64,7 +64,7 @@ newBirthDescriptor{
 		["spell/meta"]={false, 0.3},
 		["spell/divination"]={true, 0.3},
 		["spell/conveyance"]={true, 0.3},
-		["spell/nature"]={true, 0.3},
+		["spell/aegis"]={true, 0.3},
 		["cunning/survival"]={false, -0.1},
 	},
 	talents = {
diff --git a/game/modules/tome/data/general/npcs/spider.lua b/game/modules/tome/data/general/npcs/spider.lua
index 7ff1fd86c8dfa4fffecc8e77093fc2cf2bcb24f3..6fafb79b0f431690f468addd7a2ab13f11ba62d2 100644
--- a/game/modules/tome/data/general/npcs/spider.lua
+++ b/game/modules/tome/data/general/npcs/spider.lua
@@ -205,7 +205,7 @@ newEntity{ base = "BASE_NPC_SPIDER",
 
 	combat_armor = 75, combat_def = 12,  -- perhaps too impenetrable?  though at this level people should be doing over 100 damage each hit, so it could be more :D
 
-	resolvers.tmasteries{ ["spell/nature"]=0.9 },
+	resolvers.tmasteries{ ["spell/aegis"]=0.9 },
 
 	resolvers.talents{
 		[Talents.T_SPIDER_WEB]={base=5, every=6, max=8},
diff --git a/game/modules/tome/data/general/objects/egos/wizard-hat.lua b/game/modules/tome/data/general/objects/egos/wizard-hat.lua
index a71aa6b780afe33830ff42b6685e30d5c445d508..dd3966a57b6335cec5405555d720128f8500ce85 100644
--- a/game/modules/tome/data/general/objects/egos/wizard-hat.lua
+++ b/game/modules/tome/data/general/objects/egos/wizard-hat.lua
@@ -244,7 +244,7 @@ newEntity{
 
 newEntity{
 	power_source = {nature=true},
-	name = "naturalist's ", prefix=true, instant_resolve=true,
+	name = "defender ", prefix=true, instant_resolve=true,
 	level_range = {10, 50},
 	greater_ego = 1,
 	rarity = 11,
@@ -253,7 +253,7 @@ newEntity{
 		max_life=resolvers.mbonus_material(30, 30, function(e, v) return v * 0.1 end),
 		life_regen = resolvers.mbonus_material(15, 5, function(e, v) v=v/10 return v * 10, v end),
 		talents_types_mastery = {
-			["spell/nature"] = resolvers.mbonus_material(30, 10, function(e, v) v=v/100 return v * 80, v end),
+			["spell/aegis"] = resolvers.mbonus_material(30, 10, function(e, v) v=v/100 return v * 80, v end),
 		},
 	},
 }
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index 4a0b337e9a504b42883e14d4ae0576736ff29411..f81a3bf17e8a7c9adbaadf21be0a959749ceeb4c 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -1582,7 +1582,7 @@ newEntity{ base = "BASE_LEATHER_BELT",
 	wielder = {
 		inc_stats = { [Stats.STAT_MAG] = 4, [Stats.STAT_WIL] = 3, },
 		combat_spellpower = 8,
-		talents_types_mastery = { ["spell/nature"] = 0.2 },
+		talents_types_mastery = { ["spell/aegis"] = 0.2 },
 	},
 }
 
diff --git a/game/modules/tome/data/gfx/particles/icestorm.lua b/game/modules/tome/data/gfx/particles/icestorm.lua
new file mode 100644
index 0000000000000000000000000000000000000000..159e344b515faf61d9a4495de5b7f4349ca492b8
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/icestorm.lua
@@ -0,0 +1,49 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011 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.avg(1, 40 * 3)
+	local dirv = math.rad(3)
+
+	return {
+		trail = 1,
+		life = 50,
+		size = rng.range(3, 6), sizev = -0.1, sizea = 0,
+
+		x = r * math.cos(a), xv = 0, xa = 0,
+		y = r * math.sin(a), yv = 0, ya = 0,
+		dir = dir, dirv = dirv, dira = 0,
+		vel = 3, velv = 0, vela = 0,
+
+		r = 1, rv = 0, ra = 0,
+		g = 1, gv = 0, ga = 0,
+		b = 1, bv = 0, ba = 0,
+		a = rng.float(0.6, 0.9), av = 0, aa = 0,
+	}
+end, },
+function(self)
+	self.ps:emit(10)
+end,
+500,
+"weather/snowflake"
diff --git a/game/modules/tome/data/talents/gifts/harmony.lua b/game/modules/tome/data/talents/gifts/harmony.lua
index 977223bb56b568c8bfce2d6ed525d5017138c936..36a4a120ee385adb7444c12706f2972a585c4a23 100644
--- a/game/modules/tome/data/talents/gifts/harmony.lua
+++ b/game/modules/tome/data/talents/gifts/harmony.lua
@@ -64,7 +64,7 @@ newTalent{
 	require = gifts_req2,
 	points = 5,
 	mode = "sustained",
-	equilibrium = 20,
+	sustain_equilibrium = 20,
 	cooldown = 30,
 	activate = function(self, t)
 		return {
diff --git a/game/modules/tome/data/talents/spells/nature.lua b/game/modules/tome/data/talents/spells/aegis.lua
similarity index 54%
rename from game/modules/tome/data/talents/spells/nature.lua
rename to game/modules/tome/data/talents/spells/aegis.lua
index 4ccbfd3621cd70c8510502be2157fe50521cc04e..c0fdcd31c1265e2e93887b964873e7ee5fd7917f 100644
--- a/game/modules/tome/data/talents/spells/nature.lua
+++ b/game/modules/tome/data/talents/spells/aegis.lua
@@ -19,58 +19,55 @@
 -- darkgod@te4.org
 
 newTalent{
-	name = "Regeneration",
-	type = {"spell/nature", 1},
+	name = "Heal",
+	type = {"spell/aegis", 1},
 	require = spells_req1,
 	points = 5,
-	random_ego = "defensive",
-	mana = 30,
-	cooldown = 10,
+	mana = 25,
+	cooldown = 14,
 	tactical = { HEAL = 2 },
-	getRegeneration = function(self, t) return self:combatTalentSpellDamage(t, 5, 25) end,
-	on_pre_use = function(self, t) return not self:hasEffect(self.EFF_REGENERATION) end,
+	getHeal = function(self, t) return 40 + self:combatTalentSpellDamage(t, 40, 420) end,
 	action = function(self, t)
-		self:setEffect(self.EFF_REGENERATION, 10, {power=t.getRegeneration(self, t)})
+		self:heal(self:spellCrit(t.getHeal(self, t)), self)
 		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
-		local regen = t.getRegeneration(self, t)
-		return ([[Call upon the forces of nature to regenerate your body for %d life every turn for 10 turns.
+		local heal = t.getHeal(self, t)
+		return ([[Call upon the forces of nature to heal your body for %d life.
 		The life healed will increase with the Magic stat]]):
-		format(regen)
+		format(heal)
 	end,
 }
 
 newTalent{
-	name = "Heal",
-	type = {"spell/nature", 2},
+	name = "Regeneration",
+	type = {"spell/aegis", 2},
 	require = spells_req2,
 	points = 5,
-	random_ego = "defensive",
-	mana = 60,
+	mana = 30,
 	cooldown = 10,
-	tactical = { HEAL = 1 },
-	getHeal = function(self, t) return self:combatTalentSpellDamage(t, 40, 220) end,
+	tactical = { HEAL = 2 },
+	getRegeneration = function(self, t) return self:combatTalentSpellDamage(t, 5, 25) end,
+	on_pre_use = function(self, t) return not self:hasEffect(self.EFF_REGENERATION) end,
 	action = function(self, t)
-		self:heal(self:spellCrit(t.getHeal(self, t)), self)
+		self:setEffect(self.EFF_REGENERATION, 10, {power=t.getRegeneration(self, t)})
 		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
-		local heal = t.getHeal(self, t)
-		return ([[Call upon the forces of nature to heal your body for %d life.
+		local regen = t.getRegeneration(self, t)
+		return ([[Call upon the forces of nature to regenerate your body for %d life every turn for 10 turns.
 		The life healed will increase with the Magic stat]]):
-		format(heal)
+		format(regen)
 	end,
 }
 
 newTalent{
 	name = "Restoration",
-	type = {"spell/nature", 3},
+	type = {"spell/aegis", 3},
 	require = spells_req3,
 	points = 5,
-	random_ego = "defensive",
 	mana = 30,
 	cooldown = 15,
 	tactical = { PROTECT = 1 },
@@ -107,77 +104,32 @@ newTalent{
 }
 
 newTalent{
-	name = "Nature's Call",
-	type = {"spell/nature", 4},
+	name = "Arcane Shield",
+	type = {"spell/aegis", 4},
 	require = spells_req4,
 	points = 5,
-	random_ego = "attack",
-	mana = 60,
-	cooldown = 100,
-	tactical = { ATTACK = 2 },
-	requires_target = true,
-	getSummonTime = function(self, t) return util.bound(self:getTalentLevel(t) * self:combatSpellpower(0.10), 5, 90) end,
-	action = function(self, t)
-		if not self:canBe("summon") then game.logPlayer(self, "You can not summon, you are suppressed!") return end
-
-		-- Find space
-		local x, y = util.findFreeGrid(self.x, self.y, 5, true, {[Map.ACTOR]=true})
-		if not x then
-			game.logPlayer(self, "Not enough space to invoke the guardian!")
-			return
-		end
-		print("Invoking guardian on", x, y)
-
-		local NPC = require "mod.class.NPC"
-		local bear = NPC.new{
-			type = "animal", subtype = "bear",
-			display = "q", color=colors.LIGHT_GREEN, image="npc/black_bear.png",
-			name = "guardian bear", faction = self.faction,
-			desc = [[A bear summoned by the powers of nature to help you.]],
-			autolevel = "warrior",
-			ai = "summoned", ai_real = "dumb_talented_simple", ai_state = { talent_in=3, },
-			stats = { str=18, dex=13, mag=5, con=15 },
-			resolvers.tmasteries{ ["technique/other"]=0.25 },
-
-			resolvers.talents{ [Talents.T_STUN]=2 },
-			max_stamina = 100,
-			infravision = 20,
-
-			inc_damage = table.clone(self.inc_damage, true),
-
-			resists = { [DamageType.COLD] = 20, [DamageType.NATURE] = 20 },
-			level_range = {self.level, self.level}, exp_worth = 0,
-
-			max_life = resolvers.rngavg(100,150),
-			life_rating = 10,
-
-			combat_armor = 7, combat_def = 3,
-			combat = { dam=resolvers.rngavg(12,25), atk=10, apr=10, physspeed=2 },
-
-			summoner = self,
-			summon_time = t.getSummonTime(self, t),
+	mode = "sustained",
+	sustain_mana = 60,
+	cooldown = 30,
+	tactical = { BUFF = 2 },
+	getShield = function(self, t) return 20 + self:combatTalentSpellDamage(t, 5, 500) / 10 end,
+	activate = function(self, t)
+		local shield = t.getShield(self, t)
+		game:playSoundNear(self, "talents/arcane")
+		local ret = {
+			shield = self:addTemporaryValue("arcane_shield", shield),
 		}
-
-	-- Add to the party
-	if self.player then
-		bear.remove_from_party_on_death = true
-		game.party:addMember(bear, {
-			control="no",
-			type="summon",
-			title="Summon",
-			orders = {target=true, leash=true, anchor=true, talents=true},
-		})
-	end
-
-		bear:resolve()
-		game.zone:addEntity(game.level, bear, "actor", x, y)
-
-		game:playSoundNear(self, "talents/spell_generic")
+		self:checkEncumbrance()
+		return ret
+	end,
+	deactivate = function(self, t, p)
+		self:removeTemporaryValue("arcane_shield", p.shield)
 		return true
 	end,
 	info = function(self, t)
-		local summon_time = t.getSummonTime(self, t)
-		return ([[Call upon the forces of nature to summon a bear ally for %d turns.]]):
-		format(summon_time)
+		local shield = t.getShield(self, t)
+		return ([[Surround yourself with protective arcane forces.
+		Each time you receive a direct heal (not a life regeneration effect) you automatically get a damage shield of %d%% of the heal value for 3 turns.]]):
+		format(shield)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/conveyance.lua b/game/modules/tome/data/talents/spells/conveyance.lua
index 2bbbe0cf23253e3263cd23567feeda69bad68461..094984c0b0b1942eb65bb91d9b0e207466f65923 100644
--- a/game/modules/tome/data/talents/spells/conveyance.lua
+++ b/game/modules/tome/data/talents/spells/conveyance.lua
@@ -178,8 +178,8 @@ newTalent{
 	tactical = { DEFEND = 2 },
 	range = 8,
 	requires_target = true,
-	getTransferChange = function(self, t) return 20 + self:getTalentLevel(t) * 5 end,
-	getMaxAbsorb = function(self, t) return 50 + self:combatTalentSpellDamage(t, 20, 350) end,
+	getTransferChange = function(self, t) return 40 + self:getTalentLevel(t) * 5 end,
+	getMaxAbsorb = function(self, t) return 50 + self:combatTalentSpellDamage(t, 20, 400) end,
 	getDuration = function(self, t) return util.bound(10 + math.floor(self:getTalentLevel(t) * 3), 10, 25) end,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
diff --git a/game/modules/tome/data/talents/spells/spells.lua b/game/modules/tome/data/talents/spells/spells.lua
index 9c7814deb55f2587894100a3008bb9b71a59b90d..2a939bbbbd91e467f0f96015bf6a6c9d4f4e6a72 100644
--- a/game/modules/tome/data/talents/spells/spells.lua
+++ b/game/modules/tome/data/talents/spells/spells.lua
@@ -37,7 +37,7 @@ newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/ph
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/enhancement", name = "enhancement", description = "Magical enhancement of your body." }
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/conveyance", name = "conveyance", generic = true, description = "Conveyance is the school of travel. It allows you to travel faster and to track others." }
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/divination", name = "divination", generic = true, description = "Divination allows the caster to sense its surroundings, find hidden things." }
-newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/nature", name = "nature", generic = true, description = "Summons the power of nature to rejuvenate yourself and the world." }
+newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/aegis", name = "aegis", generic = true, description = "Command the arcane forces into healing and protection." }
 
 -- Alchemist spells
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/explosives", name = "explosive admixtures", description = "Manipulate gems to turn them into explosive magical bombs." }
@@ -108,7 +108,7 @@ load("/data/talents/spells/ice.lua")
 load("/data/talents/spells/air.lua")
 load("/data/talents/spells/storm.lua")
 load("/data/talents/spells/conveyance.lua")
-load("/data/talents/spells/nature.lua")
+load("/data/talents/spells/aegis.lua")
 load("/data/talents/spells/meta.lua")
 load("/data/talents/spells/divination.lua")
 load("/data/talents/spells/temporal.lua")
diff --git a/game/modules/tome/data/talents/spells/temporal.lua b/game/modules/tome/data/talents/spells/temporal.lua
index 8a8f11160851c32fd45e4af1dde4eefc3fce128d..347f983d292280834fb03d8ac98594c5eff742f6 100644
--- a/game/modules/tome/data/talents/spells/temporal.lua
+++ b/game/modules/tome/data/talents/spells/temporal.lua
@@ -53,10 +53,10 @@ newTalent{
 	require = spells_req2,
 	points = 5,
 	mana = 50,
-	cooldown = 30,
+	cooldown = 18,
 	tactical = { DEFEND = 2 },
 	range = 10,
-	getMaxAbsorb = function(self, t) return 50 + self:combatTalentSpellDamage(t, 50, 350) end,
+	getMaxAbsorb = function(self, t) return 50 + self:combatTalentSpellDamage(t, 50, 450) end,
 	getDuration = function(self, t) return util.bound(5 + math.floor(self:getTalentLevel(t)), 5, 15) end,
 	action = function(self, t)
 		self:setEffect(self.EFF_TIME_SHIELD, t.getDuration(self, t), {power=t.getMaxAbsorb(self, t)})
diff --git a/game/modules/tome/data/talents/spells/water.lua b/game/modules/tome/data/talents/spells/water.lua
index e8bcf9373abff5d5df59ed7bc51d30a58ccc2c30..7a213984c89c1cd8d2c830eca67f05c6e956664d 100644
--- a/game/modules/tome/data/talents/spells/water.lua
+++ b/game/modules/tome/data/talents/spells/water.lua
@@ -160,7 +160,8 @@ newTalent{
 			DamageType.ICE, t.getDamage(self, t),
 			3,
 			5, nil,
-			engine.Entity.new{alpha=100, display='', color_br=30, color_bg=60, color_bb=200},
+			{type="icestorm", only_one=true},
+--			engine.Entity.new{alpha=100, display='', color_br=30, color_bg=60, color_bb=200},
 			function(e)
 				e.x = e.src.x
 				e.y = e.src.y
diff --git a/ideas/spells.ods b/ideas/spells.ods
index 713e083834f0693c4e52e1381145b8a1e420842f..83d563ae62c9a38a8deafb68230f808eaa745418 100644
Binary files a/ideas/spells.ods and b/ideas/spells.ods differ