diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 9a2a9011dee7a6c91e0d7d48ff20e36d2da8dcf1..90b7ef20e3fb8e55ade877f9b7123d509372e6e9 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -1725,9 +1725,7 @@ function _M:onTakeHit(value, src, death_note)
 			game:delayedLogMessage(self, nil, "mitosis_damage", "#DARK_GREEN##Source# shares damage with %s oozes!", string.his_her(self))
 			value = value / (#acts+1)
 			for _, act in ipairs(acts) do 
-				act.resists.all = act.resists.all - 50
 				act:takeHit(value, src) 
-				act.resists.all = act.resists.all + 50
 			end
 		end
 	end
diff --git a/game/modules/tome/data/birth/classes/wilder.lua b/game/modules/tome/data/birth/classes/wilder.lua
index 5463837fba5eb13e329c675c9e8d9d66ba693834..087f3f70d3387880f355bba81cba2788e7e7791e 100644
--- a/game/modules/tome/data/birth/classes/wilder.lua
+++ b/game/modules/tome/data/birth/classes/wilder.lua
@@ -207,7 +207,7 @@ newBirthDescriptor{
 		["wild-gift/oozing-blades"]={false, 0.3},
 		["wild-gift/corrosive-blades"]={false, 0.3},
 		["wild-gift/moss"]={true, 0.3},
---		["wild-gift/malleable-body"]={true, 0.3},
+		["wild-gift/eyals-fury"]={false, 0.3},
 		["wild-gift/slime"]={true, 0.3},
 	},
 	talents = {
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index a0480c0b4154c1b0c5f8431e8b82976af7df5942..622dfefe23aac0a4b6658536e16a448d1460d56b 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -493,10 +493,14 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 					src:triggerTalent(src.T_METEORIC_CRASH, nil, target)
 				end
 
-				if not target.dead and t.is_spell and target.knowTalent and target:knowTalent(src.T_SPELL_FEEDBACK) then
-					target:triggerTalent(target.T_SPELL_FEEDBACK, nil, src, t)
+				if not target.dead and t.is_spell and target.knowTalent then
+					if target:knowTalent(target.T_SPELL_FEEDBACK) then
+						target:triggerTalent(target.T_SPELL_FEEDBACK, nil, src, t)
+					end
+					if target:knowTalent(target.T_NATURE_S_DEFIANCE) then
+						target:triggerTalent(target.T_NATURE_S_DEFIANCE, nil, src, t)
+					end
 				end
-
 				if t.is_spell and src.knowTalent and src:knowTalent(src.T_BORN_INTO_MAGIC) then
 					src:triggerTalent(target.T_BORN_INTO_MAGIC, nil, type)
 				end
@@ -628,12 +632,11 @@ newDamageType{
 	name = "acid", type = "ACID", text_color = "#GREEN#",
 	antimagic_resolve = true,
 	projector = function(src, x, y, type, dam)
-		local realdam = DamageType.defaultProjector(src, x, y, type, dam)
 		local target = game.level.map(x, y, Map.ACTOR)
-		if realdam > 0 and target and src.knowTalent and src:knowTalent(src.T_NATURAL_ACID) and not src:isTalentCoolingDown(src.T_NATURAL_ACID) then
-			src:startTalentCooldown(src.T_NATURAL_ACID)
+		local realdam = DamageType.defaultProjector(src, x, y, type, dam)
+		if realdam > 0 and target and src.knowTalent and src:knowTalent(src.T_NATURAL_ACID) then
 			local t = src:getTalentFromId(src.T_NATURAL_ACID)
-			target:setEffect(target.EFF_NATURAL_ACID, 2, {power=t.getResist(src, t)})
+			src:setEffect(src.EFF_NATURAL_ACID, t.getDuration(src, t), {})
 		end
 		return realdam
 	end,
@@ -645,12 +648,11 @@ newDamageType{
 	name = "nature", type = "NATURE", text_color = "#LIGHT_GREEN#",
 	antimagic_resolve = true,
 	projector = function(src, x, y, type, dam)
-		local realdam = DamageType.defaultProjector(src, x, y, type, dam)
 		local target = game.level.map(x, y, Map.ACTOR)
-		if realdam > 0 and target and src.knowTalent and src:knowTalent(src.T_CORROSIVE_NATURE) and not src:isTalentCoolingDown(src.T_CORROSIVE_NATURE) then
-			src:startTalentCooldown(src.T_CORROSIVE_NATURE)
+		local realdam = DamageType.defaultProjector(src, x, y, type, dam)
+		if realdam > 0 and target and src.knowTalent and src:knowTalent(src.T_CORROSIVE_NATURE) then
 			local t = src:getTalentFromId(src.T_CORROSIVE_NATURE)
-			target:setEffect(target.EFF_CORROSIVE_NATURE, 2, {power=t.getResist(src, t)})
+			src:setEffect(src.EFF_CORROSIVE_NATURE, t.getDuration(src, t), {})
 		end
 		return realdam
 	end,
@@ -2638,7 +2640,6 @@ newDamageType{
 	end,
 }
 
-
 newDamageType{
 	name = "natural mucus", type = "MUCUS",
 	projector = function(src, x, y, type, dam, tmp)
@@ -2646,7 +2647,12 @@ newDamageType{
 		if target and not target.turn_procs.mucus then
 			target.turn_procs.mucus = true
 			if src:reactionToward(target) >= 0 then
-				target:incEquilibrium(-dam.equi)
+				if src == target then
+					target:incEquilibrium(-(dam.self_equi or 1))
+				else
+					target:incEquilibrium(-(dam.equi or 1))
+					src:incEquilibrium(-(dam.equi or 1))
+				end
 			elseif target:canBe("poison") then
 				target:setEffect(target.EFF_POISONED, 5, {src=src, power=dam.dam, apply_power=src:combatMindpower()})
 			end
@@ -2693,15 +2699,16 @@ newDamageType{
 -- Bouncy slime!
 newDamageType{
 	name = "bouncing slime", type = "BOUNCE_SLIME",
-	projector = function(src, x, y, type, dam, tmp)
+	projector = function(src, x, y, type, dam, tmp, _, tg)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
-			local realdam = DamageType:get(DamageType.SLIME).projector(src, x, y, DamageType.SLIME, dam.dam)
+			local realdam = DamageType:get(DamageType.SLIME).projector(src, x, y, DamageType.SLIME, {dam=dam.dam, power=0.30})
+			
 			if dam.nb > 0 then
 				dam.done = dam.done or {}
 				dam.done[target.uid] = true
 				dam.nb = dam.nb - 1
-
+				dam.dam = dam.dam*(dam.bounce_factor or 0.5) -- lose 50% damage by default
 				local list = {}
 				src:project({type="ball", selffire=false, x=x, y=y, radius=6, range=0}, x, y, function(bx, by)
 					local actor = game.level.map(bx, by, Map.ACTOR)
@@ -2712,7 +2719,7 @@ newDamageType{
 				end)
 				if #list > 0 then
 					local st = rng.table(list)
-					src:projectile({type="bolt", range=6, x=x, y=y, selffire=false, display={particle="bolt_slime"}}, st.x, st.y, DamageType.BOUNCE_SLIME, dam, {type="slime"})
+					src:projectile({type="bolt", range=6, x=x, y=y, speed = tg.speed or 6, name=tg.name or "bouncing slime", selffire=false, display={particle="bolt_slime"}}, st.x, st.y, DamageType.BOUNCE_SLIME, dam, {type="slime"})
 				end
 			end
 			return realdam
@@ -2720,7 +2727,6 @@ newDamageType{
 	end,
 }
 
-
 -- Acid damage + Slow
 newDamageType{
 	name = "cautic mire", type = "CAUSTIC_MIRE",
diff --git a/game/modules/tome/data/talents/gifts/corrosive-blades.lua b/game/modules/tome/data/talents/gifts/corrosive-blades.lua
index 004e62aa23c8d6a8f4e52ca525ef71d122f28a9b..592453ae49e4d9206144f515745dacf770f925e0 100644
--- a/game/modules/tome/data/talents/gifts/corrosive-blades.lua
+++ b/game/modules/tome/data/talents/gifts/corrosive-blades.lua
@@ -41,7 +41,7 @@ newTalent{
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		local dam = self:mindCrit(t.getDamage(self, t))
-		self:project(tg, x, y, DamageType.ACID, dam)
+		self:project(tg, x, y, DamageType.ACID_DISARM, dam)
 		local _ _, x, y = self:canProject(tg, x, y)
 		game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "ooze_beam", {tx=x-self.x, ty=y-self.y})
 		game:playSoundNear(self, "talents/slime")
@@ -49,8 +49,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local dam = t.getDamage(self, t)
-		return ([[Channel acid through your psiblades, extending their reach to create a beam doing %0.2f acid damage.
-		Damage increase with Mindpower.]]):
+		return ([[Channel acid through your psiblades, extending their reach to create a beam doing %0.1f Acid damage (which can disarm them).
+		The damage increases with your Mindpower.]]):
 		format(damDesc(self, DamageType.ACID, dam))
 	end,
 }
@@ -61,14 +61,21 @@ newTalent{
 	require = gifts_req_high2,
 	points = 5,
 	mode = "passive",
-	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 8, 30, 14)) end,
-	getResist = function(self, t) return 10 + self:combatTalentMindDamage(t, 10, 70) end,
+	getResist = function(self, t) return self:combatTalentMindDamage(t, 10, 40) end,
+	-- called in data.timed_effects.physical.lua for the CORROSIVE_NATURE effect
+	getAcidDamage = function(self, t, level)
+		return self:combatTalentScale(t, 5, 15, 0.75)*math.min(5, level or 1)^0.5/2.23
+	end,
+	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2, 5, "log")) end,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "resists", {[DamageType.ACID]=t.getResist(self, t)})
+	end,
 	info = function(self, t)
-		local res = t.getResist(self, t)
-		return ([[Each time you deal nature damage to a creature its acid resistance is decreased by %d%% for 2 turns.
-		Resistance will decrease with Mindpower.
-		This effect can only happen at most once every %d turns.]]):
-		format(res, self:getTalentCooldown(t))
+		return ([[You gain %d%% Acid resistance.
+		When you deal Nature damage to a creature, you gain a %0.1f%% bonus to Acid damage for %d turns. 
+		This damage bonus will improve up to 4 times (no more than once each turn) with later Nature damage you do, up to a maximum of %0.1f%%.
+		The resistance and damage increase improve with your Mindpower.]]):
+		format(t.getResist(self, t), t.getAcidDamage(self, t, 1), t.getDuration(self, t), t.getAcidDamage(self, t, 5))
 	end,
 }
 
@@ -115,6 +122,7 @@ newTalent{
 	tactical = { ATTACKAREA = { ACID = 2 }, DISABLE = { knockback = 1 } },
 	target = function(self, t) return {type="ball", radius=self:getTalentRadius(t), range=self:getTalentRange(t), talent=t} end,
 	getDamage = function(self, t) return self:combatTalentMindDamage(t, 20, 290) end,
+	getDuration = function(self, t) return math.floor(self:combatTalentLimit(t, 12, 5, 8)) end, -- Limit < 12
 	getNb = function(self, t) local l = self:getTalentLevel(t) 
 		if l < 3 then return 2
 		elseif l < 5 then return 3
@@ -131,13 +139,12 @@ newTalent{
 		local tg = {type="ball", radius=self:getTalentRadius(t), range=self:getTalentRange(t)}
 		local grids = {}
 		self:project(tg, x, y, function(px, py) 
-			if not game.level.map:checkEntity(px, py, Map.TERRAIN, "block_move") then grids[#grids+1] = {x=px, y=py} end
+			if not ((px == x and py == y) or game.level.map:checkEntity(px, py, Map.TERRAIN, "block_move") or game.level.map(px, py, Map.TRAP)) then grids[#grids+1] = {x=px, y=py} end
 		end)
-
 		for i = 1, t.getNb(self, t) do
-			local spot = rng.tableRemove(grids)
+			local spot = i == 1 and {x=x, y=y} or rng.tableRemove(grids)
 			if not spot then break end
-			local t = basetrap(self, t, spot.x, spot.y, 6, {
+			local t = basetrap(self, t, spot.x, spot.y, t.getDuration(self, t), {
 				type = "seed", name = "corrosive seed", color=colors.VIOLET, image = "trap/corrosive_seeds.png",
 				disarm_power = self:combatMindpower(),
 				dam = self:mindCrit(t.getDamage(self, t)),
@@ -167,9 +174,10 @@ newTalent{
 		local dam = t.getDamage(self, t)
 		local nb = t.getNb(self, t)
 		return ([[You focus on a target zone of radius 2 to make up to %d corrosive seeds appear.
-		When a creature walk over a seed it explodes, knocking them back and dealing %0.2f acid damage.
+		The first seed will appear at the center of the target zone, while others will appear at random spots.
+		Each seed lasts %d turns and will explode when a hostile creature walks over it, knocking the creature back and dealing %0.1f Acid damage within radius 1.
 		The damage will increase with your Mindpower.]]):
-		format(nb, damDesc(self, DamageType.ACID, dam))
+		format(nb, t.getDuration(self, t), damDesc(self, DamageType.ACID, dam))
 	end,
 }
 
@@ -179,19 +187,17 @@ newTalent{
 	require = gifts_req_high4,
 	mode = "sustained",
 	points = 5,
-	sustain_equilibrium = 20,
+	sustain_equilibrium = 15,
 	cooldown = 30,
 	tactical = { BUFF = 2 },
 	on_pre_use = function(self, t)
 		local main, off = self:hasPsiblades(true, true)
 		return main and off
 	end,
-	getAcidDamageIncrease = function(self, t) return self:getTalentLevelRaw(t) * 2 end,
-	getResistPenalty = function(self, t) return self:combatTalentLimit(t, 100, 17, 50) end, -- Limit < 100%
-	getRegen = function(self, t) return self:combatTalentLimit(t, 50, 6.5, 32.5) end, -- Limit < 50%
+	getResistPenalty = function(self, t) return self:combatTalentLimit(t, 100, 15, 50) end, -- Limit < 100%
+	getRegen = function(self, t) return self:combatTalentMindDamage(t, 10, 75) end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/slime")
-
 		local particle
 		if core.shader.active(4) then
 			particle = self:addParticles(Particles.new("shader_ring_rotating", 1, {additive=true, radius=1.1}, {type="flames", zoom=5, npow=2, time_factor=9000, color1={0.5,0.7,0,1}, color2={0.3,1,0.3,1}, hide_center=0, xy={self.x, self.y}}))
@@ -199,23 +205,20 @@ newTalent{
 			particle = self:addParticles(Particles.new("master_summoner", 1))
 		end
 		return {
-			dam = self:addTemporaryValue("inc_damage", {[DamageType.ACID] = t.getAcidDamageIncrease(self, t)}),
 			resist = self:addTemporaryValue("resists_pen", {[DamageType.ACID] = t.getResistPenalty(self, t)}),
 			particle = particle,
 		}
 	end,
 	deactivate = function(self, t, p)
 		self:removeParticles(p.particle)
-		self:removeTemporaryValue("inc_damage", p.dam)
 		self:removeTemporaryValue("resists_pen", p.resist)
 		return true
 	end,
 	info = function(self, t)
-		local damageinc = t.getAcidDamageIncrease(self, t)
 		local ressistpen = t.getResistPenalty(self, t)
 		local regen = t.getRegen(self, t)
-		return ([[Surround yourself with nature forces, increasing all your acid damage by %d%% and ignoring %d%% acid resistance of your targets.
-		In addition the acid will nurish your bloated oozes, giving them %d%% life regeneration per turn.]])
-		:format(damageinc, ressistpen, regen)
+		return ([[Surround yourself with natural forces, ignoring %d%% acid resistance of your targets.
+		In addition, the acid will nurish your bloated oozes, giving them an additional %0.1f life regeneration per turn.]])
+		:format(ressistpen, regen)
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/fungus.lua b/game/modules/tome/data/talents/gifts/fungus.lua
index dea5548f4af22a82aeaf3f7253aea6eae16078d8..db726d2ad8d282ca738a955d9fc32ac217025cf1 100644
--- a/game/modules/tome/data/talents/gifts/fungus.lua
+++ b/game/modules/tome/data/talents/gifts/fungus.lua
@@ -74,14 +74,14 @@ newTalent{
 	require = gifts_req3,
 	points = 5,
 	mode = "passive",
-	getEq = function(self, t) return util.bound(math.ceil(self:getTalentLevel(t) / 2), 1, 4) end,
+	getEq = function(self, t) return self:combatTalentScale(t, 0.5, 2.5, 0.5, 0.5) end,
 	getTurn = function(self, t) return util.bound(50 + self:combatTalentMindDamage(t, 5, 500) / 10, 50, 160) end,
 	info = function(self, t)
 		local eq = t.getEq(self, t)
 		local turn = t.getTurn(self, t)
 		return ([[Your fungus can reach into the primordial ages of the world, granting you ancient instincts.
 		Each time a regeneration effect is used on you, you gain %d%% of a turn.
-		Also, regeneration effects on you will decrease your equilibrium by %d each turn.
+		Also, regeneration effects on you will decrease your equilibrium by %0.1f each turn.
 		The turn gain increases with your Mindpower.]]):
 		format(turn, eq)
 	end,
diff --git a/game/modules/tome/data/talents/gifts/gifts.lua b/game/modules/tome/data/talents/gifts/gifts.lua
index 8ee2f79d1441f3102915d13574f541f4f8b0d5c9..a173b340546d3040dbb8c53d80e0ab4f898bcf35 100644
--- a/game/modules/tome/data/talents/gifts/gifts.lua
+++ b/game/modules/tome/data/talents/gifts/gifts.lua
@@ -41,6 +41,7 @@ newTalentType{ allow_random=true, is_mind=true, is_nature=true, type="wild-gift/
 newTalentType{ allow_random=true, is_mind=true, is_nature=true, type="wild-gift/malleable-body", name = "malleable body", description = "Your body's anatomy is starting to blur." }
 newTalentType{ allow_random=true, is_mind=true, is_nature=true, type="wild-gift/oozing-blades", name = "oozing blades", description = "You channel ooze through your psiblades." }
 newTalentType{ allow_random=true, is_mind=true, is_nature=true, type="wild-gift/corrosive-blades", name = "corrosive blades", description = "You channel acid through your psiblades." }
+newTalentType{ allow_random=true, is_mind=true, is_nature=true, type="wild-gift/eyals-fury", name = "eyal's fury", description = "Unleash nature's fury against foes around you." }
 
 -- Generic requires for gifts based on talent level
 gifts_req1 = {
@@ -221,3 +222,4 @@ load("/data/talents/gifts/summon-augmentation.lua")
 load("/data/talents/gifts/summon-advanced.lua")
 
 load("/data/talents/gifts/mindstar-mastery.lua")
+load("/data/talents/gifts/eyals-fury.lua")
diff --git a/game/modules/tome/data/talents/gifts/moss.lua b/game/modules/tome/data/talents/gifts/moss.lua
index 31928e99cbd6801e47161c080464d33196a647c0..b3749fa7f3be2a7bc3d7eed7cdb26bc61a041172 100644
--- a/game/modules/tome/data/talents/gifts/moss.lua
+++ b/game/modules/tome/data/talents/gifts/moss.lua
@@ -35,7 +35,7 @@ newTalent{
 	no_energy = true,
 	tactical = { ATTACKAREA = {NATURE=1}, DISABLE = {pin = 1} },
 	getDamage = function(self, t) return self:combatTalentMindDamage(t, 6, 40) end,
-	getDuration = function(self, t) return math.ceil(self:combatTalentScale(t, 4, 8)) end, 
+	getDuration = function(self, t) return math.floor(self:combatTalentLimit(t, 16, 4, 8)) end, -- Limit < 16
 	getSlow = function(self, t) return math.ceil(self:combatTalentLimit(t, 100, 36, 60)) end, -- Limit < 100%
 	getPin = function(self, t) return math.ceil(self:combatTalentLimit(t, 100, 25, 45)) end, -- Limit < 100%
 	range = 0,
@@ -85,7 +85,7 @@ newTalent{
 	no_energy = true,
 	tactical = { ATTACKAREA = {NATURE=1}, HEAL = 1 },
 	getDamage = function(self, t) return self:combatTalentMindDamage(t, 6, 40) end,
-	getDuration = function(self, t) return math.ceil(self:combatTalentScale(t,4,8)) end,
+	getDuration = function(self, t) return math.floor(self:combatTalentLimit(t, 16, 4, 8)) end, -- Limit < 16
 	getHeal = function(self, t) return math.floor(self:combatTalentLimit(t, 200, 62, 110)) end, -- Limit < 200%	
 	range = 0,
 	radius = function(self, t)
@@ -131,10 +131,10 @@ newTalent{
 	cooldown = 16,
 	equilibrium = 5,
 	no_energy = true,
-	tactical = { ATTACKAREA = {NATURE=1}, DISABLE = {pin = 1} },
+	tactical = { ATTACKAREA = {NATURE=1}, DISABLE = 2 },
 	getDamage = function(self, t) return self:combatTalentMindDamage(t, 6, 40) end,
-	getDuration = function(self, t) return math.ceil(self:combatTalentScale(t, 4, 8)) end,
-	getFail = function(self, t) return math.min(50, 15 + math.ceil(self:getTalentLevel(t) * 4)) end,
+	getDuration = function(self, t) return math.floor(self:combatTalentLimit(t, 16, 4, 8)) end, -- Limit < 16
+	getFail = function(self, t) return self:combatTalentLimit(t, 50, 19, 35) end, -- Limit < 50%
 	range = 0,
 	radius = function(self, t)
 		return math.floor(self:combatTalentScale(t,2.5, 4.5, nil, 0, 0, true)) 
@@ -166,7 +166,7 @@ newTalent{
 		This moss is very slippery and causes affected foes to have a %d%% chance of failing to perform complex actions.
 		The moss lasts %d turns.
 		Moss talents are instant but place all other moss talents on cooldown for 3 turns.
-		The damage will increase with your Mindpower.]]):
+		The damage and the chance to apply the slippery effect increase with your Mindpower.]]):
 		format(radius, damDesc(self, DamageType.NATURE, damage), fail, duration)
 	end,
 }
@@ -179,9 +179,9 @@ newTalent{
 	cooldown = 16,
 	equilibrium = 5,
 	no_energy = true,
-	tactical = { ATTACKAREA = {NATURE=1}, DISABLE = {pin = 1} },
+	tactical = { ATTACKAREA = {NATURE=1}, DISABLE = {confusion = 1} },
 	getDamage = function(self, t) return self:combatTalentMindDamage(t, 6, 40) end,
-	getDuration = function(self, t) return math.ceil(self:combatTalentScale(t, 4, 8)) end,
+	getDuration = function(self, t) return math.floor(self:combatTalentLimit(t, 16, 4, 8)) end, -- Limit < 16
 	getChance = function(self, t) return math.ceil(self:combatTalentLimit(t, 100, 25.5, 47.5)) end, -- Limit < 100%
 	getPower = function(self, t) return math.max(0,self:combatTalentLimit(t, 50, 20, 40)) end, -- Limit < 50%
 	range = 0,
diff --git a/game/modules/tome/data/talents/gifts/mucus.lua b/game/modules/tome/data/talents/gifts/mucus.lua
index 0cd9f46466f6233ec10624fc282d089b1d5477bc..6072dcf4d46931ebc908ea124db1b8039e2d19c1 100644
--- a/game/modules/tome/data/talents/gifts/mucus.lua
+++ b/game/modules/tome/data/talents/gifts/mucus.lua
@@ -31,19 +31,39 @@ newTalent{
 	equilibrium = 0,
 	cooldown = 20,
 	no_energy = true,
-	tactical = { BUFF = 2 },
+	tactical = { BUFF = 2, EQUILIBRIUM = 2,
+		ATTACKAREA = function(self, t)
+			if self:getTalentLevel(t)>=4 then return {NATURE = 1 } end
+		end
+	},
 	getDur = function(self, t) return math.floor(self:combatTalentLimit(t, 20, 4, 6.5)) end, -- Limit < 20
 	getDamage = function(self, t) return self:combatTalentMindDamage(t, 5, 90) end,
-	getEqui = function(self, t) return self:combatTalentMindDamage(t, 2, 10) end,
-	trigger = function(self, t, x, y, rad) 
-		game.level.map:addEffect(self,
-			x, y, t.getDur(self, t),
-			DamageType.MUCUS, {dam=t.getDamage(self, t), equi=t.getEqui(self, t)},
-			rad,
-			5, nil,
-			{type="mucus"},
-			nil, true
-		)
+	-- note meditation recovery: local pt = 2 + self:combatTalentMindDamage(t, 20, 120) / 10 = O(<1)
+	getEqui = function(self, t) return self:combatTalentMindDamage(t, 2, 8) end,
+	-- Called by MUCUS effect in mod.data.timed_effects.physical.lua
+	trigger = function(self, t, x, y, rad, eff) -- avoid stacking on map tile
+		local oldmucus = eff and eff[x] and eff[x][y] -- get previous mucus at this spot
+		if not oldmucus or oldmucus.duration <= 0 then -- make new mucus
+			local mucus=game.level.map:addEffect(self,
+				x, y, t.getDur(self, t),
+				DamageType.MUCUS, {dam=t.getDamage(self, t), self_equi=t.getEqui(self, t), equi=1, bonus_level = 0},
+				rad,
+				5, nil,
+				{type="mucus"},
+				nil, true
+			)
+			if eff then
+				eff[x] = eff[x] or {}
+				eff[x][y]=mucus
+			end
+		else
+			if oldmucus.duration > 0 then -- Enhance existing mucus
+				oldmucus.duration = oldmucus.duration + 1
+				oldmucus.dam.bonus_level = oldmucus.dam.bonus_level + 1
+				oldmucus.dam.self_equi = oldmucus.dam.self_equi + 1
+				oldmucus.dam.dam = t.getDamage(self, t) * (1+ self:combatTalentScale(oldmucus.dam.bonus_level, 0.25, 0.7))
+			end
+		end
 	end,
 	action = function(self, t)
 		local dur = t.getDur(self, t)
@@ -54,13 +74,13 @@ newTalent{
 		local dur = t.getDur(self, t)
 		local dam = t.getDamage(self, t)
 		local equi = t.getEqui(self, t)
-		return ([[You start to create mucus where you walk or stand for %d turns.
-		Mucus will poison all foes crossing it, dealing %0.2f nature damage every turn for 5 turn (stacking).
-		Any friendly creature walking the mucus will restore equilibrium by %d per turn.
-		Mucus will disappear after %d turns.
-		At level 4 the mucus will grow in a radius 1.
-		Damage and equilibrium regen increase with Mindpower.]]):
-		format(dur, damDesc(self, DamageType.NATURE, dam), equi, dur)
+		return ([[For %d turns, you lay down mucus where you walk or stand.
+		The mucus is placed automatically every turn and lasts %d turns.
+		At talent level 4 or greater, the mucus will expand to a radius 1 area from where it is placed.
+		Your mucus will poison all foes crossing it, dealing %0.1f nature damage every turn for 5 turns (stacking).
+		In addition, each turn, you will restore %0.1f Equilibrium while in your own mucus, and other friendly creatures in your mucus will restore 1 Equilibrium both for you and for themselves.
+		The Poison damage and Equilibrium regeneration increase with Mindpower, and laying down more mucus in the same spot will intensify its effects and extend its duration by 1 turn.]]):
+		format(dur, dur, damDesc(self, DamageType.NATURE, dam), equi)
 	end,
 }
 
@@ -83,7 +103,9 @@ newTalent{
 		if not x or not y then return nil end
 
 		local grids, px, py = self:project(tg, x, y, DamageType.ACID, self:mindCrit(t.getDamage(self, t)))
-		if self:knowTalent(self.T_MUCUS) then self:callTalent(self.T_MUCUS, nil, px, py, tg.radius) end
+		if self:knowTalent(self.T_MUCUS) then
+			self:callTalent(self.T_MUCUS, nil, px, py, tg.radius, self:hasEffect(self.EFF_MUCUS))
+		end
 		game.level.map:particleEmitter(px, py, tg.radius, "acidflash", {radius=tg.radius, tx=px, ty=py})
 
 		local tgts = {}
@@ -120,9 +142,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local dam = t.getDamage(self, t)
-		return ([[You call upon nature to turn the ground into an acidic explosion in a radius %d, dealing %0.2f acid damage to all creatures and creating mucus under it.
-		Also if you have any Mucus Oozes active they will, if in line of sight, instantly throw a slime spit (at reduced power) at one of the target hit by the splash.
-		Damage will increase with Mindpower.]]):
+		return ([[Calling upon nature, you cause the ground to erupt in an radius %d acidic explosion, dealing %0.1f acid damage to all creatures and creating mucus in the area.
+		Any Mucus Oozes you have active will, if in line of sight, instantly spit slime (at reduced power) at one of the targets hit by the splash.
+		The damage increases with your Mindpower.]]):
 		format(self:getTalentRadius(t), damDesc(self, DamageType.ACID, dam))
 	end,
 }
@@ -161,7 +183,8 @@ newTalent{
 	mode = "passive",
 	getMax = function(self, t) return math.floor(math.max(1, self:combatStatScale("cun", 0.5, 5))) end,
 	getChance = function(self, t) return self:combatLimit(self:combatTalentMindDamage(t, 5, 300), 50, 12.6, 26, 32, 220) end, -- Limit < 50% --> 12.6 @ 36, 32 @ 220
-
+	getSummonTime = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end,
+	-- by MUCUS damage type in mod.data.damage_types.lua
 	spawn = function(self, t)
 		local notok, nb, sumlim = checkMaxSummon(self, true, 1, "is_mucus_ooze")
 		if notok or nb > t.getMax(self, t) or not self:canBe("summon") then return end
@@ -181,6 +204,7 @@ newTalent{
 			type = "vermin", subtype = "oozes",
 			display = "j", color=colors.GREEN, image = "npc/vermin_oozes_green_ooze.png",
 			name = "mucus ooze",
+			faction = self.faction,
 			desc = "It's made from mucus and it's oozing.",
 			sound_moam = {"creatures/jelly/jelly_%d", 1, 3},
 			sound_die = {"creatures/jelly/jelly_die_%d", 1, 2},
@@ -208,7 +232,7 @@ newTalent{
 			combat = { dam=5, atk=0, apr=5, damtype=DamageType.POISON },
 
 			summoner = self, summoner_gain_exp=true, wild_gift_summon=true, is_mucus_ooze = true,
-			summon_time = math.floor(self:combatTalentScale(t, 6, 10)),
+			summon_time = t.getSummonTime(self, t),
 			max_summon_time = math.floor(self:combatTalentScale(t, 6, 10)),
 		}
 		m:learnTalent(m.T_MUCUS_OOZE_SPIT, true, self:getTalentLevelRaw(t))
@@ -232,12 +256,13 @@ newTalent{
 
 	end,
 	info = function(self, t)
-		return ([[Your mucus is brought to near sentience. Each turn there is a %d%% chance that a random spot of your mucus will spawn a Mucus Ooze.
-		Mucus Oozes will attack any of your foes by spitting slime at them.
-		You may have up to %d Oozes active at any time (based on your Cunning).
-		Any time you deal a mental critical, all your Mucus Oozes' remaining time will increase by 2.
-		The effect will increase with your Mindpower.]]):
-		format(t.getChance(self, t), t.getMax(self, t))
+		return ([[Your mucus is brought to near sentience.
+		Each turn, there is a %d%% chance that a random spot of your mucus will spawn a Mucus Ooze.
+		Mucus Oozes last %d turns and will attack any of your foes by spitting slime at them.
+		You may have up to %d Mucus Oozes active at any time (based on your Cunning).
+		Any time you deal a mental critical, the remaining time on all of your Mucus Oozes will increase by 2.
+		The spawn chance increases with your Mindpower.]]):
+		format(t.getChance(self, t), t.getSummonTime(self, t), t.getMax(self, t))
 	end,
 }
 
@@ -283,10 +308,9 @@ newTalent{
 	info = function(self, t)
 		local nb = t.getNb(self, t)
 		local energy = t.getEnergy(self, t)
-		return ([[You temporarily merge with your mucus, cleasing you from %d physical or magical effects.
-		You can then reappear on any tile in sight that is also covered by mucus.
-		This takes %d%% of a turn to do.
-		Only works when standing over mucus.]]):
+		return ([[You temporarily merge with your mucus, cleasing yourself of %d physical or magical effects.
+		You can then reemerge on any tile within sight and range that is also covered by mucus.
+		This is quick, requiring only %d%% of a turn to perform, but you must be in contact with your mucus.]]):
 		format(nb, (energy) * 100)
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/ooze.lua b/game/modules/tome/data/talents/gifts/ooze.lua
index aa72b7a370485e2fbf6221d0962f836010d65524..52066859626a52c43dce1a2a6a43b2fb11ecd9d8 100644
--- a/game/modules/tome/data/talents/gifts/ooze.lua
+++ b/game/modules/tome/data/talents/gifts/ooze.lua
@@ -25,17 +25,29 @@ newTalent{
 	points = 5,
 	cooldown = 10,
 	sustain_equilibrium = 10,
-	tactical = { BUFF = 2 },
-	getMaxHP = function(self, t) return 50 + self:combatTalentMindDamage(t, 30, 250) end,
-	getMax = function(self, t) local _, _, max = checkMaxSummon(self, true) return math.min(max, math.max(1, math.floor(self:combatTalentScale(t, 0.5, 2.5)))) end,
+	tactical = { BUFF = 2,
+		EQUILIBRIUM = function(self, t)
+			if self:knowTalent(self.T_REABSORB) then return 1 end
+		end
+	},
+	getMaxHP = function(self, t) return
+		50 + self:combatTalentMindDamage(t, 30, 250) + self.max_life * self:combatTalentLimit(t, 0.25, .025, .1)
+	end,
+	getMax = function(self, t) local _, _, max = checkMaxSummon(self, true) return math.min(max, math.max(1, math.floor(self:combatTalentLimit(t, 6, 1, 3.1)))) end, --Limit < 6
 	getChance = function(self, t) return self:combatLimit(self:combatTalentStatDamage(t, "cun", 10, 400), 100, 20, 0, 61, 234) end, -- Limit < 100%
+	getOozeResist = function(self, t) return self:combatTalentLimit(t, 70, 15, 30) end, --Limit < 70%
+	getSummonTime = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end,
+	-- called in mod.class.Actor.onTakeHit
 	spawn = function(self, t, life)
+		-- check summoning limits
 		if checkMaxSummon(self, true) or not self:canBe("summon") then return end
+		local _, nb = checkMaxSummon(self, true, nil, "bloated_ooze")
+		if nb >= t.getMax(self, t) then	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 summon!")
+			game.logPlayer(self, "You try to split, but there is no free space close enough to summon!")
 			return
 		end
 
@@ -50,7 +62,7 @@ newTalent{
 			body = { INVEN = 10 },
 			autolevel = "tank",
 			ai = "summoned", ai_real = "dumb_talented_simple", ai_state = { talent_in=1, },
-			stats = { wil=10, dex=10, mag=3, str=self:combatTalentScale(t, 0.8, 4, 0.75), con=self:combatStatScale("con", 10, 100, 0.75), cun=self:combatStatScale("cun", 10, 100, 0.75)},
+			stats = { wil=10, dex=10, mag=3, str=self:combatStatScale("wil", 10, 50, 0.75), con=self:combatStatScale("con", 10, 100, 0.75), cun=self:combatStatScale("cun", 10, 100, 0.75)},
 			global_speed_base = 0.5,
 			combat = {sound="creatures/jelly/jelly_hit"},
 			combat_armor = self:combatTalentScale(t, 5, 25),
@@ -61,28 +73,26 @@ newTalent{
 			cut_immune = 1,
 			blind_immune = 1,
 			bloated_ooze = 1,
-
-			resists = { all = 50 },
+			resists = { all = t.getOozeResist(self, t)},
+			resists_cap = table.clone(self.resists_cap),
 			fear_immune = 1,
-
 			blood_color = colors.GREEN,
 			level_range = {self.level, self.level}, exp_worth = 0,
 			max_life = 30,
-			life_regen = 0,
-
-			combat = { dam=5, atk=0, apr=5, damtype=DamageType.POISON },
+			life_regen = 0.1*life,
+			faction = self.faction,
+			combat = { dam=5, atk=self:combatStatScale("cun", 10, 100, 0.75), apr=5, damtype=DamageType.POISON },
 
 			summoner = self, summoner_gain_exp=true, wild_gift_summon=true,
-			summon_time = math.floor(self:combatTalentScale(t, 6, 10)),
+			summon_time = t.getSummonTime(self, t),
 			max_summon_time = math.floor(self:combatTalentScale(t, 6, 10)),
 			resolvers.sustains_at_birth(),
 		}
 		setupSummon(self, m, x, y)
-		m.max_life = life
-		m.life = life
+		m.max_life = math.min(life, t.getMaxHP(self, t))
+		m.life = m.max_life
 		if self:isTalentActive(self.T_ACIDIC_SOIL) then
-			local st = self:getTalentFromId(self.T_ACIDIC_SOIL)
-			m.life_regen = st.getRegen(self, st) * life / 100
+			m.life_regen = m.life_regen + self:callTalent(self.T_ACIDIC_SOIL, "getRegen")
 		end
 
 		game:playSoundNear(self, "talents/spell_generic2")
@@ -90,19 +100,23 @@ newTalent{
 		return true
 	end,
 	activate = function(self, t)
-		return {}
+		return {equil_regen = self:knowTalent(self.T_REABSORB) and self:addTemporaryValue("equilibrium_regen", -self:callTalent(self.T_REABSORB, "equiRegen"))}
 	end,
 	deactivate = function(self, t, p)
+		if p.equil_regen then self:removeTemporaryValue("equilibrium_regen", p.equil_regen) end
 		return true
 	end,
 	info = function(self, t)
+		local xs = self:knowTalent(self.T_REABSORB) and ([[In addition, you restore %0.1f Equilibrium per turn while this talent is active.
+		]]):format(self:callTalent(self.T_REABSORB, "equiRegen")) or ""
 		return ([[Your body is more like that of an ooze.
-		When you get hit you have up to a %d%% chance to split and create a Bloated Ooze with as much health as you have taken damage (up to %d).
-		All damage you take will be split equally between you and your Bloated Oozes.
-		You may have up to %d Bloated Oozes active at any time (based on your Cunning and talent level).
-		Bloated Oozes are very resilient (50%% all damage resistance) to damage not coming through your shared link.
-		The maximum life depends on Mindpower and the chance on Cunning.]]):
-		format(t.getChance(self, t), t.getMaxHP(self, t), t.getMax(self, t))
+		When you take damage, you may split and create a Bloated Ooze nearby within your line of sight.
+		This ooze has as much health as twice the damage you took (up to a maximum of %d, based on your Mindpower and maximum life).
+		The chance to split equals the percent of your health lost times %0.2f.
+		You may have up to %d Bloated Oozes active at any time (limited by talent level and the summoning limit), and all damage you take will be split equally between you and them so long as this talent is active.
+		Bloated Oozes last for %d turns, are very resilient (%d%% all damage resistance to damage not coming through your shared link), and regenerate life quickly.
+		%sThe chance to split increases with your Cunning.]]):
+		format(t.getMaxHP(self, t), t.getChance(self, t)*3/100, t.getMax(self, t), t.getSummonTime(self, t), t.getOozeResist(self, t), xs)
 	end,
 }
 
@@ -126,6 +140,7 @@ newTalent{
 		end
 		return false
 	end,
+	equiRegen = function(self, t) return 0.2 + self:combatTalentMindDamage(t, 0, 1.4) end,
 	action = function(self, t)
 		local possibles = {}
 		for _, coor in pairs(util.adjacentCoords(self.x, self.y)) do
@@ -147,10 +162,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You randomly merge with an adjacent bloated ooze, granting you 40%% damage resistance for %d turns.
-		The merging also releases a burst of antimagic, dealing %0.2f manaburn damage in radius %d.
-		The effect will increase with your Mindpower.]]):
-		format(t.getDuration(self, t), damDesc(self, DamageType.ARCANE, t.getDam(self, t)),	3)
+		return ([[You randomly merge with an adjacent bloated ooze, granting you 40%% all damage resistance for %d turns.
+		This process releases a burst of antimagic, dealing %0.1f Manaburn damage in radius %d.
+		This talent allows you to restore %0.1f Equilibrium per turn while Mitosis is active.
+		The damage, duration and Equilibrium restoration increase with your Mindpower.]]):
+		format(t.getDuration(self, t), damDesc(self, DamageType.ARCANE, t.getDam(self, t)),	3, t.equiRegen(self, t))
 	end,
 }
 
@@ -161,13 +177,21 @@ newTalent{
 	points = 5,
 	equilibrium = 5,
 	cooldown = 20,
+	tactical = { ATTACK = { PHYSICAL = 1, ACID = 2 } },
 	getMax = function(self, t) local _, _, max = checkMaxSummon(self, true) return math.min(max, self:callTalent(self.T_MITOSIS, "getMax"), math.max(1, math.floor(self:combatTalentScale(t, 0.5, 2.5)))) end,
 	getModHP = function(self, t) return self:combatTalentLimit(t, 1, 0.46, 0.7) end, --  Limit < 1
+	getLife = function(self, t) return self:callTalent(self.T_MITOSIS, "getMaxHP")*t.getModHP(self, t) end,
+	getWepDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.7, 1.8) end,
+	on_pre_use = function(self, t)
+		local _, nb = checkMaxSummon(self, true, nil, "bloated_ooze")
+		return nb < t.getMax(self, t)
+	end,
 	action = function(self, t)
 		local ot = self:getTalentFromId(self.T_MITOSIS)
 		local _, cur_nb, max = checkMaxSummon(self, true, nil, "bloated_ooze")
+		local life = t.getLife(self, t)
 		for i = cur_nb + 1, t.getMax(self, t) do
-			ot.spawn(self, ot, ot.getMaxHP(self, ot) * t.getModHP(self, t))
+			ot.spawn(self, ot, life)
 		end
 
 		local list = {}
@@ -203,7 +227,7 @@ newTalent{
 				end
 				if core.fov.distance(tx, ty, target.x, target.y) <= 1 then
 					target:setTarget(ooze)
-					self:attackTarget(target, DamageType.ACID, self:combatTalentWeaponDamage(t, 0.6, 2.2), true)
+					self:attackTarget(target, DamageType.ACID, t.getWepDamage(self, t), true)
 				end
 			end
 		end
@@ -212,10 +236,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Instantly call all your bloated oozes to fight and if below the maximum number of oozes allowed by the Mitosis talent, at most %d will be created with %d%% of the maximum life allowed by Mitosis.
-		Each of them will be transported near a random foe in sight grab its attention.
-		Taking advantage of the situation you channel a melee attack though all of them to their foes dealing %d%% weapon damage as acid.]]):
-		format(t.getMax(self, t), t.getModHP(self, t)*100, self:combatTalentWeaponDamage(t, 0.6, 2.2) * 100)
+		return ([[Instantly call all of your bloated oozes to your aid.
+		If you have less than the maximum number of oozes allowed by the Mitosis talent, up to %d will be created with %d life (%d%% of the maximum life allowed by Mitosis).
+		Each ooze created will form near a random foe in sight (no more than one ooze per target) and grab its attention.
+		This will then allow you to channel a melee attack through your ooze to its target, doing %d%% weapon damage (as Acid).]]):
+		format(t.getMax(self, t), t.getLife(self, t), t.getModHP(self, t)*100, t.getWepDamage(self, t) * 100)
 	end,
 }
 
@@ -225,20 +250,20 @@ newTalent{
 	require = gifts_req4,
 	points = 5,
 	mode = "passive",
-	critResist = function(self, t) return self:combatTalentScale(t, 20, 75) end,
-	immunities = function(self, t) return self:combatTalentLimit(t, 1, 0.2, 0.5) end, -- Limit < 100% immunities
+	--compare to lethality: self:combatTalentScale(t, 7.5, 25, 0.75)
+	critResist = function(self, t) return self:combatTalentScale(t, 15, 50, 0.75) end,
+	immunities = function(self, t) return self:combatTalentLimit(t, 1, 0.2, 0.7) end, -- Limit < 100% immunities
 	passives = function(self, t, p)
 		self:talentTemporaryValue(p, "blind_immune", t.immunities(self, t))
 		self:talentTemporaryValue(p, "poison_immune", t.immunities(self, t))
 		self:talentTemporaryValue(p, "disease_immune", t.immunities(self, t))
 		self:talentTemporaryValue(p, "cut_immune", t.immunities(self, t))
-		self:talentTemporaryValue(p, "confusion_immune", t.immunities(self, t))
 		self:talentTemporaryValue(p, "ignore_direct_crits", t.critResist(self, t))
 	end,
 	info = function(self, t)
-		return ([[Your body's internal organs are melded together, disguising your vital areas.
+		return ([[Your body's internal organs are indistinct, disguising your vital areas.
 		All direct critical hits (physical, mental, spells) against you have a %d%% lower Critical multiplier (but always do at least normal damage).
-		In addition you gain %d%% disease, poison, wounds, confusion and blindness resistances.]]):
+		In addition you gain %d%% resistance to disease, poison, wounds and blindness.]]):
 		format(t.critResist(self, t), 100*t.immunities(self, t))
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/oozing-blades.lua b/game/modules/tome/data/talents/gifts/oozing-blades.lua
index cabc138d9025b25bdcaf2f8e6982af1b548df1b3..35bcb608603451312380e97ec324c13df9b15f4d 100644
--- a/game/modules/tome/data/talents/gifts/oozing-blades.lua
+++ b/game/modules/tome/data/talents/gifts/oozing-blades.lua
@@ -24,7 +24,7 @@ newTalent{
 	points = 5,
 	equilibrium = 4,
 	cooldown = 3,
-	tactical = { ATTACKAREA = {NATURE=2} },
+	tactical = { ATTACKAREA = { NATURE = 2 },  DISABLE = 1 },
 	on_pre_use = function(self, t)
 		local main, off = self:hasPsiblades(true, true)
 		return main and off
@@ -50,8 +50,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local dam = t.getDamage(self, t)
-		return ([[Channel slime through your psiblades, extending their reach to create a beam doing %0.2f slime damage.
-		Damage increase with Mindpower.]]):
+		return ([[Channel slime through your psiblades, extending their reach to create a beam doing %0.1f Slime damage.
+		The damage increases with your Mindpower.]]):
 		format(damDesc(self, DamageType.NATURE, dam))
 	end,
 }
@@ -62,14 +62,21 @@ newTalent{
 	require = gifts_req_high2,
 	points = 5,
 	mode = "passive",
-	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 8, 30, 14)) end,
-	getResist = function(self, t) return 10 + self:combatTalentMindDamage(t, 10, 70) end,
+	getResist = function(self, t) return self:combatTalentMindDamage(t, 10, 40) end,
+	-- called in data.timed_effects.physical.lua for the NATURAL_ACID effect
+	getNatureDamage = function(self, t, level)
+		return self:combatTalentScale(t, 5, 15, 0.75)*math.min(5, level or 1)^0.5/2.23
+	end,
+	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2, 5, "log")) end,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "resists", {[DamageType.NATURE]=t.getResist(self, t)})
+	end,
 	info = function(self, t)
-		local res = t.getResist(self, t)
-		return ([[Each time you deal acid damage to a creature its nature resistance is decreased by %d%% for 2 turns.
-		Resistance will decrease with Mindpower.
-		This effect can only happen at most once every %d turns.]]):
-		format(res, self:getTalentCooldown(t))
+		return ([[You gain %d%% Nature resistance.
+		When you deal Acid damage to a creature, you gain a %0.1f%% bonus to Nature damage for %d turns. 
+		This damage bonus will improve up to 4 times (no more than once each turn) with later Acid damage you do, up to a maximum of %0.1f%%.
+		The resistance and damage increase improve with your Mindpower.]]):
+		format(t.getResist(self, t), t.getNatureDamage(self, t, 1), t.getDuration(self, t), t.getNatureDamage(self, t, 5))
 	end,
 }
 
@@ -88,7 +95,7 @@ newTalent{
 	target = function(self, t) return {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="bolt_slime", trail="slimetrail"}} end,
 	tactical = { DISABLE = 2 },
 	requires_target = true,
-	getChance = function(self, t) return math.min(100, 30 + self:combatTalentMindDamage(t, 10, 70)) end,
+	getChance = function(self, t) return math.max(0, self:combatLimit(self:combatTalentMindDamage(t, 10, 70), 100, 39, 9, 86, 56)) end, -- Limit < 100%
 	getNb = function(self, t) return math.ceil(self:combatTalentLimit(t, 4, 1, 2)) end,
 	getTurns = function(self, t) return math.ceil(self:combatTalentLimit(t, 20, 2, 12)) end,
 	action = function(self, t)
@@ -121,15 +128,14 @@ newTalent{
 	require = gifts_req_high4,
 	mode = "sustained",
 	points = 5,
-	sustain_equilibrium = 20,
+	sustain_equilibrium = 15,
 	cooldown = 30,
 	on_pre_use = function(self, t)
 		local main, off = self:hasPsiblades(true, true)
 		return main and off
 	end,
 	tactical = { BUFF = 2 },
-	getNatureDamageIncrease = function(self, t) return self:getTalentLevelRaw(t) * 2 end,
-	getResistPenalty = function(self, t) return self:combatTalentLimit(t, 100, 10, 50, true) end, -- Limit < 100%
+	getResistPenalty = function(self, t) return self:combatTalentLimit(t, 100, 15, 50) end, -- Limit < 100%
 	getChance = function(self, t) return math.max(0,self:combatTalentLimit(t, 100, 14, 70)) end, -- Limit < 100%
 	freespit = function(self, t, target)
 		if game.party:hasMember(self) then
@@ -158,23 +164,20 @@ newTalent{
 			particle = self:addParticles(Particles.new("master_summoner", 1))
 		end
 		return {
-			dam = self:addTemporaryValue("inc_damage", {[DamageType.NATURE] = t.getNatureDamageIncrease(self, t)}),
 			resist = self:addTemporaryValue("resists_pen", {[DamageType.NATURE] = t.getResistPenalty(self, t)}),
 			particle = particle,
 		}
 	end,
 	deactivate = function(self, t, p)
 		self:removeParticles(p.particle)
-		self:removeTemporaryValue("inc_damage", p.dam)
 		self:removeTemporaryValue("resists_pen", p.resist)
 		return true
 	end,
 	info = function(self, t)
-		local damageinc = t.getNatureDamageIncrease(self, t)
 		local ressistpen = t.getResistPenalty(self, t)
 		local chance = t.getChance(self, t)
-		return ([[Surround yourself with nature forces, increasing all your nature damage by %d%% and ignoring %d%% nature resistance of your targets.
-		In addition any time you deal damage with a wild gift there is a %d%% chance that one of you mucus ooze will spit at the target as a free action.]])
-		:format(damageinc, ressistpen, chance)
+		return ([[Surround yourself with natural forces, ignoring %d%% nature resistance of your targets.
+		In addition, any time you deal damage with a wild gift there is a %d%% chance that one of your mucus oozes will spit at the target as a free action.]])
+		:format(ressistpen, chance)
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/slime.lua b/game/modules/tome/data/talents/gifts/slime.lua
index 09a8dd5670d2b4eee07648af8ad229e31db077b8..537667ea63cb63acd8f2506384100dd692225903 100644
--- a/game/modules/tome/data/talents/gifts/slime.lua
+++ b/game/modules/tome/data/talents/gifts/slime.lua
@@ -25,22 +25,25 @@ newTalent{
 	random_ego = "attack",
 	equilibrium = 4,
 	cooldown = 5,
-	tactical = { ATTACK = { NATURE = 2} },
+	tactical = { ATTACK = { NATURE = 2}, DISABLE = 1 },
 	range = 10,
-	proj_speed = 8,
+	proj_speed = 6,
 	requires_target = true,
+	getTargetCount = function(self, t) return math.floor(self:combatTalentScale(t, 1, 5, "log")) end,
+	bouncePercent = function(self, t) return self:combatTalentLimit(t, 100, 50, 60) end, --Limit < 100%
 	action = function(self, t)
-		local tg = {type="bolt", range=self:getTalentRange(t), selffire=false, talent=t, display={particle="bolt_slime"}}
+		local tg = {type="bolt", range=self:getTalentRange(t), selffire=false, talent=t, display={particle="bolt_slime"}, name = t.name, speed = t.proj_speed}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:projectile(tg, x, y, DamageType.BOUNCE_SLIME, {nb=math.ceil(self:getTalentLevel(t)), dam=self:mindCrit(self:combatTalentMindDamage(t, 30, 290))}, {type="slime"})
+		self:projectile(tg, x, y, DamageType.BOUNCE_SLIME, {nb=t.getTargetCount(self, t), dam=self:mindCrit(self:combatTalentMindDamage(t, 30, 250)), bounce_factor=t.bouncePercent(self, t)/100}, {type="slime"})
 		game:playSoundNear(self, "talents/slime")
 		return true
 	end,
 	info = function(self, t)
-		return ([[Spit slime at your target doing %0.2f nature damage and slowing it down by 30%% for 3 turns.
-		The bolt can bounce to a nearby foe %d times.
-		The damage will increase with Mindpower]]):format(damDesc(self, DamageType.NATURE, self:combatTalentMindDamage(t, 30, 290)), math.ceil(self:getTalentLevel(t)))
+		return ([[Spit slime at your target doing %0.1f nature damage and slowing it down by 30%% for 3 turns.
+		The slime can bounce from foe to foe, hitting up to a total of %d target(s).
+		Additional targets must be within 6 tiles of each other and the slime loses %0.1f%% damage per bounce.
+		The damage will increase with your Mindpower]]):format(damDesc(self, DamageType.NATURE, self:combatTalentMindDamage(t, 30, 250)), t.getTargetCount(self, t), 100-t.bouncePercent(self, t))
 	end,
 }
 
@@ -54,16 +57,16 @@ newTalent{
 	equilibrium = 2,
 	cooldown = 10,
 	range = 10,
-	tactical = { ATTACK = { NATURE = 3 } },
+	tactical = { ATTACKAREA = { NATURE = 2 }, DISABLE = 1 },
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1, 2.7)) end, -- yields 2 at tl=3
+	getDamage = function(self, t) return self:combatTalentMindDamage(t, 30, 500) end,
+	critPower = function(self, t) return self:combatTalentMindDamage(t, 10, 60) end,
 	requires_target = true,
 	action = function(self, t)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), friendlyfire=false}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-
-		local dam = self:mindCrit(self:combatTalentMindDamage(t, 40, 900))
-
+		local dam = self:mindCrit(t.getDamage(self, t), 0, t.critPower(self, t)/100)
 		self:project(tg, x, y, function(px, py)
 			local target = game.level.map(px, py, Map.ACTOR)
 			if target and self:reactionToward(target) < 0 and target:canBe("poison") then
@@ -79,7 +82,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Releases poisonous spores at an area of radius %d, infecting the foes inside with a random poison doing %0.2f nature damage over 10 turns.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.NATURE, self:combatTalentMindDamage(t, 40, 900)))
+		return ([[Releases poisonous spores at an area of radius %d, infecting the foes inside with a random poison doing %0.1f Nature damage over 10 turns.
+		This attack can crit and deals %d%% additional critical damage.
+		The damage and critical bonus increase with your Mindpower.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.NATURE, t.getDamage(self, t)), t.critPower(self, t))
 	end,
 }
 
@@ -96,9 +101,10 @@ newTalent{
 	requires_target = false,
 	tactical = { DEFEND = 1 },
 	getChance = function(self, t) return self:combatTalentLimit(t, 100, 7, 15) end, -- Limit < 100%
+	getDamage = function(self, t) return self:combatTalentMindDamage(t, 10, 50) end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/slime")
-		local power = 10 + 5 * self:getTalentLevel(t)
+		local power = t.getDamage(self, t)
 		return {
 			onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.ACID_DISARM]={dam=power, chance=t.getChance(self, t)}}),
 		}
@@ -108,7 +114,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Your skin drips with acid, damaging all that hit you for %0.2f acid damage and giving a %d%% chance to disarm them for 3 turns.]]):format(damDesc(self, DamageType.ACID, self:combatTalentMindDamage(t, 10, 50)), t.getChance(self, t))
+		return ([[Your skin drips with acid, damaging all that hit you for %0.1f Acid damage with a %d%% chance to disarm them for 3 turns.
+		The damage increases with your Mindpower.]]):format(damDesc(self, DamageType.ACID, t.getDamage(self, t)), t.getChance(self, t))
 	end,
 }
 
@@ -120,7 +127,7 @@ newTalent{
 	random_ego = "utility",
 	equilibrium = 5,
 	cooldown = 20,
-	tactical = { CLOSEIN = 2 },
+	tactical = { CLOSEIN = 2, ESCAPE = 1 },
 	requires_target = true,
 	range = function(self, t)
 		return math.floor(self:combatTalentScale(t,4.5,6.5))
@@ -143,13 +150,14 @@ newTalent{
 		if not x then return nil end
 		-- Target code does not restrict the self coordinates to the range, it lets the project function do it
 		-- but we cant ...
-		local _ _, x, y = self:canProject(tg, x, y)
-		game.level.map:particleEmitter(self.x, self.y, 1, "slime")
-		self:teleportRandom(x, y, self:getTalentRadius(t))
+		local _, x, y = self:canProject(tg, x, y)
+		if not x then return nil end
+		local oldx, oldy = self.x, self.y
+		if not self:teleportRandom(x, y, self:getTalentRadius(t)) then return nil end
+		game.level.map:particleEmitter(oldx, oldy, 1, "slime")
 		game.level.map:particleEmitter(self.x, self.y, 1, "slime")
 
 		local nb = t.getNbTalents(self, t)
-
 		local list = {}
 		for tid, cd in pairs(self.talents_cd) do 
 			local tt = self:getTalentFromId(tid)
diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua
index 144cf6115a4a4a080316b5f05fc09915c04605b4..d307ce92b463807867fc020f19346e1a12ad6fa7 100644
--- a/game/modules/tome/data/timed_effects/physical.lua
+++ b/game/modules/tome/data/timed_effects/physical.lua
@@ -2143,41 +2143,79 @@ newEffect{
 	type = "physical",
 	subtype = { mucus=true },
 	status = "beneficial",
-	parameters = { },
+	parameters = {},
 	on_gain = function(self, err) return nil, "+Mucus" end,
 	on_lose = function(self, err) return nil, "-Mucus" end,
 	on_timeout = function(self, eff)
-		self:callTalent(self.T_MUCUS, nil, self.x, self.y, self:getTalentLevel(self.T_MUCUS) >=4 and 1 or 0)
+		self:callTalent(self.T_MUCUS, nil, self.x, self.y, self:getTalentLevel(self.T_MUCUS) >=4 and 1 or 0, eff)
 	end,
 }
 
 newEffect{
 	name = "CORROSIVE_NATURE", image = "talents/corrosive_nature.png",
 	desc = "Corrosive Nature",
-	long_desc = function(self, eff) return ("Acid resistance decreased by %d%%."):format(eff.power) end,
+	long_desc = function(self, eff) return ("Acid damage increased by %d%%."):format(eff.power) end,
 	type = "physical",
 	subtype = { nature=true, acid=true },
-	status = "detrimental",
-	parameters = { power=10 },
-	on_gain = function(self, err) return "#Target# is vulnerable to acid.", "+Corrosive Nature" end,
-	on_lose = function(self, err) return "#Target# is less vulnerable to acid.", "-Corrosive Nature" end,
+	status = "beneficial",
+	parameters = { power=1, bonus_level=1},
+	charges = function(self, eff) return math.round(eff.power) end,
+	on_gain = function(self, err) return "#Target#'s acid damage is more potent.", "+Corrosive Nature" end,
+	on_lose = function(self, err) return "#Target#'s acid damage is no longer so potent.", "-Corrosive Nature" end,
+	on_merge = function(self, eff, new_eff)
+		if game.turn < eff.last_update + 10 then return eff end -- update once a turn
+		local t = self:getTalentFromId(self.T_CORROSIVE_NATURE)
+		eff.dur = t.getDuration(self, t)
+		if eff.bonus_level >=5 then return eff end
+		game.logSeen(self, "%s's corrosive nature intensifies!",self.name:capitalize())
+		eff.last_update = game.turn
+		eff.bonus_level = eff.bonus_level + 1
+		eff.power = t.getAcidDamage(self, t, eff.bonus_level)
+		self:removeTemporaryValue("inc_damage", eff.dam_id)
+		eff.dam_id = self:addTemporaryValue("inc_damage", {[DamageType.ACID]=eff.power})
+		return eff
+	end,
 	activate = function(self, eff)
-		self:effectTemporaryValue(eff, "resists", {[DamageType.ACID]=-eff.power})
+		eff.power = self:callTalent(self.T_CORROSIVE_NATURE, "getAcidDamage")
+		eff.dam_id = self:addTemporaryValue("inc_damage", {[DamageType.ACID]=eff.power})
+		eff.last_update = game.turn
+	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("inc_damage", eff.dam_id)
 	end,
 }
 
 newEffect{
 	name = "NATURAL_ACID", image = "talents/natural_acid.png",
 	desc = "Natural Acid",
-	long_desc = function(self, eff) return ("Nature resistance decreased by %d%%."):format(eff.power) end,
+	long_desc = function(self, eff) return ("Nature damage increased by %d%%."):format(eff.power) end,
 	type = "physical",
 	subtype = { nature=true, acid=true },
-	status = "detrimental",
-	parameters = { power=10 },
-	on_gain = function(self, err) return "#Target# is vulnerable to nature.", "+Natural Acid" end,
-	on_lose = function(self, err) return "#Target# is less vulnerable to nature.", "-Nature Acid" end,
+	status = "beneficial",
+	parameters = { power=1, bonus_level=1},
+	charges = function(self, eff) return math.round(eff.power) end,
+	on_gain = function(self, err) return "#Target#'s nature damage is more potent.", "+Natural Acid" end,
+	on_lose = function(self, err) return "#Target#'s nature damage is no longer so potent.", "-Nature Acid" end,
+	on_merge = function(self, eff, new_eff)
+		if game.turn < eff.last_update + 10 then return eff end -- update once a turn
+		local t = self:getTalentFromId(self.T_NATURAL_ACID)
+		eff.dur = t.getDuration(self, t)
+		if eff.bonus_level >=5 then return eff end
+		game.logSeen(self, "%s's natural acid becomes more concentrated!",self.name:capitalize())
+		eff.last_update = game.turn
+		eff.bonus_level = eff.bonus_level + 1
+		eff.power = t.getNatureDamage(self, t, eff.bonus_level)
+		self:removeTemporaryValue("inc_damage", eff.dam_id)
+		eff.dam_id = self:addTemporaryValue("inc_damage", {[DamageType.NATURE]=eff.power})
+		return eff
+	end,
 	activate = function(self, eff)
-		self:effectTemporaryValue(eff, "resists", {[DamageType.NATURE]=-eff.power})
+		eff.power = self:callTalent(self.T_NATURAL_ACID, "getNatureDamage")
+		eff.dam_id = self:addTemporaryValue("inc_damage", {[DamageType.NATURE]=eff.power})
+		eff.last_update = game.turn
+	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("inc_damage", eff.dam_id)
 	end,
 }
 
@@ -2235,3 +2273,18 @@ newEffect{
 		self:removeTemporaryValue("resists", eff.tmpid)
 	end,
 }
+
+newEffect{
+	name = "NATURE_REPLENISHMENT", image = "talents/meditation.png",
+	desc = "Natural Replenishment",
+	long_desc = function(self, eff) return ("The target has been directly exposed to arcane energies and has responded by reasserting it's connection to nature, restoring %0.1f Equilibrium per turn."):format(eff.power) end,
+	type = "physical",
+	subtype = { nature=true },
+	status = "beneficial",
+	parameters = {power=1},
+	on_gain = function(self, err) return ("#Target# defiantly reasserts %s connection to nature!"):format(string.his_her(self)), "+Nature Replenishment" end,
+	on_lose = function(self, err) return "#Target# stops restoring Equilibrium.", "-Nature Replenishment" end,
+	on_timeout = function(self, eff)
+		self:incEquilibrium(-eff.power)
+	end,
+}