diff --git a/game/modules/tome/class/interface/DescHelper.lua b/game/modules/tome/class/interface/DescHelper.lua
new file mode 100644
index 0000000000000000000000000000000000000000..67bf388fb0934aa0946106b76b8e0d02f0ff92ce
--- /dev/null
+++ b/game/modules/tome/class/interface/DescHelper.lua
@@ -0,0 +1,110 @@
+-- TE4 - T-Engine 4
+-- Copyright (C) 2009 - 2019 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
+
+require "engine.class"
+require "bit"
+
+--- Provide some helper functions for description
+-- @classmod engine.generator.interface.ActorTalentsDescHelper
+module(..., package.seeall, class.make)
+local acc, def, pp, sp, mp, ps, ss, ms = _t"Accuracy", _t"Defense", _t"Physical Power", _t"Spellpower", _t"Mindpower", _t"Physical Save", _t"Spell Save", _t"Mental Save"
+
+_M.power_save_simple_pairs = {
+    ap = { acc, ps },
+    as = { acc, ss },
+    am = { acc, ms },
+    pp = { pp, ps },
+    ps = { pp, ss },
+    pm = { pp, ms },
+    sp = { sp, ps },
+    ss = { sp, ss },
+    sm = { sp, ms },
+    mp = { mp, ps },
+    ms = { mp, ss },
+    mm = { mp, ms },
+}
+_M.powers_saves = {
+    a = acc,
+    acc = acc,
+    atk = acc,
+    attack = acc,
+    accuracy = acc,
+    pp = pp,
+    physicalpower = pp,
+    sp = sp,
+    spellpower = sp,
+    mp = mp,
+    mindpower = mp,
+    d = def,
+    def = def,
+    defense = def,
+    ps = ps,
+    physicalsave = ps,
+    ss = ss,
+    spellsave = ss,
+    ms = ms,
+    mindsave = ms,
+}
+_M.powers = {
+    p = pp,
+    s = sp,
+    m = mp,
+}
+_M.saves = {
+    p = ps,
+    s = ss,
+    m = ms,
+}
+
+_M.concat = function(...)
+    local arg = { ... }
+    local transformed = {}
+    for _, v in ipairs(arg) do
+        transformed[#transformed + 1] = _M.powers_saves[v] or _t(tostring(v))
+    end
+    return transformed
+end
+_M.max = _M.concat
+
+-- possible input:
+-- 1. power: "pp", "ps", etc; save: nil   stored in power_save_simple_pairs
+-- 2. power: string/table; save: string/table
+--      string: search in _M.powers/saves/powers_saves and replace with proper desc
+--      tables: simply concat them with "/"
+_M.vs = function(power, save)
+    if not save and _M.power_save_simple_pairs[power] then
+        local pair = _M.power_save_simple_pairs[power]
+        return string.tformat("(%s vs %s)", pair[1], pair[2])
+    end
+    if type(power) == "table" then
+        power = table.concat(power, "/")
+    else
+        power = _M.powers[power] or _M.powers_saves[power] or power
+    end
+    if type(save) == "table" then
+        save = table.concat(save, "/")
+    else
+        save = _M.saves[save] or _M.powers_saves[save] or save
+    end
+    if power and save then
+        return string.tformat("(%s vs %s)", power, save)
+    else
+        return _t"(Bypass Saves)"
+    end
+end
\ No newline at end of file
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index f4f30464dae10c951cad1030e573692770c13a56..57bfa61ceaca4e3a46f7c0012d9327a2d513ef9a 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -1007,6 +1007,7 @@ newDamageType{
 }
 
 -- Temporal + Stun
+-- Deprecated
 newDamageType{
 	name = _t("temporal stun", "damage type"), type = "TEMPORALSTUN",
 	projector = function(src, x, y, type, dam, state)
@@ -1063,7 +1064,7 @@ newDamageType{
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
 			if target:canBe("silence") then
-				target:setEffect(target.EFF_SILENCED, math.ceil(dam.dur), {apply_power=dam.power_check or src:combatMindpower() * 0.7})
+				target:setEffect(target.EFF_SILENCED, math.ceil(dam.dur), {apply_power=dam.power_check or src:combatMindpower()})
 			else
 				game.logSeen(target, "%s resists the silence!", target:getName():capitalize())
 			end
@@ -1102,7 +1103,7 @@ newDamageType{
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and rng.percent(dam) then
 			if target:canBe("silence") then
-				target:setEffect(target.EFF_SILENCED, 4, {apply_power=src:combatAttack()*0.7, no_ct_effect=true})
+				target:setEffect(target.EFF_SILENCED, 4, {apply_power=src:combatAttack(), no_ct_effect=true})
 			else
 				game.logSeen(target, "%s resists the silence!", target:getName():capitalize())
 			end
@@ -1126,6 +1127,8 @@ newDamageType{
 		end
 	end,
 }
+
+-- Deprecated
 newDamageType{
 	name = _t("blindness", "damage type"), type = "BLINDPHYSICAL",
 	projector = function(src, x, y, type, dam, state)
@@ -1360,23 +1363,49 @@ newDamageType{
 		useImplicitCrit(src, state)
 		local chance = 25
 		local do_wet = false
-		if _G.type(dam) == "table" then chance, dam, do_wet = dam.chance, dam.dam, dam.do_wet end
+		local apply_power
+		if _G.type(dam) == "table" then chance, dam, do_wet, apply_power = dam.chance, dam.dam, dam.do_wet, dam.apply_power end
 
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and target:hasEffect(target.EFF_WET) then dam = dam * 1.3 chance = 50 end
 
 		local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam, state)
 		if rng.percent(chance) then
-			DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5}, state)
+			DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5, apply_power=apply_power}, state)
 		end
 		if target and do_wet and not target:hasEffect(target.EFF_FROZEN) then
-			target:setEffect(target.EFF_WET, 3, {apply_power=math.max(src:combatSpellpower(), src:combatMindpower()), min_dur=1})
+			target:setEffect(target.EFF_WET, 3, {apply_power=apply_power or math.max(src:combatSpellpower(), src:combatMindpower()), min_dur=1})
 		end
 		return realdam
 	end,
 }
 
+-- Cold damage + freeze chance
+newDamageType{
+	name = _t("ice", "damage type"), type = "ICE_MIND", text_color = "#1133F3#",
+	projector = function(src, x, y, type, dam, state)
+		state = initState(state)
+		useImplicitCrit(src, state)
+		local chance = 25
+		local do_wet = false
+		local apply_power
+		if _G.type(dam) == "table" then chance, dam, do_wet, apply_power = dam.chance, dam.dam, dam.do_wet, dam.apply_power end
+
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target and target:hasEffect(target.EFF_WET) then dam = dam * 1.3 chance = 50 end
+
+		local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam, state)
+		if rng.percent(chance) then
+			DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5, apply_power=apply_power or src:combatMindpower()}, state)
+		end
+		if target and do_wet and not target:hasEffect(target.EFF_FROZEN) then
+			target:setEffect(target.EFF_WET, 3, {apply_power=apply_power or src:combatMindpower(), min_dur=1})
+		end
+		return realdam
+	end,
+}
 -- Cold damage + freeze chance + 20% slow
+-- Deprecated
 newDamageType{
 	name = _t("slowing ice", "damage type"), type = "ICE_SLOW", text_color = "#1133F3#",
 	projector = function(src, x, y, type, dam, state)
@@ -1407,9 +1436,10 @@ newDamageType{
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and target:hasEffect(target.EFF_WET) then dam = dam * 1.3 chance = 50 end
 
-		local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam, state)
+		dam = _G.type(dam) == "number" and {dam=dam} or dam
+		local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam.dam, state)
 		if rng.percent(chance) then
-			DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5}, state)
+			DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam.dam*1.5, apply_power=dam.apply_power}, state)
 		end
 		return realdam
 	end,
@@ -1424,9 +1454,10 @@ newDamageType{
 		local chance = 0
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and target:hasEffect(target.EFF_WET) then dam = dam * 1.3 chance = 15 end
-		local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam, state)
+		dam = _G.type(dam) == "number" and {dam=dam} or dam
+		local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam.dam, state)
 		if rng.percent(chance) then
-			DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.2}, state)
+			DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam.dam*1.2, apply_power=dam.apply_power}, state)
 		end
 		return realdam
 	end,
@@ -1442,9 +1473,8 @@ newDamageType{
 		DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam.dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
-			local apply = dam.apply_power
 			if target:attr("negative_status_effect_immune_frozen") or (target:canBe("pin") and not target:attr("fly") and not target:attr("levitation")) then
-				target:setEffect(target.EFF_FROZEN_FEET, dam.dur, {apply_power=dam.apply_power})
+				target:setEffect(target.EFF_FROZEN_FEET, dam.dur, {apply_power=dam.apply_power or (src.combatSpellpower and math.max(src:combatSpellpower(), src:combatMindpower()))})
 			end
 
 			if dam.shatter_reduce and target:hasEffect(target.EFF_WET) then
@@ -1465,7 +1495,7 @@ newDamageType{
 			-- Freeze it, if we pass the test
 			local sx, sy = game.level.map:getTileToScreen(x, y, true)
 			if target:canBe("stun") then
-				target:setEffect(target.EFF_FROZEN, dam.dur, {hp=dam.hp * 1.5, apply_power=math.max(src:combatSpellpower(), src:combatMindpower()), min_dur=1})
+				target:setEffect(target.EFF_FROZEN, dam.dur, {hp=dam.hp * 1.5, apply_power=dam.apply_power or math.max(src:combatSpellpower(), src:combatMindpower()), min_dur=1})
 				game.flyers:add(sx, sy, 30, (rng.range(0,2)-1) * 0.5, -3, _t"Frozen!", {0,255,155})
 			else
 				game.flyers:add(sx, sy, 30, (rng.range(0,2)-1) * 0.5, -3, _t"Resist!", {0,255,155})
@@ -1682,6 +1712,7 @@ newDamageType{
 }
 
 -- Darkness damage + repulsion; checks for spell power against mental resistance
+-- Deprecated
 newDamageType{
 	name = _t("darkness repulsion", "damage type"), type = "DARKKNOCKBACK",
 	projector = function(src, x, y, type, dam, state)
@@ -1740,7 +1771,7 @@ newDamageType{
 		if target and not state[target] then
 			state[target] = true
 			DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam, state)
-			if target:checkHit(src:combatMindpower() * 0.8, target:combatPhysicalResist(), 0, 95, 15) and target:canBe("knockback") then
+			if target:checkHit(src:combatMindpower(), target:combatPhysicalResist(), 0, 95, 15) and target:canBe("knockback") then
 				target:knockback(src.x, src.y, 3)
 				target:crossTierEffect(target.EFF_OFFBALANCE, src:combatMindpower())
 				game.logSeen(target, "%s is knocked back!", target:getName():capitalize())
@@ -1803,7 +1834,7 @@ newDamageType{
 		state = initState(state)
 		useImplicitCrit(src, state)
 		local power
-		if type(dam) == "table" then
+		if _G.type(dam) == "table" then
 			power = dam.apply_power
 			dam = dam.dam
 		end
@@ -2482,6 +2513,7 @@ newDamageType{
 }
 
 -- Physical + Blind
+-- Deprecated
 newDamageType{
 	name = _t("blinding physical", "damage type"), type = "SAND",
 	projector = function(src, x, y, type, dam, state)
@@ -2878,7 +2910,7 @@ newDamageType{
 		if target then
 			if target:isTalentActive(target.T_GRAVITY_LOCUS) then return end
 			if dam.slow then
-				target:setEffect(target.EFF_SLOW, dam.dur, {power=dam.slow, apply_power=apply, no_ct_effect=true})
+				target:setEffect(target.EFF_SLOW, dam.dur, {power=dam.slow, apply_power=dam.apply, no_ct_effect=true})
 			end
 		end
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam, state)
@@ -3181,6 +3213,7 @@ newDamageType{
 	end,
 }
 
+-- Deprecated
 newDamageType{
 	name = _t("stop", "damage type"), type = "STOP",
 	projector = function(src, x, y, type, dam, state)
@@ -3197,6 +3230,7 @@ newDamageType{
 	end,
 }
 
+-- Deprecated
 newDamageType{
 	name = _t("debilitating temporal", "damage type"), type = "RETHREAD",
 	projector = function(src, x, y, type, dam, state)
@@ -3365,6 +3399,7 @@ newDamageType{
 }
 
 -- Darkness damage + speed reduction + minion damage inc
+-- Deprecated
 newDamageType{
 	name = _t("decaying darkness", "damage type"), type = "RIGOR_MORTIS",
 	projector = function(src, x, y, type, dam, state)
@@ -3819,6 +3854,7 @@ newDamageType{
 	end,
 }
 
+-- Deprecated
 newDamageType{
 	name = _t("telekinetic shove", "damage type"), type = "TK_PUSHPIN",
 	projector = function(src, x, y, type, dam, state)
diff --git a/game/modules/tome/data/talents.lua b/game/modules/tome/data/talents.lua
index 815d31cb6c044b62ddfe51756c8925cda434ae0f..5ce7c1b533cb9be149c46bcf5411bf2517cb4689 100644
--- a/game/modules/tome/data/talents.lua
+++ b/game/modules/tome/data/talents.lua
@@ -21,6 +21,7 @@ local tacticals = {}
 local Entity = require "engine.Entity"
 local Tiles = require "engine.Tiles"
 local Astar = require "engine.Astar"
+Desc = require("mod.class.interface.DescHelper")
 
 ---convert TACTIC labels in talent tactical tables to lower case
 function Talents.aiLowerTacticals(tactical)
@@ -152,9 +153,9 @@ Talents.is_a_type = {
 }
 
 Talents.damDesc = damDesc
+Talents.Desc = Desc
 Talents.main_env = getfenv(1)
 Talents.ai_tactics_list = tacticals
-
 -- Summoning AI helper functions
 
 --- Generate targeting parameters for summoning talents
diff --git a/game/modules/tome/data/talents/celestial/circles.lua b/game/modules/tome/data/talents/celestial/circles.lua
index 19086326e5113790969b7bbec8d0a0b643bc2ad4..69cd82490d3f926e0080cf32a20c37de5791b7ab 100644
--- a/game/modules/tome/data/talents/celestial/circles.lua
+++ b/game/modules/tome/data/talents/celestial/circles.lua
@@ -125,8 +125,8 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
 		local damage = t.getDamage(self, t)
-		return ([[Creates a circle of radius %d at your feet; the circle protects you from silence effects while you remain in its radius while silencing and dealing %d light damage to everyone else who enters. The circle lasts %d turns.]]):
-		tformat(radius, damDesc(self, DamageType.LIGHT, damage), duration)
+		return ([[Creates a circle of radius %d at your feet; the circle protects you from silence effects while you remain in its radius while silencing %s and dealing %d light damage to everyone else who enters. The circle lasts %d turns.]]):
+		tformat(radius, Desc.vs"sm", damDesc(self, DamageType.LIGHT, damage), duration)
 	end,
 }
 
@@ -165,9 +165,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Creates a circle of radius %d at your feet; the circle slows incoming projectiles by %d%% and attempts to push all creatures other than yourself out of its radius, inflicting %0.2f light damage and %0.2f darkness damage per turn as it does so.  The circle lasts %d turns.
+		return ([[Creates a circle of radius %d at your feet; the circle slows incoming projectiles by %d%% and attempts to push all creatures other than yourself out of its radius %s, inflicting %0.2f light damage and %0.2f darkness damage per turn as it does so.  The circle lasts %d turns.
 		The effects will increase with your Spellpower.]]):
-		tformat(radius, damage*5, (damDesc (self, DamageType.LIGHT, damage)), (damDesc (self, DamageType.DARKNESS, damage)), duration)
+		tformat(radius, damage*5, Desc.vs"sp", (damDesc (self, DamageType.LIGHT, damage)), (damDesc (self, DamageType.DARKNESS, damage)), duration)
 	end,
 }
 
@@ -208,10 +208,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Conjure a surge of celestial power through your circles. Any foe standing within one of your circles will be slowed by %d%% for %d turns and take %d light and %d darkness damage.
+		return ([[Conjure a surge of celestial power through your circles. Any foe standing within one of your circles will be slowed %s by %d%% for %d turns and take %d light and %d darkness damage.
 		Residual power from the surge will emanate from your circles for %d turns; each circle you stand in will increase your celestial resources.
 		Shifting Shadows: +1 negative.
 		Sanctity: +1 postive.
-		Warding: +0.5 postive and negative.]]):tformat(t.getSlow(self, t), t.getSlowDur(self, t), damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getDuration(self, t))
+		Warding: +0.5 postive and negative.]]):tformat(Desc.vs(), t.getSlow(self, t), t.getSlowDur(self, t), damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getDuration(self, t))
 	end,
 }
diff --git a/game/modules/tome/data/talents/celestial/combat.lua b/game/modules/tome/data/talents/celestial/combat.lua
index 8d1e4b226eef4b188e5b48c19c7288db1b8250bc..8d77570fc484c41b3e5559a9fda693c140c40a1f 100644
--- a/game/modules/tome/data/talents/celestial/combat.lua
+++ b/game/modules/tome/data/talents/celestial/combat.lua
@@ -214,9 +214,9 @@ newTalent{
 		local damagepct = t.getLifeDamage(self, t)
 		local damage = t.getDamage(self, t)
 		return ([[Your weapon attacks burn with righteous fury, dealing %d%% of your lost HP as additional Fire damage (up to %d, Current:  %d).
-		Targets struck are also afflicted with a Martyrdom effect that causes them to take %d%% of all damage they deal for 4 turns.
+		Targets struck are also afflicted with a Martyrdom effect %s that causes them to take %d%% of all damage they deal for 4 turns.
 		The bonus damage can only occur once per turn.]]):
-		tformat(damagepct*100, t.getMaxDamage(self, t, 10, 400), damage, martyr)
+		tformat(damagepct*100, t.getMaxDamage(self, t, 10, 400), damage, Desc.vs(), martyr)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/celestial/crusader.lua b/game/modules/tome/data/talents/celestial/crusader.lua
index 50fa4d09be4165ca4e60de928f8c01c83ea5d2ef..d4563b0b99532d1a7b968cc3d5181b378262f7e1 100644
--- a/game/modules/tome/data/talents/celestial/crusader.lua
+++ b/game/modules/tome/data/talents/celestial/crusader.lua
@@ -57,8 +57,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		return ([[You strike your foe with your two handed weapon, dealing %d%% weapon damage.
-		If the attack hits, all foes in radius 2 will have their light resistance reduced by %d%% and their damage reduced by %d%% for 5 turns.]]):
-		tformat(100 * damage, t.getWeakness(self, t), t.getNumb(self, t))
+		If the attack hits, all foes in radius 2 will have their light resistance reduced by %d%% and their damage reduced by %d%% for 5 turns. %s]]):
+		tformat(100 * damage, t.getWeakness(self, t), t.getNumb(self, t), Desc.vs())
 	end,
 }
 
@@ -86,8 +86,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You mark a target with light for 3 turns, causing all melee hits you deal to it to heal you for %d%% of the damage done.]]):
-		tformat(t.getPower(self, t))
+		return ([[You mark a target with light for 3 turns, causing all melee hits you deal to it to heal you for %d%% of the damage done %s.]]):
+		tformat(t.getPower(self, t), Desc.vs())
 	end,
 }
 
@@ -121,9 +121,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[While wielding a two handed weapon, your critical strike chance is increased by %d%%, and your melee criticals instill you with righteous strength, increasing all physical and light damage you deal by %d%%, stacking up to 3 times.
-		In addition, your melee critical strikes leave a lasting lightburn on the target, dealing %0.2f light damage over 5 turns and reducing opponents armour by %d.
+		In addition, your melee critical strikes leave a lasting lightburn on the target, dealing %0.2f light damage over 5 turns and reducing opponents armour by %d. %s
 		The damage increases with your Spellpower.]]):
-		tformat(t.getCrit(self, t), t.getPower(self, t), damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getArmor(self, t))
+		tformat(t.getCrit(self, t), t.getPower(self, t), damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getArmor(self, t), Desc.vs"ss")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/celestial/dark-sun.lua b/game/modules/tome/data/talents/celestial/dark-sun.lua
index 76086732a2e9a82e635095798ef6255cc3f50622..58fa80bc73a32ac9ff0cecbf44a0ce390bdf4e70 100644
--- a/game/modules/tome/data/talents/celestial/dark-sun.lua
+++ b/game/modules/tome/data/talents/celestial/dark-sun.lua
@@ -125,11 +125,10 @@ newTalent{
 		local rad = t.getMaxRadius(self,t)
 		local dam = t.getDamage(self,t)/2
 		local dur = t.getDuration(self,t)
-		local entropy = 0
 		return ([[Open a radius 1 rift in spacetime at the targeted location for %d turns, increasing in radius by 1 each turn to a maximum of %d.
-		All caught within the rift are pulled towards the center and take %0.2f gravity damage.
+		All caught within the rift are pulled towards the center and take %0.2f gravity damage. %s
 The damage will increase with your Spellpower.]]):
-		tformat(dur, rad, damDesc(self, DamageType.PHYSICAL, dam))
+		tformat(dur, rad, damDesc(self, DamageType.PHYSICAL, dam), Desc.vs"pp")
 	end,
 }
 
@@ -184,7 +183,7 @@ newTalent{
 	info = function(self, t)
 		local conv = t.getConversion(self, t)
 		local proj = t.getSlow(self, t)
-		return ([[Create a gravity field around you that converts %d%% of all damage you deal into physical damage, slows incoming projectiles by %d%%, and causes your gravity damage to reduce the target's knockback resistance by half for two turns.]]):tformat(conv, proj)
+		return ([[Create a gravity field around you that converts %d%% of all damage you deal into physical damage, slows incoming projectiles by %d%%, and causes your gravity damage to reduce the target's knockback resistance by half for two turns %s.]]):tformat(conv, proj, Desc.vs())
 	end,
 }
 
@@ -238,10 +237,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Infuse your weapon with overwhelming gravitational power while spinning around.
-							All creatures within radius 2 take %d%% weapon damage as physical (gravity) and are pulled closer.
+							All creatures within radius 2 take %d%% weapon damage as physical (gravity) and are pulled closer %s.
 							Then, all adjacent creatures take %d%% weapon damage.  This second strike shields you for between %d and %d, increasing with more enemies hit.  The shield lasts for 2 turns.
 The shield strength will increase with your Spellpower.]]):
-		tformat(t.getOuterDamage(self, t) * 100,
+		tformat(t.getOuterDamage(self, t) * 100, Desc.vs"pp",
 					 t.getInnerDamage(self, t) * 100,
 					 t.getShield(self, t), t.getShield(self, t)*2)
 	end,
diff --git a/game/modules/tome/data/talents/celestial/darkside.lua b/game/modules/tome/data/talents/celestial/darkside.lua
index 3f54f6d791e6e4f775c1a05c42bfb1bca13d544e..2e8813927ca6a85401eb622b8e79f42f3e56b7be 100644
--- a/game/modules/tome/data/talents/celestial/darkside.lua
+++ b/game/modules/tome/data/talents/celestial/darkside.lua
@@ -52,11 +52,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target is stunned for %d turns and has their bleed resistance reduced by 50%%.
-The stun chance increases with your Physical Power.
+		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target is stunned for %d turns and has their bleed resistance reduced by 50%%. %s
 
 #{italic}#It may not bleed, exactly, but you'll make it hurt.#{normal}#]])
-		:tformat(100 * damage, t.getDuration(self, t))
+		:tformat(100 * damage, t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
@@ -172,10 +171,10 @@ newTalent{
 		local damage = t.getDamage(self, t)*100
 		local mult = t.getMult(self, t)
 		return ([[Put all of your physical and magical might into one devastating attack.
-Strike all adjacent enemies for %d%% weapon damage and daze them (using your highest power) for 3 turns.
+Strike all adjacent enemies for %d%% weapon damage and daze them for 3 turns %s.
 
 Using this talent consumes all of your Positive Energy and prevents you from generating positive energy for 5 turns.
 Every point of positive energy increases the damage by %.2f%%.
-Every %d points of positive energy increase the radius by 1 (up to 10).]]):tformat(damage, mult, t.getRadiusScale(self, t))
+Every %d points of positive energy increase the radius by 1 (up to 10).]]):tformat(damage, Desc.vs(Desc.max("pp", "sp", "mp"), "ps"), mult, t.getRadiusScale(self, t))
 	end,
 }
diff --git a/game/modules/tome/data/talents/celestial/eclipse.lua b/game/modules/tome/data/talents/celestial/eclipse.lua
index 4dc309f5c41acb55bff7358c33dda6d9dce4eec7..e892fd7524633562a772dacfa38b6bb44216ef7c 100644
--- a/game/modules/tome/data/talents/celestial/eclipse.lua
+++ b/game/modules/tome/data/talents/celestial/eclipse.lua
@@ -169,6 +169,6 @@ newTalent{
 		local dotDam = t.getDotDamage(self, t)
 		local conversion = t.getConversion(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Shroud foes within radius %d in darkest light, dealing %0.2f light and %0.2f darkness damage per turn and converting %d%% of the damage they deal between light and darkness for %d turns.]]):tformat(radius, damDesc(self, DamageType.LIGHT, dotDam), damDesc(self, DamageType.DARKNESS, dotDam), conversion*100, duration)
+		return ([[Shroud foes within radius %d in darkest light, dealing %0.2f light and %0.2f darkness damage per turn and converting %d%% of the damage they deal between light and darkness for %d turns. %s]]):tformat(radius, damDesc(self, DamageType.LIGHT, dotDam), damDesc(self, DamageType.DARKNESS, dotDam), conversion*100, duration, Desc.vs())
 	end,
 }
diff --git a/game/modules/tome/data/talents/celestial/glyphs.lua b/game/modules/tome/data/talents/celestial/glyphs.lua
index 13bb84ae33c4dba4c18f258d700348ee2941cd53..fa6d43e414fd3d3704e0e138d0cd89f01b7251f2 100644
--- a/game/modules/tome/data/talents/celestial/glyphs.lua
+++ b/game/modules/tome/data/talents/celestial/glyphs.lua
@@ -349,12 +349,12 @@ end
 
 		Available glyphs are:
 		#ffd700#Glyph of Sunlight#LAST#:  Bind sunlight into a glyph. When triggered it will release a brilliant light, dealing %0.2f light damage and healing you for %d.
-		#7f7f7f#Glyph of Moonlight#LAST#:  Bind moonlight into a glyph. When triggered it will release a fatiguing darkness,  dealing %0.2f darkness damage and reducing the foes damage dealt by %d%% for %d turns.
-		#9D9DC9#Glyph of Twilight#LAST#:  Bind twilight into a glyph. When triggered it will release a burst of twilight, dealing %0.2f light and %0.2f darkness damage and knocking the foe back %d tiles.
+		#7f7f7f#Glyph of Moonlight#LAST#:  Bind moonlight into a glyph. When triggered it will release a fatiguing darkness,  dealing %0.2f darkness damage and reducing the foes damage dealt by %d%% for %d turns. %s
+		#9D9DC9#Glyph of Twilight#LAST#:  Bind twilight into a glyph. When triggered it will release a burst of twilight, dealing %0.2f light and %0.2f darkness damage and knocking the foe back %d tiles. %s
 		]]):tformat(self:getTalentRange(t), t.getDuration(self, t), t.getGlyphCD(self, t),
 			damDesc(self, DamageType.LIGHT, dam), heal,
-			damDesc(self, DamageType.DARKNESS, dam), numb, numbDur,
-			damDesc(self, DamageType.LIGHT, dam/2), damDesc(self, DamageType.DARKNESS, dam/2), dist)
+			damDesc(self, DamageType.DARKNESS, dam), numb, numbDur, Desc.vs(),
+			damDesc(self, DamageType.LIGHT, dam/2), damDesc(self, DamageType.DARKNESS, dam/2), dist, Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/celestial/hymns.lua b/game/modules/tome/data/talents/celestial/hymns.lua
index 17a6845d94740fd9ea9267fb1573afd25ff02a70..3b095f16a42fb261a237312fa109e83e6d7f81b9 100644
--- a/game/modules/tome/data/talents/celestial/hymns.lua
+++ b/game/modules/tome/data/talents/celestial/hymns.lua
@@ -522,8 +522,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Your passion for singing the praises of the Moons reaches its zenith.
-		Your Hymns now fire shadowy beams that will hit up to %d of your foes within radius 5 for %0.2f damage, with a 25%% chance of blinding.
+		Your Hymns now fire shadowy beams that will hit up to %d of your foes within radius 5 for %0.2f damage, with a 25%% chance of blinding %s.
 		This powerful effect will drain %0.1f negative energy each time it fires at at least 1 target; no beam will fire if your negative energy is too low.
-		These values scale with your Spellpower.]]):tformat(t.getTargetCount(self, t), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getNegativeDrain(self, t))
+		These values scale with your Spellpower.]]):tformat(t.getTargetCount(self, t), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), Desc.vs"sp", t.getNegativeDrain(self, t))
 	end,
 }
diff --git a/game/modules/tome/data/talents/celestial/radiance.lua b/game/modules/tome/data/talents/celestial/radiance.lua
index 6ccc1a32e85a9f9f2f800d8c809a2cc87917433a..10c88c06eb7bfcb5ecbc32e93d17fba8fb0fdcaa 100644
--- a/game/modules/tome/data/talents/celestial/radiance.lua
+++ b/game/modules/tome/data/talents/celestial/radiance.lua
@@ -97,8 +97,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Fire a glowing orb of light at each enemy within your Radiance.  Each orb will slowly follow its target until it connects, dealing %d light damage to anything else it contacts along the way.  When the target is reached the orb will explode dealing %d light damage in radius 1 and healing you for 50%% of the damage dealt.
-		All targets struck by your Judgement will be blighted by light, reducing saves by %d, reducing critical power by %d%%, and causing light damage received to splash in radius 2 for %d%% damage against all hostile targets for 4 turns.]]):
-		tformat(t.getMoveDamage(self, t), t.getExplosionDamage(self, t), t.getSavePen(self,t), t.getCritPen(self,t), t.getSplashPct(self,t))
+		All targets struck by your Judgement will be blighted by light, reducing saves by %d, reducing critical power by %d%%, and causing light damage received to splash in radius 2 for %d%% damage against all hostile targets for 4 turns %s.]]):
+		tformat(t.getMoveDamage(self, t), t.getExplosionDamage(self, t), t.getSavePen(self,t), t.getCritPen(self,t), t.getSplashPct(self,t), Desc.vs"ss")
 	end,
 }
 
@@ -156,9 +156,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Your Radiance is so powerful it burns all foes caught in it, dealing %0.1f light damage to all foes caught inside every turn.
-		Each enemy effected has a %d%% chance of being dazed and blinded by the light for 3 turns. The daze and blind can be applied to each enemy at most once every 7 turns.
+		Each enemy effected has a %d%% chance of being dazed and blinded by the light for 3 turns %s. The daze and blind can be applied to each enemy at most once every 7 turns.
 		The damage increases with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getDaze(self, t))
+		tformat(damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getDaze(self, t), Desc.vs"sp")
 	end,
 }
 
@@ -178,10 +178,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[The light of your Radiance allows you to see that which would normally be unseen and strike that which would normally be protected.
-		All enemies in your Radiance aura have their invisibility and stealth power reduced by %d; all actors affected by illumination have their defense reduced by %d as well as all evasion bonuses from being unseen negated.
+		All enemies in your Radiance aura have their invisibility and stealth power reduced by %d; all actors affected by illumination have their defense reduced by %d as well as all evasion bonuses from being unseen negated. %s
 		In addition, your light damage is increased by %d%% and your strikes ignore %d%% of the light resistance of your targets.
 		The invisibility, stealth power, and defense reductions increase with your Spellpower.]]):
-		tformat(t.getPower(self, t), t.getDef(self, t), t.getLightDamageIncrease(self, t), t.getResPen(self, t))
+		tformat(t.getPower(self, t), t.getDef(self, t), Desc.vs(), t.getLightDamageIncrease(self, t), t.getResPen(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/celestial/star-fury.lua b/game/modules/tome/data/talents/celestial/star-fury.lua
index bd5c8f3cda578127651b9a0e23f18afae464c940..f9074f81715a5ab7880771873ea33e64e1645f02 100644
--- a/game/modules/tome/data/talents/celestial/star-fury.lua
+++ b/game/modules/tome/data/talents/celestial/star-fury.lua
@@ -173,8 +173,8 @@ newTalent{
 	info = function(self, t)
 		local radius = self:getTalentRadius(t)
 		local damage = t.getDamage(self, t)
-		return ([[A star falls on a radius %d area, doing %0.2f darkness damage on impact and stunning all within the area for 4 turns.
+		return ([[A star falls on a radius %d area, doing %0.2f darkness damage on impact and stunning all within the area for 4 turns %s.
 		The damage dealt will increase with your Spellpower.]]):
-		tformat(radius, damDesc(self, DamageType.DARKNESS, damage))
+		tformat(radius, damDesc(self, DamageType.DARKNESS, damage), Desc.vs"sp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/celestial/sun.lua b/game/modules/tome/data/talents/celestial/sun.lua
index d9cab253192a471f97100221ea7386772a476cde..89a73b60402b37a578e89aa8a23fb9da8623598f 100644
--- a/game/modules/tome/data/talents/celestial/sun.lua
+++ b/game/modules/tome/data/talents/celestial/sun.lua
@@ -81,9 +81,9 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		return ([[Calls forth a ray of light from the Sun, doing %0.1f Light damage to the target.
-		At level 3 the ray will be so intense it will also blind the target and everyone in a radius 2 around it for %d turns.
+		At level 3 the ray will be so intense it will also blind the target and everyone in a radius 2 around it for %d turns. %s
 		The damage dealt will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.LIGHT, damage), t.getDuration(self, t))
+		tformat(damDesc(self, DamageType.LIGHT, damage), t.getDuration(self, t), Desc.vs"sp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/celestial/sunlight.lua b/game/modules/tome/data/talents/celestial/sunlight.lua
index de45da723e108fd97e0647f2d66545913fd95548..480201011e3465b67f7c8c7ead176275f7b6fe31 100644
--- a/game/modules/tome/data/talents/celestial/sunlight.lua
+++ b/game/modules/tome/data/talents/celestial/sunlight.lua
@@ -110,11 +110,11 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local res = t.getRes(self, t)
 		local resdur = t.getResDuration(self, t)
-		return ([[Invokes the Sun to cause a flare within radius %d, blinding your foes for %d turns and lighting up the area.
+		return ([[Invokes the Sun to cause a flare within radius %d, blinding your foes for %d turns %s and lighting up the area.
 		All enemies effected will take %0.2f light damage.
 		At talent level 3 you gain %d%% light, darkness, and fire resistance for %d turns.
 		The damage done and resistances will increase with your Spellpower.]]):
-		tformat(radius, duration, damDesc(self, DamageType.LIGHT, damage), res, resdur )
+		tformat(radius, duration, Desc.vs"sp" , damDesc(self, DamageType.LIGHT, damage), res, resdur )
    end,
 }
 
diff --git a/game/modules/tome/data/talents/celestial/twilight.lua b/game/modules/tome/data/talents/celestial/twilight.lua
index 4a12b5425be2b82d4b93f07cf56d5b4a5275715d..aeda08e1fd798ecc04afd31d2fdee1f4e40e7b6d 100644
--- a/game/modules/tome/data/talents/celestial/twilight.lua
+++ b/game/modules/tome/data/talents/celestial/twilight.lua
@@ -182,9 +182,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local duration = t.getConfuseDuration(self, t)
-		return ([[Let out a mental cry that shatters the will of your targets within radius %d, dealing %0.2f darkness damage and confusing (%d%% to act randomly) them for %d turns.
+		return ([[Let out a mental cry that shatters the will of your targets within radius %d, dealing %0.2f darkness damage and confusing (%d%% to act randomly) them for %d turns %s.
 		The damage will improve with your spellpower and the duration will improve with your Cunning.]]):
-		tformat(self:getTalentRadius(t), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getConfuseEfficency(self,t), duration)
+		tformat(self:getTalentRadius(t), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getConfuseEfficency(self,t), duration, Desc.vs"sm")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/chronomancy/age-manipulation.lua b/game/modules/tome/data/talents/chronomancy/age-manipulation.lua
index a160e2b6cf822cfd9c0120cf59c479bf0fde35a2..47d2c7e2d7028181d8bd1951b1583d83d03bf9de 100644
--- a/game/modules/tome/data/talents/chronomancy/age-manipulation.lua
+++ b/game/modules/tome/data/talents/chronomancy/age-manipulation.lua
@@ -44,8 +44,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local damagestat = t.getDamageStat(self, t)
-		return ([[Projects a bolt of temporal energy that deals %0.2f temporal damage, and reduces the targets three highest stats by %d for 3 turns.
-		The damage dealt will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), damagestat)
+		return ([[Projects a bolt of temporal energy that deals %0.2f temporal damage, and reduces the targets three highest stats by %d for 3 turns. %s
+		The damage dealt will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), damagestat, Desc.vs"ss")
 	end,
 }
 
@@ -82,8 +82,8 @@ newTalent{
 	info = function(self, t)
 		local duration = t.getConfuseDuration(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Reverts the minds of all creatures in a radius %d cone to an infantile state, in effect confusing them (%d%% to act randomly) for %d turns.]]):
-		tformat(radius, t.getConfuseEfficency(self, t), duration)
+		return ([[Reverts the minds of all creatures in a radius %d cone to an infantile state, in effect confusing them (%d%% to act randomly) for %d turns %s.]]):
+		tformat(radius, t.getConfuseEfficency(self, t), duration, Desc.vs"sm")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/chronomancy/anomalies.lua b/game/modules/tome/data/talents/chronomancy/anomalies.lua
index dc2a915bd638e4c3d2e1abb2b6669d23475ba859..e5c1ef742f9f7f4895a5a3843595589695c7cc8c 100644
--- a/game/modules/tome/data/talents/chronomancy/anomalies.lua
+++ b/game/modules/tome/data/talents/chronomancy/anomalies.lua
@@ -774,8 +774,8 @@ newTalent{
 		return t.doAction(self, t, true)
 	end,
 	info = function(self, t)
-		return ([[Stuns up to five targets in a radius %d ball.]]):
-		tformat(self:getTalentRadius(t))
+		return ([[Stuns up to five targets in a radius %d ball %s.]]):
+		tformat(self:getTalentRadius(t), Desc.vs"sp")
 	end,
 }
 
@@ -1306,7 +1306,7 @@ newTalent{
 		return t.doAction(self, t, true)
 	end,
 	info = function(self, t)
-		return ([[Creates a gravity well in a radius %d ball, pinning up to five targets.]]):tformat(self:getTalentRadius(t))
+		return ([[Creates a gravity well in a radius %d ball, pinning up to five targets %s.]]):tformat(self:getTalentRadius(t), Desc.vs"sp")
 	end,
 }
 
@@ -1568,8 +1568,8 @@ newTalent{
 		return t.doAction(self, t, true)
 	end,
 	info = function(self, t)
-		return ([[Turns up to 5 targets in a radius %d ball to stone for %d turns.]]):
-		tformat(getAnomalyRadius(self, t), getAnomalyDuration(self, t))
+		return ([[Turns up to 5 targets in a radius %d ball to stone for %d turns %s.]]):
+		tformat(getAnomalyRadius(self, t), getAnomalyDuration(self, t), Desc.vs"ss")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/chronomancy/blade-threading.lua b/game/modules/tome/data/talents/chronomancy/blade-threading.lua
index c32706521fab86f00a177d52ee50f81add7b9c58..1058250efb2dbf175dad3aeac88a9638eee6e9fd 100644
--- a/game/modules/tome/data/talents/chronomancy/blade-threading.lua
+++ b/game/modules/tome/data/talents/chronomancy/blade-threading.lua
@@ -60,10 +60,10 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t) * 100
 		local duration = t.getDuration(self, t)
-		return ([[Attack with your melee weapons for %d%% weapon damage as physical and temporal (warp) damage. If either attack hits you may stun, blind, pin, or confuse the target for %d turns.
+		return ([[Attack with your melee weapons for %d%% weapon damage as physical and temporal (warp) damage. If either attack hits you may stun, blind, pin, or confuse the target for %d turns %s.
 		
 		Blade Threading talents will freely swap to your dual-weapons when activated if you have them in your secondary slots.  Additionally you may use the Attack talent in a similar manner.]])
-		:tformat(damage, duration)
+		:tformat(damage, duration, Desc.vs("sp", Desc.max("ps", "ms")))
 	end
 }
 
@@ -256,9 +256,9 @@ newTalent{
 		local shear = t.getShear(self, t)
 		local radius = self:getTalentRadius(t)
 		return ([[Attack up to three adjacent targets for %d%% weapon damage.  If any attack hits you'll create a temporal shear dealing %0.2f temporal damage in a radius %d cone.
-		Each target you hit with your weapons beyond the first increases the damage of the shear by 25%%.  Targets reduced below 20%% of maximum life by the shear may be instantly slain.
+		Each target you hit with your weapons beyond the first increases the damage of the shear by 25%%.  Targets reduced below 20%% of maximum life by the shear may be instantly slain %s.
 		The cone damage improves with your Spellpower.]])
-		:tformat(damage, damDesc(self, DamageType.TEMPORAL, shear), radius)
+		:tformat(damage, damDesc(self, DamageType.TEMPORAL, shear), radius, Desc.vs"sp")
 	end
 }
 
diff --git a/game/modules/tome/data/talents/chronomancy/bow-threading.lua b/game/modules/tome/data/talents/chronomancy/bow-threading.lua
index ccfe170b9572e35653764373b6e354e92f33fc61..3284d90f59463fcb34fb0058659e512f567c9570 100644
--- a/game/modules/tome/data/talents/chronomancy/bow-threading.lua
+++ b/game/modules/tome/data/talents/chronomancy/bow-threading.lua
@@ -215,11 +215,11 @@ newTalent{
 		local damage = t.getDamage(self, t) * 100
 		local radius = self:getTalentRadius(t)
 		local aoe = t.getDamageAoE(self, t)
-		return ([[Fire an arrow for %d%% weapon damage. When the arrow reaches its destination or hits a target it will draw in all other targets in a radius of %d and inflict %0.2f physical damage.
+		return ([[Fire an arrow for %d%% weapon damage. When the arrow reaches its destination or hits a target it will draw in all other targets %s in a radius of %d and inflict %0.2f physical damage.
 		Each target moved beyond the first increases the damage %0.2f (up to %0.2f bonus damage).
 		Targets take reduced damage the further they are from the epicenter (20%% less per tile).
 		The additional damage scales with your Spellpower.]])
-		:tformat(damage, radius, damDesc(self, DamageType.PHYSICAL, aoe), damDesc(self, DamageType.PHYSICAL, aoe/8), damDesc(self, DamageType.PHYSICAL, aoe/2))
+		:tformat(damage, Desc.vs"sp", radius, damDesc(self, DamageType.PHYSICAL, aoe), damDesc(self, DamageType.PHYSICAL, aoe/8), damDesc(self, DamageType.PHYSICAL, aoe/2))
 	end
 }
 
diff --git a/game/modules/tome/data/talents/chronomancy/energy.lua b/game/modules/tome/data/talents/chronomancy/energy.lua
index 77dff3df3dfe19d9c57f24ef9e55697435e8a77f..d9e7d2648a9966fa7143264b917c617ee076c89f 100644
--- a/game/modules/tome/data/talents/chronomancy/energy.lua
+++ b/game/modules/tome/data/talents/chronomancy/energy.lua
@@ -132,9 +132,9 @@ newTalent{
 	info = function(self, t)
 		local talentcount = t.getTalentCount(self, t)
 		local cooldown = t.getCooldown(self, t)
-		return ([[You sap the target's energy and add it to your own, placing up to %d random talents on cooldown for %d turns.
+		return ([[You sap the target's energy and add it to your own, placing up to %d random talents on cooldown for %d turns %s.
 		For each talent put on cooldown, you reduce the cooldown of one of your talents currently on cooldown by %d turns.]]):
-		tformat(talentcount, cooldown, cooldown)
+		tformat(talentcount, cooldown, Desc.vs"ss", cooldown)
 	end,
 }
 
@@ -194,6 +194,6 @@ newTalent{
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Each turn, for the next %d turns, one of the target's sustained talents will be deactivated.]]):tformat(duration)
+		return ([[Each turn, for the next %d turns, one of the target's sustained talents will be deactivated %s.]]):tformat(duration, Desc.vs"ss")
 	end,
 }
diff --git a/game/modules/tome/data/talents/chronomancy/flux.lua b/game/modules/tome/data/talents/chronomancy/flux.lua
index 0c5cb08defad114ae255ad1aecbc1a9297d0e411..21671a0e70973bf6abc6b3891d4f5b8dea43bd25 100644
--- a/game/modules/tome/data/talents/chronomancy/flux.lua
+++ b/game/modules/tome/data/talents/chronomancy/flux.lua
@@ -140,9 +140,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Deals %0.2f temporal damage over %d turns to all targets in a radius of %d.  Targets with Reality Smearing active will instead recover %d life over four turns.
+		return ([[Deals %0.2f temporal damage over %d turns to all targets in a radius of %d %s.  Targets with Reality Smearing active will instead recover %d life over four turns.
 		If a target is reduced below 20%% life while Attenuate is active it may be instantly slain.
-		The damage will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration, radius, damage *0.4)
+		The damage will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration, radius, Desc.vs"ss", damage *0.4)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/chronomancy/gravity.lua b/game/modules/tome/data/talents/chronomancy/gravity.lua
index b49f079364d030870fdcc8c9ac80e6ea67fb618e..5173768faa9278d85c238bce50e7fcbb7a21ad71 100644
--- a/game/modules/tome/data/talents/chronomancy/gravity.lua
+++ b/game/modules/tome/data/talents/chronomancy/gravity.lua
@@ -95,12 +95,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Sends out a blast wave of gravity in a radius %d cone, dealing %0.2f base physical (gravity) damage and knocking back targets caught in the area.
+		return ([[Sends out a blast wave of gravity in a radius %d cone, dealing %0.2f base physical (gravity) damage and knocking back targets caught in the area %s.
 		Targets knocked into walls or other targets take 25%% additional damage and deal 25%% damage to targets they're knocked into.
 		Closer targets will be knocked back further and the damage will scale with your Spellpower.]]):
-		tformat(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
+		tformat(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)), Desc.vs"sp")
 	end,
 }
 
@@ -175,11 +174,11 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Creates a gravity spike in a radius of %d that moves all targets towards the spell's center and inflicts %0.2f physical (gravity) damage.
+		return ([[Creates a gravity spike in a radius of %d that moves all targets towards the spell's center %s and inflicts %0.2f physical (gravity) damage.
 		Each target moved beyond the first increases the damage by %0.2f (up to a maximum of %0.2f bonus damage).
 		Targets take reduced damage the further they are from the epicenter (20%% less per tile).
 		The damage dealt will scale with your Spellpower.]])
-		:tformat(radius, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.PHYSICAL, damage/8), damDesc(self, DamageType.PHYSICAL, damage/2))
+		:tformat(radius, Desc.vs"sp", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.PHYSICAL, damage/8), damDesc(self, DamageType.PHYSICAL, damage/2))
 	end,
 }
 
@@ -217,7 +216,7 @@ newTalent{
 		local proj = t.getSlow(self, t)
 		local anti = t.getAnti(self, t)
 		return ([[Create a gravity field around you that converts %d%% all damage you deal into physical damage, slows incoming projectiles by %d%%, and protects you from all gravity damage and effects.
-		Additionally, damage dealt by Repulsion Blast has a %d%% chance to reduce the target's knockback resistance by half for two turns.]]):tformat(conv, proj, anti)
+		Additionally, damage dealt by Repulsion Blast has a %d%% chance to reduce the target's knockback resistance by half for two turns %s.]]):tformat(conv, proj, anti, Desc.vs())
 	end,
 }
 
@@ -263,7 +262,7 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
 		local slow = t.getSlow(self, t)
-		return ([[Increases local gravity in a radius of %d for %d turns, dealing %0.2f physical (gravity) damage as well as decreasing the global speed of all affected targets by %d%%.
-		The damage done will scale with your Spellpower.]]):tformat(radius, duration, damDesc(self, DamageType.PHYSICAL, damage), slow*100)
+		return ([[Increases local gravity in a radius of %d for %d turns, dealing %0.2f physical (gravity) damage as well as decreasing the global speed of all affected targets by %d%% %s.
+		The damage done will scale with your Spellpower.]]):tformat(radius, duration, damDesc(self, DamageType.PHYSICAL, damage), slow*100, Desc.vs"sp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/chronomancy/guardian.lua b/game/modules/tome/data/talents/chronomancy/guardian.lua
index 7f9f52953f2613e95979a8dc073ef0009ba03a1c..dcd40c09831eba3ccf2a7cbd520581b7a72388e0 100644
--- a/game/modules/tome/data/talents/chronomancy/guardian.lua
+++ b/game/modules/tome/data/talents/chronomancy/guardian.lua
@@ -205,7 +205,7 @@ newTalent{
 		local power = t.getPower(self, t)
 		local duration = t.getDuration(self, t)
 		return ([[Attack the target with either your ranged or melee weapons for %d%% weapon damage.  For the next %d turns random targeting, such as from Blink Blade and Warden's Call, will focus on this target.
-		Attacks against this target gain %d%% critical chance and critical strike power while you take %d%% less damage from all enemies whose rank is lower then that of your focus target.]])
-		:tformat(damage, duration, power, power, power)
+		Attacks against this target gain %d%% critical chance and critical strike power %s while you take %d%% less damage from all enemies whose rank is lower then that of your focus target.]])
+		:tformat(damage, duration, power, Desc.vs(), power)
 	end
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua b/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua
index 0f436d2d81f6ab111b7974ff0479c85c2fcef566..01756372a7f0109cce06469afaaf69a697debe5f 100644
--- a/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua
+++ b/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua
@@ -332,8 +332,8 @@ newTalent{
 	info = function(self, t)
 		local regress = t.getRegression(self, t)
 		local aging = t.getAgingChance(self, t)
-		return ([[While your cosmic cycle is expanding, creatures in its radius have a %d%% chance to suffer the effects of aging; pinning, blinding, or confusing them for 3 turns.
+		return ([[While your cosmic cycle is expanding, creatures in its radius have a %d%% chance to suffer the effects of aging; pinning %s, blinding %s, or confusing %s them for 3 turns.
 		While your cosmic cycle is contracting, creatures in its radius suffer from age regression; reducing their three highest stats by %d.
-		The chance and stat reduction will scale with your Spellpower.]]):tformat(aging, regress)
+		The chance and stat reduction will scale with your Spellpower.]]):tformat(aging, Desc.vs"sp", Desc.vs"sp", Desc.vs"sm", regress)
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/matter.lua b/game/modules/tome/data/talents/chronomancy/matter.lua
index d5f020fcf17c9fc3de730c04a4bf4c7766d78281..1afd9dc0b63cde75fdbcf39d9028442b6e0465b7 100644
--- a/game/modules/tome/data/talents/chronomancy/matter.lua
+++ b/game/modules/tome/data/talents/chronomancy/matter.lua
@@ -331,9 +331,9 @@ newTalent{
 	info = function(self, t)
 		local digs = t.getDigs(self, t)
 		local chance = t.getChance(self, t)
-		return ([[While active your physical and temporal damage has a %d%% chance to remove one beneficial physical or magical temporary effect (respectively) from targets you hit.
+		return ([[While active your physical and temporal damage has a %d%% chance to remove one beneficial physical or magical temporary effect (respectively) from targets you hit %s.
 		Only one physical and one magical effect may be removed per turn from each target.
 		Additionally your Dust to Dust spell now digs up to %d tiles into walls.]]):
-		tformat(chance, digs)
+		tformat(chance, Desc.vs(), digs)
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/other.lua b/game/modules/tome/data/talents/chronomancy/other.lua
index d7ae4d5897e42eeb0fd85dd8afad3c03cdac44d2..7dca6f5ea5c4e218f2156af790dc191e27ae7aaf 100644
--- a/game/modules/tome/data/talents/chronomancy/other.lua
+++ b/game/modules/tome/data/talents/chronomancy/other.lua
@@ -172,9 +172,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
 		local duration = t.getDuration(self, t)
-		return ([[Creates a time distortion in a radius of %d that lasts for %d turns, decreasing global speed by %d%% for 3 turns and inflicting %0.2f temporal damage each turn to all targets within the area.
+		return ([[Creates a time distortion in a radius of %d that lasts for %d turns, decreasing global speed by %d%% for 3 turns %s and inflicting %0.2f temporal damage each turn to all targets within the area.
 		The slow effect and damage dealt will scale with your Spellpower.]]):
-		tformat(radius, duration, 100 * slow, damDesc(self, DamageType.TEMPORAL, damage))
+		tformat(radius, duration, 100 * slow, Desc.vs"sp", damDesc(self, DamageType.TEMPORAL, damage))
 	end,
 }
 
@@ -715,8 +715,8 @@ newTalent{
 		local range = self:getTalentRange(t)
 		local duration = t.getConfuseDuration(self, t)
 		local power = t.getConfuseEfficency(self, t)
-		return ([[You manipulate the spacetime continuum in such a way that you switch places with another creature with in a range of %d.  The targeted creature will be confused (power %d%%) for %d turns.
-		The spell's hit chance will increase with your Spellpower.]]):tformat (range, power, duration)
+		return ([[You manipulate the spacetime continuum in such a way that you switch places with another creature with in a range of %d.  The targeted creature will be confused (power %d%%) for %d turns %s.
+		The spell's hit chance will increase with your Spellpower.]]):tformat (range, power, duration, Desc.vs"sm")
 	end,
 }
 
@@ -783,9 +783,9 @@ newTalent{
 		local stun = t.getDuration(self, t)
 		local damage = t.getDamage(self, t)
 		return ([[Violently fold the space between yourself and another point within range.
-		You teleport to the target location, and leave a temporal wake behind that stuns for %d turns and deals %0.2f temporal and %0.2f physical warp damage to targets in the path.
+		You teleport to the target location, and leave a temporal wake behind that stuns for %d turns %s and deals %0.2f temporal and %0.2f physical warp damage to targets in the path.
 		The damage will scale with your Spellpower.]]):
-		tformat(stun, damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2))
+		tformat(stun, Desc.vs"sp", damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua b/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua
index 6d0580844d4bc04a975201427cc2acdafe559467..42c1f1a1403fed022ec50caa7070b3c9714d6be9 100644
--- a/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua
+++ b/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua
@@ -148,10 +148,10 @@ newTalent{
 		local duration = self:callTalent(self.T_WARP_MINES, "getDuration")
 		local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8
 		local disarm = self:callTalent(self.T_WARP_MINES, "trapPower")
-		return ([[Lay Warp Mines in a radius of 1 that teleport enemies to you and inflict %0.2f physical and %0.2f temporal (warp) damage.
+		return ([[Lay Warp Mines in a radius of 1 that teleport enemies to you %s and inflict %0.2f physical and %0.2f temporal (warp) damage.
 		The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns.
 		The damage caused by your Warp Mines will improve with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration)
+		tformat(Desc.vs"ss", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration)
 	end,
 }
 
@@ -198,10 +198,10 @@ newTalent{
 		local duration = self:callTalent(self.T_WARP_MINES, "getDuration")
 		local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8
 		local disarm = self:callTalent(self.T_WARP_MINES, "trapPower")
-		return ([[Lay Warp Mines in a radius of 1 that teleport enemies away from you and inflict %0.2f physical and %0.2f temporal (warp) damage.
+		return ([[Lay Warp Mines in a radius of 1 that teleport enemies away from you %s and inflict %0.2f physical and %0.2f temporal (warp) damage.
 		The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns.
 		The damage caused by your Warp Mines will improve with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration) 
+		tformat(Desc.vs"ss", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration)
 	end,
 }
 
@@ -235,12 +235,12 @@ newTalent{
 		local detect = t.trapPower(self,t)*0.8
 		local disarm = t.trapPower(self,t)
 		local duration = t.getDuration(self, t)
-		return ([[Learn to lay Warp Mines in a radius of 1.  Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used and inflict %0.2f physical and %0.2f temporal (warp) damage.
+		return ([[Learn to lay Warp Mines in a radius of 1.  Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used %s and inflict %0.2f physical and %0.2f temporal (warp) damage.
 		The mines are hidden traps (%d detection and %d disarm power based on your Magic), last for %d turns, and each have a ten turn cooldown.
 		Investing in this talent improves the range of all Spacetime Folding talents and the damage caused by your Warp Mines will improve with your Spellpower.
 		
 		Current Spacetime Folding Range: %d]]):
-		tformat(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration, range) --I5
+		tformat(Desc.vs"ss", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration, range) --I5
 	end,
 }
 
@@ -390,11 +390,11 @@ newTalent{
 		local chance = t.getChance(self, t)
 		local damage = t.getDamage(self, t)/2
 		local radius = self:getTalentRadius(t)
-		return ([[Tether the target to the location for %d turns.  
-		Each turn the target has a %d%% chance per tile it's travelled away from the tether to be teleported back, inflicting %0.2f physical and %0.2f temporal (warp) damage to all enemies in a radius of %d at both the entrance and exit locations.
+		return ([[Tether the target to the location for %d turns %s.
+		Each turn the target has a %d%% chance per tile it's travelled away from the tether to be teleported back %s, inflicting %0.2f physical and %0.2f temporal (warp) damage to all enemies in a radius of %d at both the entrance and exit locations.
 		If the target has already been tethered, it will also be tethered to the new location. The old tether still exists and can function normally, but cannot be extended by any means.
 		The damage will scale with your Spellpower.]])
-		:tformat(duration, chance, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), radius)
+		:tformat(duration, Desc.vs(), chance, Desc.vs"ss", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), radius)
 	end,
 }
 
@@ -448,8 +448,9 @@ newTalent{
 	info = function(self, t)
 		local range = t.getTeleport(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Randomly teleports all enemies within a radius of three.  Enemies will be teleported between %d and %d tiles from you and may be stunned, blinded, confused, or pinned for %d turns.
-		The chance of teleportion will scale with your Spellpower.]]):tformat(range / 2, range, duration)
+		return ([[Randomly teleports all enemies within a radius of three %s.
+		Enemies will be teleported between %d and %d tiles from you and may be stunned %s, blinded %s, confused %s, or pinned %s for %d turns.]]
+		):tformat(Desc.vs"ss", range / 2, range, Desc.vs"sp",Desc.vs"sp",Desc.vs"sm",Desc.vs"sp", duration)
 	end,
 }
 
@@ -505,8 +506,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)/2
 		local duration = t.getDuration(self, t)
-		return ([[Create a radius three anti-teleport field for %d turns and daze all enemies in the area of effect for two turns.
+		return ([[Create a radius three anti-teleport field %s for %d turns and daze all enemies in the area of effect for two turns %s.
 		Enemies attempting to teleport while anchored take %0.2f physical and %0.2f temporal (warp) damage.
-		The damage will scale with your Spellpower.]]):tformat(duration, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage))
+		The damage will scale with your Spellpower.]]):tformat(Desc.vs"ss", duration, Desc.vs(), damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage))
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua b/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua
index db531202549078dbb821d2b63a1579fa8a16f641..5de3e9dbedc6dd097cbb9bce29fbf881d24a6cf8 100644
--- a/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua
+++ b/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua
@@ -86,7 +86,7 @@ newTalent{
 	info = function(self, t)
 		local range = self:getTalentRange(t)
 		return ([[Teleports you to up to %d tiles away, to a targeted location in line of sight.
-		At talent level 5 you may swap positions with a target creature.]]):tformat(range)
+		At talent level 5 you may swap positions with a target creature %s.]]):tformat(range, Desc.vs"ss")
 	end,
 }
 
@@ -234,7 +234,8 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
 		local range = self:getTalentRange(t)
-		return ([[You fold the space between yourself and a second point within a range of %d, creating a pair of wormholes.  Any creature stepping on either wormhole will be teleported near the other (radius %d accuracy).  
+		return ([[You fold the space between yourself and a second point within a range of %d, creating a pair of wormholes.  Any creature stepping on either wormhole will be teleported near the other (radius %d accuracy).
+		To teleport hostile creatures, you need to bypass spell save with your spellpower.
 		The wormholes will last %d turns and must be placed at least two tiles apart.
 		The chance of teleporting enemies will scale with your Spellpower.]])
 		:tformat(range, radius, duration)
@@ -293,7 +294,7 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		local duration = t.getDuration(self, t)
 		return ([[When you teleport you fire a pulse that jolts enemies out of phase in a radius of %d around both the start and the destination point. 
-		Each target has a %d%% chance per tile you travelled to be stunned, blinded, confused, or pinned for %d turns.]]):
-		tformat(radius, chance, duration)
+		Each target has a %d%% chance per tile you travelled to be stunned, blinded, confused, or pinned for %d turns %s.]]):
+		tformat(radius, chance, duration, Desc.vs("sp", Desc.max("ps", "ms")))
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/stasis.lua b/game/modules/tome/data/talents/chronomancy/stasis.lua
index e898c62f6e1bbc576d635363aba985c06b0b0cc8..8664440910183a54f816c6992f7b9e6bbd349d3a 100644
--- a/game/modules/tome/data/talents/chronomancy/stasis.lua
+++ b/game/modules/tome/data/talents/chronomancy/stasis.lua
@@ -113,9 +113,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
 		local duration = t.getDuration(self, t)
-		return ([[Inflicts %0.2f temporal damage, and attempts to stun all targets in a radius %d ball for %d turns.
+		return ([[Inflicts %0.2f temporal damage, and attempts to stun all targets in a radius %d ball for %d turns %s.
 		The damage will scale with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.TEMPORAL, damage), radius, duration)
+		tformat(damDesc(self, DamageType.TEMPORAL, damage), radius, duration, Desc.vs"sp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/chronomancy/temporal-combat.lua b/game/modules/tome/data/talents/chronomancy/temporal-combat.lua
index 67a1e0bb5022c14526e3f0cbe72fea5c0d4c3e45..d480fef5b50e1f19c5c12b867893a4ddf9d19a77 100644
--- a/game/modules/tome/data/talents/chronomancy/temporal-combat.lua
+++ b/game/modules/tome/data/talents/chronomancy/temporal-combat.lua
@@ -79,9 +79,9 @@ newTalent{
 		local resists = t.getResists(self, t)
 		local duration = t.getDuration(self, t)
 		return ([[When you hit with Weapon Folding you have a %d%% chance of dealing an additional %0.2f temporal damage to enemies in a radius of %d.
-		Affected targets may also have their physical and temporal resistance reduced by %d%% for %d turns.
+		Affected targets may also have their physical and temporal resistance reduced by %d%% for %d turns %s.
 		This effect has a cooldown.  If it triggers while on cooldown it will reduce the cooldown of Fold Gravity and Fold Warp by one turn.]])
-		:tformat(chance, damDesc(self, DamageType.TEMPORAL, damage), radius, resists, duration)
+		:tformat(chance, damDesc(self, DamageType.TEMPORAL, damage), radius, resists, Desc.vs"ss", duration)
 	end,
 }
 
@@ -125,9 +125,9 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		local duration = t.getDuration(self, t)
 		return ([[When you hit with Weapon Folding you have a %d%% chance of dealing an additional %0.2f physical and %0.2f temporal (warp) damage to enemies in a radius of %d.
-		Each target hit may be stunned, blinded, pinned, or confused for %d turns.
+		Each target hit may be stunned, blinded, pinned, or confused for %d turns %s.
 		This effect has a cooldown.  If it triggers while on cooldown it will reduce the cooldown of Fold Gravity and Fold Fate by one turn.]])
-		:tformat(chance, damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2), radius, duration)
+		:tformat(chance, damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2), radius, Desc.vs("sp", Desc.max("ms", "ps")), duration)
 	end,
 }
 
@@ -173,9 +173,9 @@ newTalent{
 		local slow = t.getSlow(self, t)
 		local duration = t.getDuration(self, t)
 		return ([[When you hit with Weapon Folding you have a %d%% chance of dealing an additional %0.2f physical (gravity) damage to enemies in a radius of %d.
-		Affected targets may also be slowed, decreasing their global speed speed by %d%% for %d turns
+		Affected targets may also be slowed, decreasing their global speed speed by %d%% for %d turns %s.
 		This effect has a cooldown.  If it triggers while on cooldown it will reduce the cooldown of Fold Fate and Fold Warp by one turn.]])
-		:tformat(chance, damDesc(self, DamageType.PHYSICAL, damage), radius, slow, duration)
+		:tformat(chance, damDesc(self, DamageType.PHYSICAL, damage), radius, slow, duration, Desc.vs"sp")
 	end,
 }
 
@@ -283,13 +283,14 @@ newTalent{
 		local resists = t.getResists(self, t)
 		return ([[You now have a %d%% chance to Fold Fate, Gravity, or Warp into your Weapon Folding damage.
 		
-		Fold Fate: Deals %0.2f temporal damage to enemies in a radius of %d.  Affected targets may lose %d%% physical and temporal resistance for %d turns.
-		Fold Warp: Deals %0.2f physical and %0.2f temporal damage to enemies in a radius of %d.  Affected targets may be stunned, blinded, confused, or pinned for %d turns.
-		Fold Gravity: Deals %0.2f physical damage to enemies in a radius of %d.  Affected targets will be slowed (%d%%) for %d turns.
+		Fold Fate: Deals %0.2f temporal damage to enemies in a radius of %d.  Affected targets may lose %d%% physical and temporal resistance for %d turns %s.
+		Fold Warp: Deals %0.2f physical and %0.2f temporal damage to enemies in a radius of %d.  Affected targets may be stunned %s, blinded %s, confused %s, or pinned %s for %d turns.
+		Fold Gravity: Deals %0.2f physical damage to enemies in a radius of %d.  Affected targets will be slowed (%d%%) for %d turns %s.
 		
 		Each Fold has an eight turn cooldown.  If an effect would be triggered while on cooldown it will reduce the cooldown of the other two Folds by one turn.]])
-		:tformat(chance, damDesc(self, DamageType.TEMPORAL, damage), radius, resists, duration, damDesc(self, DamageType.PHYSICAL, damage/2), damDesc(self, DamageType.TEMPORAL, damage/2), radius,
-		duration, damDesc(self, DamageType.PHYSICAL, damage), radius, slow, duration)
+		:tformat(chance, damDesc(self, DamageType.TEMPORAL, damage), radius, resists, duration, Desc.vs"ss",
+				damDesc(self, DamageType.PHYSICAL, damage/2), damDesc(self, DamageType.TEMPORAL, damage/2), radius, Desc.vs"sp",Desc.vs"sp",Desc.vs"sm",Desc.vs"sp",
+		duration, damDesc(self, DamageType.PHYSICAL, damage), radius, slow, duration, Desc.vs"sp")
 	end,
 }
 
@@ -341,8 +342,8 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local damage = t.getDamage(self, t) * 100
 		return ([[Attack the target with either your ranged or melee weapons for %d%% damage.
-		If the attack hits you'll breach the target's immunities, reducing armor hardiness, stun, pin, blindness, and confusion immunity by 50%% for %d turns.
+		If the attack hits you'll breach the target's immunities, reducing armor hardiness, stun, pin, blindness, and confusion immunity by 50%% for %d turns %s.
 		Breach chance scales with your Spellpower.]])
-		:tformat(damage, duration)
+		:tformat(damage, duration, Desc.vs"ss")
 	end
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua b/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua
index 1aaead7966a5b1a1f2755d1ff83da099b2bc70b7..31928b3a9bf2f501f466186302815670fe0ef1dd 100644
--- a/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua
+++ b/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua
@@ -457,7 +457,7 @@ newTalent{
 		local duration =t.getDuration(self, t)
 		local affinity = t.getResists(self, t)
 		return ([[Command your Temporal Hounds to breathe time, dealing %0.2f temporal damage and reducing the three highest stats of all targets in a radius %d cone.
-		Affected targets will have their stats reduced by %d for %d turns.  You are immune to the breath of your own hounds and your hounds are immune to stat damage from other hounds.
-		When you learn this talent, your hounds gain %d%% temporal damage affinity.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), radius, stat_damage, duration, affinity)
+		Affected targets will have their stats reduced by %d for %d turns %s.  You are immune to the breath of your own hounds and your hounds are immune to stat damage from other hounds.
+		When you learn this talent, your hounds gain %d%% temporal damage affinity.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), radius, stat_damage, duration, Desc.vs"ss", affinity)
 	end,
 }
diff --git a/game/modules/tome/data/talents/chronomancy/timeline-threading.lua b/game/modules/tome/data/talents/chronomancy/timeline-threading.lua
index f39214f5a1b070348a0869d6ab78afa2cabe1463..966a56104f5942c32978750aab567addebeb7191 100644
--- a/game/modules/tome/data/talents/chronomancy/timeline-threading.lua
+++ b/game/modules/tome/data/talents/chronomancy/timeline-threading.lua
@@ -205,9 +205,9 @@ newTalent{
 	info = function(self, t)
 		local braid = t.getBraid(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Your Rethread now braids the lifelines of all targets it hits for %d turns.  Braided targets take %d%% of all damage dealt to other braided targets.
+		return ([[Your Rethread now braids the lifelines of all targets it hits for %d turns %s.  Braided targets take %d%% of all damage dealt to other braided targets.
 		The amount of damage shared will scale with your Spellpower.]])
-		:tformat(duration, braid)
+		:tformat(duration, Desc.vs(), braid)
 	end
 }
 
@@ -292,11 +292,11 @@ newTalent{
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
 		local power = t.getPower(self, t)
-		return ([[Over the next %d turns, you attempt to remove the target from the timeline, lowering its resistance to physical and temporal damage by %d%%.
+		return ([[Over the next %d turns, you attempt to remove the target from the timeline, lowering its resistance to physical and temporal damage by %d%% %s.
 		If you manage to kill the target while the spell is in effect, you'll be returned to the point in time you cast this spell and the target will be slain.
 		This spell splits the timeline.  Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.
 		The resistance penalty will scale with your Spellpower.]])
-		:tformat(duration, power)
+		:tformat(duration, power, Desc.vs"ss")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/chronomancy/timetravel.lua b/game/modules/tome/data/talents/chronomancy/timetravel.lua
index b41ac62631e7e4970877775b26a3929e6d3e84d7..81234a8f3ddcc1dc0436d07b9c0bc7565894ed17 100644
--- a/game/modules/tome/data/talents/chronomancy/timetravel.lua
+++ b/game/modules/tome/data/talents/chronomancy/timetravel.lua
@@ -215,8 +215,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Inflicts %0.2f temporal damage.  If your target survives, it may be removed from time for %d turns.
-		The damage will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration)
+		return ([[Inflicts %0.2f temporal damage.  If your target survives, it may be removed from time for %d turns %s.
+		The damage will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration, Desc.vs"ss")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/corruptions/blight.lua b/game/modules/tome/data/talents/corruptions/blight.lua
index 138e298bd9ba24e73d128d1766fb159d495546b3..1993e9930f2e9ba8c7fe9d7d74ba99c0c4d9f1a2 100644
--- a/game/modules/tome/data/talents/corruptions/blight.lua
+++ b/game/modules/tome/data/talents/corruptions/blight.lua
@@ -110,9 +110,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Project a corrupted blast of power that removes up to %d magical or physical effects or any type of sustain and deals %0.2f blight damage to any creatures caught in the radius 3 ball.
-		For each effect, the creature has a chance to resist based on its spell save.
-		The damage will increase with your Spellpower.]]):tformat(t.getRemoveCount(self, t), damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 28, 120)))
+		return ([[Project a corrupted blast of power that removes up to %d magical or physical effects or any type of sustain %s and deals %0.2f blight damage to any creatures caught in the radius 3 ball.
+		The damage will increase with your Spellpower.]]):tformat(t.getRemoveCount(self, t), Desc.vs"ss", damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 28, 120)))
 	end,
 }
 
@@ -142,10 +141,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Infects the target with a corrosive worm for 6 turns that reduces blight and acid resistance by %d%% and feeds off damage taken.
+		return ([[Infects the target with a corrosive worm for 6 turns %s that reduces blight and acid resistance by %d%% and feeds off damage taken.
 		When this effect ends or the target dies the worm will explode, dealing %d acid damage in a 4 radius ball. This damage will increase by %d%% of all damage taken while infected.
 		The damage dealt by the effect will increase with spellpower.]]):
-		tformat(t.getResist(self,t), t.getDamage(self, t), t.getPercent(self, t))
+		tformat(Desc.vs"ss", t.getResist(self,t), t.getDamage(self, t), t.getPercent(self, t))
 	end,
 }
 
@@ -207,13 +206,13 @@ newTalent{
 	info = function(self, t)
 		local dam = damDesc(self, DamageType.BLIGHT, t.getDamage(self,t))
 		local power, heal_factor, fail = t.getEffects(self, t)
-		return ([[A furious storm of blighted poison rages around the caster in a radius of %d for %d turns.  Each creature hit by the storm takes %0.2f blight damage and is poisoned for %0.2f blight damage over 4 turns.
+		return ([[A furious storm of blighted poison %s rages around the caster in a radius of %d for %d turns.  Each creature hit by the storm takes %0.2f blight damage and is poisoned for %0.2f blight damage over 4 turns.
 		At talent level 2 you have a chance to inflict Insidious Blight, which reduces healing by %d%%.
 		At talent level 4 you have a chance to inflict Numbing Blight, which reduces all damage dealt by %d%%.
 		At talent level 6 you have a chance to inflict Crippling Blight, which causes talents to have a %d%% chance of failure.
 		Each possible effect is equally likely.
 		The poison damage dealt is capable of a critical strike.
 		The damage will increase with your Spellpower.]]):
-		tformat(self:getTalentRadius(t), t.getDuration(self, t), dam/4, dam, heal_factor, power, fail)
+		tformat(Desc.vs"ss", self:getTalentRadius(t), t.getDuration(self, t), dam/4, dam, heal_factor, power, fail)
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/corruptions/blood.lua b/game/modules/tome/data/talents/corruptions/blood.lua
index 6b57fc44776620887522cf0f30f6c94db6d0b367..bfb304cce63a756b264af3135da8c4154c1e7818 100644
--- a/game/modules/tome/data/talents/corruptions/blood.lua
+++ b/game/modules/tome/data/talents/corruptions/blood.lua
@@ -71,9 +71,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You extract corrupted blood from your own body, hitting everything in a frontal cone of radius %d for %0.2f blight damage.
-		Each creature hit has a %d%% chance of being infected by a random disease, doing %0.2f blight damage and weakening either Constitution, Strength or Dexterity for 6 turns.
+		Each creature hit has a %d%% chance of being infected by a random disease %s, doing %0.2f blight damage and weakening either Constitution, Strength or Dexterity for 6 turns.
 		The damage will increase with your Spellpower.]]):
-		tformat(self:getTalentRadius(t), damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 10, 190)), t.getChance(self, t), damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 10, 220)))
+		tformat(self:getTalentRadius(t), damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 10, 190)), t.getChance(self, t), Desc.vs"ss", damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 10, 220)))
 	end,
 }
 
@@ -157,8 +157,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Make the impure blood of all creatures around you in radius %d boil.
-				Each enemy afflicted by a disease, poison, or wound will have one removed at random dealing %0.2f blight damage, healing you for %d, and slowing them by %d%% for 5 turns.
-			The damage will increase with your Spellpower.]]):tformat(self:getTalentRadius(t), damDesc(self, DamageType.BLIGHT, t.getDamage(self, t)), t.getHeal(self, t), t.getSlow(self, t))
+				Each enemy afflicted by a disease, poison, or wound will have one removed at random dealing %0.2f blight damage, healing you for %d, and slowing them by %d%% for 5 turns %s.
+			The damage will increase with your Spellpower.]]):tformat(self:getTalentRadius(t), damDesc(self, DamageType.BLIGHT, t.getDamage(self, t)), t.getHeal(self, t), t.getSlow(self, t), Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/corruptions/bone.lua b/game/modules/tome/data/talents/corruptions/bone.lua
index 7beb08092463a35e59bd0ddd0cc059f9ad5e486b..bc52a74f93008ee112995dfcbef0388dae38e2a8 100644
--- a/game/modules/tome/data/talents/corruptions/bone.lua
+++ b/game/modules/tome/data/talents/corruptions/bone.lua
@@ -125,10 +125,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Grab a target and teleport it to your side or if adjacent up to 6 spaces away from you, pinning it there with a bone rising from the ground for %d turns.
+		return ([[Grab a target and teleport it to your side or if adjacent up to 6 spaces away from you %s, pinning it there with a bone rising from the ground for %d turns %s.
 		The bone will also deal %0.2f physical damage.
 		The damage will increase with your Spellpower.]]):
-		tformat(t.getDuration(self, t), damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
+		tformat(Desc.vs"ss", t.getDuration(self, t), Desc.vs"sp", damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/corruptions/curses.lua b/game/modules/tome/data/talents/corruptions/curses.lua
index 65d4e86fb77f9808ceb5d51f5eb3277ae9b1e868..c9579442bb6dc18c4d2b02c2e57e181c33900a7d 100644
--- a/game/modules/tome/data/talents/corruptions/curses.lua
+++ b/game/modules/tome/data/talents/corruptions/curses.lua
@@ -75,8 +75,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Curses your target, decreasing all damage it does by %d%% for 10 turns.
-		The effects will improve with your Spellpower.]]):tformat(t.imppower(self,t))
+		return ([[Curses your target, decreasing all damage it does by %d%% for 10 turns %s.
+		The effects will improve with your Spellpower.]]):tformat(t.imppower(self,t), Desc.vs"ss")
 	end,
 }
 
@@ -106,8 +106,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Curses your target, preventing normal life regeneration and dealing %0.2f darkness damage over 10 turns.
-		The damage will increase with your Spellpower.]]):tformat(damDesc(self, DamageType.DARKNESS, self:combatTalentSpellDamage(t, 10, 70)*10))
+		return ([[Curses your target, preventing normal life regeneration and dealing %0.2f darkness damage over 10 turns %s.
+		The damage will increase with your Spellpower.]]):tformat(damDesc(self, DamageType.DARKNESS, self:combatTalentSpellDamage(t, 10, 70)*10),  Desc.vs"ss")
 	end,
 }
 
@@ -137,7 +137,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Curses your target, decreasing all its resistances by %d%% for 7 turns.
-		The effect will improve with your Spellpower.]]):tformat(self:combatTalentSpellDamage(t, 10, 40))
+		return ([[Curses your target, decreasing all its resistances by %d%% for 7 turns %s.
+		The effect will improve with your Spellpower.]]):tformat(self:combatTalentSpellDamage(t, 10, 40), Desc.vs"ss")
 	end,
 }
diff --git a/game/modules/tome/data/talents/corruptions/hexes.lua b/game/modules/tome/data/talents/corruptions/hexes.lua
index 2307dadf2b214ec89dca7f930e1b2fee6d2cfdd7..fa34a44560549973ae4755540dce514df0931668 100644
--- a/game/modules/tome/data/talents/corruptions/hexes.lua
+++ b/game/modules/tome/data/talents/corruptions/hexes.lua
@@ -51,8 +51,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hexes your target, dazing it and everything in a 2 radius ball around it for 3 turns and giving a %d%% chance to daze affected targets again each turn for 20 turns.
-		The chance will increase with your Spellpower.]]):tformat(t.getchance(self,t))
+		return ([[Hexes your target, dazing it and everything in a 2 radius ball around it for 3 turns %s and giving a %d%% chance to daze affected targets again each turn for 20 turns %s.
+		The chance will increase with your Spellpower.]]):tformat(Desc.vs(), t.getchance(self,t), Desc.vs"ss")
 	end,
 }
 
@@ -88,10 +88,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hexes your target and everything within a radius 2 ball around it for 20 turns. Each time an affected target uses a resource (stamina, mana, vim, ...), it takes %0.2f fire damage.
+		return ([[Hexes your target and everything within a radius 2 ball around it for 20 turns %s. Each time an affected target uses a resource (stamina, mana, vim, ...), it takes %0.2f fire damage.
 		In addition, the cooldown of any talent used while so hexed is increased by %d%% + 1 turn.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.FIRE, self:combatTalentSpellDamage(t, 4, 90)), t.getCDincrease(self, t)*100)
+		tformat(Desc.vs"ss", damDesc(self, DamageType.FIRE, self:combatTalentSpellDamage(t, 4, 90)), t.getCDincrease(self, t)*100)
 	end,
 }
 
@@ -127,8 +127,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hexes your target and everything within a radius 2 ball around it. Each time they do damage, they take %d%% of the same damage for 20 turns.
-		The damage will increase with your Spellpower.]]):tformat(t.recoil(self,t))
+		return ([[Hexes your target and everything within a radius 2 ball around it %s. Each time they do damage, they take %d%% of the same damage for 20 turns.
+		The damage will increase with your Spellpower.]]):tformat(Desc.vs"ss", t.recoil(self,t))
 	end,
 }
 
@@ -164,7 +164,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hexes your target, forcing it to be your thrall for %d turns.
-		If you damage the target, it will be freed from the hex.]]):tformat(t.getDuration(self, t))
+		return ([[Hexes your target, forcing it to be your thrall for %d turns %s.
+		If you damage the target, it will be freed from the hex.]]):tformat(t.getDuration(self, t), Desc.vs"ss")
 	end,
 }
diff --git a/game/modules/tome/data/talents/corruptions/plague.lua b/game/modules/tome/data/talents/corruptions/plague.lua
index 1e466bf09880f7368cf6d61c7135c6bef4d38b57..fb8d72e35194a12e2a1bc1799019627988aa00f5 100644
--- a/game/modules/tome/data/talents/corruptions/plague.lua
+++ b/game/modules/tome/data/talents/corruptions/plague.lua
@@ -88,11 +88,11 @@ newTalent{
 		game:playSoundNear(self, "talents/slime")
 	end,
 	info = function(self, t)
-		return ([[Whenever you deal non-disease blight damage you apply a disease dealing %0.2f blight damage per turn for 6 turns and reducing one of its physical stats (strength, constitution, dexterity) by %d. The three diseases can stack.
+		return ([[Whenever you deal non-disease blight damage you apply a disease dealing %0.2f blight damage per turn for 6 turns %s and reducing one of its physical stats (strength, constitution, dexterity) by %d. The three diseases can stack.
 		Virulent Disease will always try to apply a disease the target does not currently have, and also one that will have the most debilitating effect for the target.
 		This disease will try to prioritize being applied to an enemy with a high disease count near the target.
 		The effect will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.BLIGHT, 7 + self:combatTalentSpellDamage(t, 6, 45)), self:combatTalentSpellDamage(t, 5, 35))
+		tformat(damDesc(self, DamageType.BLIGHT, 7 + self:combatTalentSpellDamage(t, 6, 45)), Desc.vs"ss", self:combatTalentSpellDamage(t, 5, 35))
 	end,
 }
 
@@ -178,9 +178,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Make your target's diseases burst, doing %0.2f blight damage for each disease it is infected with.
-		This will also spread any diseases to any nearby foes in a radius of %d with a minimum duration of 6.
+		This will also spread any diseases to any nearby foes in a radius of %d with a minimum duration of 6 %s.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 15, 115)), self:getTalentRadius(t))
+		tformat(damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 15, 115)), self:getTalentRadius(t), Desc.vs"ss")
 	end,
 }
 
@@ -248,8 +248,8 @@ newTalent{
 		local radius = t.getRadius(self, t)
 		local duration = t.getDuration(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[All your foes within a radius %d ball infected with a disease enter a cataleptic state, stunning them for %d turns and dealing %d%% of all remaining disease damage instantly.]]):
-		tformat(radius, duration, damage * 100)
+		return ([[All your foes within a radius %d ball infected with a disease enter a cataleptic state, stunning them for %d turns %s and dealing %d%% of all remaining disease damage instantly.]]):
+		tformat(radius, duration, Desc.vs"sp", damage * 100)
 	end,
 }
 
@@ -320,12 +320,12 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Infects the target with a very contagious disease, doing %0.2f damage per turn for 6 turns.
-		If any blight damage from non-diseases hits the target, the epidemic may activate and spread a random disease to nearby targets within a radius 2 ball.
+		return ([[Infects the target with a very contagious disease, doing %0.2f damage per turn for 6 turns %s.
+		If any blight damage from non-diseases hits the target, the epidemic may activate and spread a random disease to nearby targets within a radius 2 ball %s.
 		The chance to spread increases with the blight damage dealt and is 100%% if it is at least %d%% of the target's maximum life.
 		Creatures suffering from that disease will also suffer healing reduction (%d%%) and diseases immunity reduction (%d%%).
 		Epidemic is an extremely potent disease; as such, it fully ignores the target's diseases immunity.
 		The damage will increase with your Spellpower, and the spread chance increases with the amount of blight damage dealt.]]):
-		tformat(damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 15, 70)), t.spreadFactor(self, t)*100 ,t.healloss(self,t), t.disfact(self,t))
+		tformat(damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 15, 70)), Desc.vs"ss", Desc.vs"ss", t.spreadFactor(self, t)*100 ,t.healloss(self,t), t.disfact(self,t))
 	end,
 }
diff --git a/game/modules/tome/data/talents/corruptions/reaving-combat.lua b/game/modules/tome/data/talents/corruptions/reaving-combat.lua
index 0c3086370846056605484e987c93d412fc0652cd..3272d234bb21d048859a6bbc5869fe4d7ebaadc3 100644
--- a/game/modules/tome/data/talents/corruptions/reaving-combat.lua
+++ b/game/modules/tome/data/talents/corruptions/reaving-combat.lua
@@ -100,9 +100,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Your blood turns into an acidic mixture. When you get hit, the attacker is splashed with acid.
-		This deals %0.2f acid damage each turn for 5 turns, and reduces the attacker's Accuracy by %d.
+		This deals %0.2f acid damage each turn for 5 turns, and reduces the attacker's Accuracy by %d %s.
 		At level 3, it will also reduce Armour by %d for 5 turns.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.ACID, self:combatTalentSpellDamage(t, 5, 30)), self:combatTalentSpellDamage(t, 15, 35), self:combatTalentSpellDamage(t, 15, 40))
+		tformat(damDesc(self, DamageType.ACID, self:combatTalentSpellDamage(t, 5, 30)), self:combatTalentSpellDamage(t, 15, 35), Desc.vs(), self:combatTalentSpellDamage(t, 15, 40))
 	end,
 }
diff --git a/game/modules/tome/data/talents/corruptions/rot.lua b/game/modules/tome/data/talents/corruptions/rot.lua
index dc6fb0d277318935390fdf07dc569dd08896b423..867016c6ec1f38c1f144bd642853fabd5d9e63c6 100644
--- a/game/modules/tome/data/talents/corruptions/rot.lua
+++ b/game/modules/tome/data/talents/corruptions/rot.lua
@@ -51,9 +51,9 @@ newTalent{
 		local damage = t.getDamage(self, t) * 100
 		local poison = t.getPoisonDamage(self, t)
 		return ([[Bite the target, dealing %d%% melee damage  
-		If the attack hits you'll inject blight poison into the target, dealing %0.2f blight damage and a further %0.2f blight damage over 4 turns.
+		If the attack hits you'll inject blight poison into the target, dealing %0.2f blight damage and a further %0.2f blight damage over 4 turns %s.
 		The bonus damage improves with your Spellpower.]])
-		:tformat(damage, damDesc(self, DamageType.BLIGHT, poison/4), damDesc(self, DamageType.BLIGHT, poison) )
+		:tformat(damage, damDesc(self, DamageType.BLIGHT, poison/4), damDesc(self, DamageType.BLIGHT, poison), Desc.vs"ss" )
 	end
 }
 
@@ -332,11 +332,10 @@ newTalent{
 info = function(self, t)
 	local chance = t.getChance(self,t)
 	local duration = t.getDuration(self,t)
-		return ([[You have a %d%% chance on dealing blight damage to cause the target to rot away, silencing, disarming, blinding or pinning them for %d turns. This effect has a cooldown.
+		return ([[You have a %d%% chance on dealing blight damage to cause the target to rot away, silencing, disarming, blinding or pinning them for %d turns %s. This effect has a cooldown.
 At talent level 4, this affects targets in a radius 1 ball.
-Your worms also have a %d%% chance to blind, silence, disarm or pin with their melee attacks, lasting 2 turns.
-The chance to apply this effect will increase with your Spellpower.]]):
-		tformat(chance, duration, chance/2)
+Your worms also have a %d%% chance to blind, silence, disarm or pin with their melee attacks %s, lasting 2 turns.]]):
+		tformat(chance, duration, Desc.vs("sp", Desc.max("ps", "ms")), chance/2, Desc.vs"ss")
 	end,
 }
 
@@ -389,11 +388,11 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local burst = t.getBurstDamage(self, t)
 		local chance = t.getChance(self,t)
-		return ([[Infects the target with parasitic carrion worm larvae for 5 turns.  Each turn the disease will remove a beneficial physical effect and deal %0.2f acid and %0.2f blight damage.
+		return ([[Infects the target with parasitic carrion worm larvae for 5 turns %s.  Each turn the disease will remove a beneficial physical effect and deal %0.2f acid and %0.2f blight damage.
 If not cleared after five turns it will inflict %0.2f blight damage as the larvae hatch, removing the effect but spawning a full grown carrion worm mass near the target's location.
 Even if this disease is removed early, there is still a %d%% chance for the larvae to hatch.
 You can never have more than 5 worms active from any source at a time.
 The damage dealt will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.ACID, (damage/2)), damDesc(self, DamageType.BLIGHT, (damage/2)), damDesc(self, DamageType.BLIGHT, (burst)), chance)
+		tformat(Desc.vs"ss", damDesc(self, DamageType.ACID, (damage/2)), damDesc(self, DamageType.BLIGHT, (damage/2)), damDesc(self, DamageType.BLIGHT, (burst)), chance)
 	end,
 }
diff --git a/game/modules/tome/data/talents/corruptions/scourge.lua b/game/modules/tome/data/talents/corruptions/scourge.lua
index 564860ab9a4b5c4e308c915622037b9e8d5ad725..f0188287e7ca75ecaeeceac261a6e88281deea6a 100644
--- a/game/modules/tome/data/talents/corruptions/scourge.lua
+++ b/game/modules/tome/data/talents/corruptions/scourge.lua
@@ -217,7 +217,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Corrupt the target reducing disease immunity by 100%% for 2 turns and stripping up to 2 nature sustains then strike with both your weapons dealing %d%% damage.]]):
-		tformat(100 * t.getDamage(self, t))
+		return ([[Corrupt the target reducing disease immunity by 100%% for 2 turns and stripping up to 2 nature sustains then strike with both your weapons dealing %d%% damage %s.]]):
+		tformat(100 * t.getDamage(self, t), Desc.vs())
 	end,
 }
diff --git a/game/modules/tome/data/talents/corruptions/torment.lua b/game/modules/tome/data/talents/corruptions/torment.lua
index 3c0a7d8702f44fee03a0276bd0858624e5091232..baf1cb63c8610469bcc3eec76767207512457324 100644
--- a/game/modules/tome/data/talents/corruptions/torment.lua
+++ b/game/modules/tome/data/talents/corruptions/torment.lua
@@ -64,8 +64,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Reach out and touch the blood and health of your foes. Any creatures caught in the radius 2 ball will be unable to heal above their current life value (at the time of the casting) for %d turns.]]):
-		tformat(t.getDuration(self, t))
+		return ([[Reach out and touch the blood and health of your foes. Any creatures caught in the radius 2 ball will be unable to heal above their current life value (at the time of the casting) for %d turns %s.]]):
+		tformat(t.getDuration(self, t), Desc.vs"ss")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/corruptions/vile-life.lua b/game/modules/tome/data/talents/corruptions/vile-life.lua
index 929ff3f4a6733c2ae7effbdb88c2ef663d7357f7..93c1ce8402a119a98e146ba1bb36772e3c33b000 100644
--- a/game/modules/tome/data/talents/corruptions/vile-life.lua
+++ b/game/modules/tome/data/talents/corruptions/vile-life.lua
@@ -107,20 +107,21 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local desc = Desc.vs"sp"
 		return ([[Use elemental damage dealt to you to trigger terrible effects on the source:
-		- Fire: burn for %0.2f fire damage over 5 turns
-		- Cold: freeze for 3 turns with %d iceblock power
-		- Acid: blind for %d turns
-		- Lightning: daze for %d turns
-		- Nature: %d%% slow for 4 turns
+		- Fire: burn for %0.2f fire damage over 5 turns %s
+		- Cold: freeze for 3 turns with %d iceblock power %s
+		- Acid: blind for %d turns %s
+		- Lightning: daze for %d turns %s
+		- Nature: %d%% slow for 4 turns %s
 		This effect can only happen once every 10 turns per damage type.
 		The damage will increase with your Spellpower.]]):
 		tformat(
-			damDesc(self, DamageType.FIRE, t.getFire(self, t)),
-			t.getCold(self, t),
-			t.getAcid(self, t),
-			t.getLightning(self, t),
-			t.getNature(self, t)
+			damDesc(self, DamageType.FIRE, t.getFire(self, t)), desc,
+			t.getCold(self, t), desc,
+			t.getAcid(self, t), desc,
+			t.getLightning(self, t), desc,
+			t.getNature(self, t), desc
 		)
 	end,
 }
@@ -152,9 +153,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You manipulate the vim of enemies in radius %d to temporarily invert all healing done to them (but not natural regeneration).
+		return ([[You manipulate the vim of enemies in radius %d to temporarily invert all healing done to them (but not natural regeneration) %s.
 		For 5 turns all healing will instead damage them for %d%% of the healing done as blight.
-		The effect will increase with your Spellpower.]]):tformat(self:getTalentRadius(t), t.getPower(self,t))
+		The effect will increase with your Spellpower.]]):tformat(self:getTalentRadius(t), Desc.vs"ss", t.getPower(self,t))
 	end,
 }
 
@@ -209,9 +210,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You transfer up to %d physical or magical detrimental effects currently affecting you to a nearby creature at a cost of %d vim per effect.
-		Specific effect immunities will not prevent the transfer.
-		The chance to transfer each effect increases with your Spellpower.]]):
-		tformat(t.getNb(self, t), t.getVim(self, t))
+		return ([[You transfer up to %d physical or magical detrimental effects currently affecting you to a nearby creature at a cost of %d vim per effect %s.
+		Specific effect immunities will not prevent the transfer.]]):
+		tformat(t.getNb(self, t), t.getVim(self, t), Desc.vs"ss")
 	end,
 }
diff --git a/game/modules/tome/data/talents/corruptions/vim.lua b/game/modules/tome/data/talents/corruptions/vim.lua
index 822cfd9dd564f935f12ec03c175d282853a673e7..3adf73ed6d278dbbb9ace7ce4048bacf57dcf986 100644
--- a/game/modules/tome/data/talents/corruptions/vim.lua
+++ b/game/modules/tome/data/talents/corruptions/vim.lua
@@ -94,9 +94,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Open a dark portal (radius 3) to the target zone. All creatures caught inside will be teleported to your location, and you to theirs.
-		All creatures (except you) traversing the portal will catch a random disease, doing %0.2f blight damage per turn for 6 turns and reducing one of its physical stats (strength, constitution, dexterity) by %d.
-		The damage will increase with your Spellpower.]]):tformat(damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 12, 80)), self:combatTalentSpellDamage(t, 5, 25))
+		return ([[Open a dark portal (radius 3) to the target zone. All creatures caught inside will be teleported to your location %s, and you to theirs.
+		All creatures (except you) traversing the portal will catch a random disease %s, doing %0.2f blight damage per turn for 6 turns and reducing one of its physical stats (strength, constitution, dexterity) by %d.
+		The damage will increase with your Spellpower.]]):tformat(Desc.vs"ss", Desc.vs(), damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 12, 80)), self:combatTalentSpellDamage(t, 5, 25))
 	end,
 }
 
@@ -132,9 +132,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Feel the very existence of creatures around you for %d turns, in a radius of 10.
-		The evil touch will reduce their blight resistance by %d%% and all saves by %d, but also make them aware of you.
+		The evil touch will reduce their blight resistance by %d%% and all saves by %d for 2 turns %s, but also make them aware of you.
 		The resistance and save reduction will improve with your Spellpower.]]):
-		tformat(t.getDuration(self,t), t.getResistPenalty(self,t), t.getSaves(self, t))
+		tformat(t.getDuration(self,t), t.getResistPenalty(self,t), t.getSaves(self, t), Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cunning/ambush.lua b/game/modules/tome/data/talents/cunning/ambush.lua
index c9c60b829a0bbd5e612adb81a5fd1817e5bb1826..73b9c5abd17e94d95ff60fb1cee9022ede361ed6 100644
--- a/game/modules/tome/data/talents/cunning/ambush.lua
+++ b/game/modules/tome/data/talents/cunning/ambush.lua
@@ -101,10 +101,10 @@ newTalent{
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[You reach out with the shadows silencing and disarming your target for %d turns.
+		return ([[You reach out with the shadows silencing %s and disarming %s your target for %d turns.
 		The shadows will deal %d darkness damage to the target and pull it to you.
 		The chance to apply debuffs improves with your Accuracy and the damage with your Spellpower.]]):
-		tformat(duration, damDesc(self, DamageType.DARKNESS, damage))
+		tformat(Desc.vs"am", Desc.vs"ap", duration, damDesc(self, DamageType.DARKNESS, damage))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cunning/artifice.lua b/game/modules/tome/data/talents/cunning/artifice.lua
index 19e1e215902f9dbb5e9c8e4d1d2af15c73b6b2de..9ccf16f4cfce7f983dcd57168152334f11512707 100644
--- a/game/modules/tome/data/talents/cunning/artifice.lua
+++ b/game/modules/tome/data/talents/cunning/artifice.lua
@@ -579,10 +579,10 @@ newTalent{
 		for slot_id, tool_id in pairs(self.artifice_tools or {}) do
 			if tool_id == t.id then slot = self:getTalentFromId(slot_id).name break end
 		end
-		return ([[Throw a vial of volatile liquid that explodes in a radius %d cloud of smoke lasting %d turns.  The smoke blocks line of sight, and enemies within will have their vision range reduced by %d.
+		return ([[Throw a vial of volatile liquid that explodes in a radius %d cloud of smoke lasting %d turns.  The smoke blocks line of sight, and enemies within will have their vision range reduced by %d %s.
 		Use of this talent will not break stealth, and creatures affected by the smokes can never prevent you from activating stealth, even if their proximity would normally forbid it.
 		#YELLOW#Prepared with: %s#LAST#]]):
-		tformat(self:getTalentRadius(t), t.getDuration(self, t), t.getSightLoss(self,t), slot)
+		tformat(self:getTalentRadius(t), t.getDuration(self, t), t.getSightLoss(self,t), Desc.vs"ap", slot)
 	end,
 }
 
@@ -657,10 +657,10 @@ newTalent{
 		for slot_id, tool_id in pairs(self.artifice_tools or {}) do
 			if tool_id == t.id then slot = self:getTalentFromId(slot_id).name break end
 		end
-		return ([[Fire a poisoned dart from a silent, concealed launcher on your person that deals %0.2f physical damage and puts the target (living only) to sleep for 4 turns, rendering them unable to act. Every %d points of damage the target takes brings it closer to waking by 1 turn.
+		return ([[Fire a poisoned dart from a silent, concealed launcher on your person that deals %0.2f physical damage and puts the target (living only) to sleep for 4 turns %s, rendering them unable to act. Every %d points of damage the target takes brings it closer to waking by 1 turn.
 This can be used without breaking stealth.
 #YELLOW#Prepared with: %s#LAST#]]):
-	tformat(damDesc(self, DamageType.PHYSICAL, dam), power, slot)
+	tformat(damDesc(self, DamageType.PHYSICAL, dam), Desc.vs"ap", power, slot)
 	end,
 }
 
@@ -798,10 +798,10 @@ newTalent{
 		for slot_id, tool_id in pairs(self.artifice_tools or {}) do
 			if tool_id == t.id then slot = self:getTalentFromId(slot_id).name break end
 		end
-		return ([[Toss out a grappling hook to a target within range %d.  If this strikes either a wall or a creature that is immovable or larger than you, you will pull yourself towards it, otherwise, you will drag the target towards you.  Creatures struck by the hook will be pinned for 2 turns.
+		return ([[Toss out a grappling hook to a target within range %d.  If this strikes either a wall or a creature that is immovable or larger than you, you will pull yourself towards it, otherwise, you will drag the target towards you.  Creatures struck by the hook will be pinned for 2 turns %s.
 		Your grapple target must be at least 2 tiles from you.
 #YELLOW#Prepared with: %s#LAST#]]):
-	tformat(range, slot)
+	tformat(range, Desc.vs"ap", slot)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cunning/called-shots.lua b/game/modules/tome/data/talents/cunning/called-shots.lua
index afdb2489493acb7cd9a51d65d2d82cf2cd66b0e6..42b3ed1654c894047aacd5ce1b78b214e42472b1 100644
--- a/game/modules/tome/data/talents/cunning/called-shots.lua
+++ b/game/modules/tome/data/talents/cunning/called-shots.lua
@@ -107,13 +107,14 @@ newTalent {
 	speed = "archery",
 	action = fire_shot,
 	info = function(self, t)
-		return ([[Strike your opponent in the knee (or other critical point in an ambulatory appendage) for %d%% weapon damage, knocking them down (%d turn pin) and slowing their movement by %d%% for %d turns afterwards.
+		return ([[Strike your opponent in the knee (or other critical point in an ambulatory appendage) for %d%% weapon damage, knocking them down (%d turn pin) and slowing their movement by %d%% for %d turns afterwards %s.
 		This shot will bypass other enemies between you and your target.
 		The slow effect becomes more powerful with your Cunning.]])
 		:tformat(t.damage_multiplier(self, t) * 100,
 				t.pin_duration(self, t),
 				t.slow_power(self, t) * 100,
-				t.slow_duration(self, t))
+				t.slow_duration(self, t),
+				Desc.vs"ap")
 	end,
 }
 
@@ -216,10 +217,9 @@ newTalent {
 	action = fire_shot,
 	info = function(self, t)
 		return ([[Fire three shots in quick succession at a vulnerable point on the target (usually the head).
-		Each shot deals %d%% Ranged damage and will try to stun or increase the target's stun duration by 1.
-		These shots will bypass other enemies between you and your target.
-		The chance to stun increases with your Accuracy.]])
-		:tformat(t.damage_multiplier(self, t) * 100)
+		Each shot deals %d%% Ranged damage and will try to stun or increase the target's stun duration by 1 %s.
+		These shots will bypass other enemies between you and your target.]])
+		:tformat(t.damage_multiplier(self, t) * 100, Desc.vs"ap")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cunning/dirty.lua b/game/modules/tome/data/talents/cunning/dirty.lua
index 7a605e104bd5d293d1323c797680388bf27fb53f..598f1aa53fcbdcbda5b87608425aff3218ee5afd 100644
--- a/game/modules/tome/data/talents/cunning/dirty.lua
+++ b/game/modules/tome/data/talents/cunning/dirty.lua
@@ -104,9 +104,8 @@ newTalent{
 	local chance = t.getDisableChance(self,t)
 		return ([[Your quick wit gives you a big advantage against disabled targets, increasing your damage by %d%% for each disabling effect the target is under, to a maximum of %d%%.
 For this purpose, disabling effects are stun, blind, daze, confuse, pin, disarm, cripple and silence.
-In addition, for each disabling effect the target is under, your melee attacks have a %d%% (to a maximum of %d%%) chance to inflict a new effect on them (that they do not already have): either disarm, cripple (25%% power) or pin for 2 turns.
-The chance to further disable the target increases with your Accuracy.]]):
-		tformat(dam, dam*3, chance, chance*3)
+In addition, for each disabling effect the target is under, your melee attacks have a %d%% (to a maximum of %d%%) chance to inflict a new effect on them (that they do not already have): either disarm, cripple (25%% power) or pin for 2 turns %s.]]):
+		tformat(dam, dam*3, chance, chance*3, Desc.vs"ap")
 	end,
 }
 
@@ -142,8 +141,8 @@ newTalent{
 		local accuracy = t.getAcc(self,t)
 		local speed = t.getSlow(self,t)
 		local duration = t.getDuration(self, t)
-		return ([[Throw a cloud of blinding dust in a radius %d cone. Enemies within will be blinded, as well as having their accuracy reduced by %d and movement speed decreased by %d%% for %d turns.
-		The chance to inflict these effects increase with your Accuracy.]]):tformat(self:getTalentRadius(t), accuracy, speed, duration)
+		return ([[Throw a cloud of blinding dust in a radius %d cone. Enemies within will be blinded, as well as having their accuracy reduced by %d and movement speed decreased by %d%% for %d turns %s.
+		]]):tformat(self:getTalentRadius(t), accuracy, speed, duration, Desc.vs"ap")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cunning/scoundrel.lua b/game/modules/tome/data/talents/cunning/scoundrel.lua
index 752081ac5ff7609189c50864d03322be2eec7243..5a496aeba61511a39e67bf8d2a6a0a6a2ce6d002 100644
--- a/game/modules/tome/data/talents/cunning/scoundrel.lua
+++ b/game/modules/tome/data/talents/cunning/scoundrel.lua
@@ -150,10 +150,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Your abilities in sowing confusion and chaos have reached their peak.  Whenever a foe attempts to apply a detrimental physical effect to you, they have a %d%% chance to fail. If there is an adjacent enemy to you, you misdirect your foe into applying it to them at %d%% duration.
-You gain %d defense.
-The chance to apply status effects increases with your Accuracy and the Defense with your Cunning.]]):
-		tformat(t.getChance(self,t),t.getDuration(self,t), t.getDefense(self, t))
+		return ([[Your abilities in sowing confusion and chaos have reached their peak.  Whenever a foe attempts to apply a detrimental physical effect to you, they have a %d%% chance to fail. If there is an adjacent enemy to you, you misdirect your foe into applying it to them at %d%% duration %s.
+You gain %d defense.]]):
+		tformat(t.getChance(self,t),t.getDuration(self,t), Desc.vs"ap", t.getDefense(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cunning/shadow-magic.lua b/game/modules/tome/data/talents/cunning/shadow-magic.lua
index 30d2550bac9367125cadcd2e8d3a966b2a2ad65f..3f415529440508ab525715c52c172235d2430b14 100644
--- a/game/modules/tome/data/talents/cunning/shadow-magic.lua
+++ b/game/modules/tome/data/talents/cunning/shadow-magic.lua
@@ -153,9 +153,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Step through the shadows to your target, dazing it for %d turns and hitting it with all your weapons for %d%% darkness weapon damage.
+		return ([[Step through the shadows to your target, dazing it for %d turns %s and hitting it with all your weapons for %d%% darkness weapon damage.
 		Dazed targets are significantly impaired, but any damage will free them.
 		To Shadowstep, you need to be able to see the target.]]):
-		tformat(duration, t.getDamage(self, t) * 100)
+		tformat(duration, Desc.vs(), t.getDamage(self, t) * 100)
 	end,
 }
diff --git a/game/modules/tome/data/talents/cunning/tactical.lua b/game/modules/tome/data/talents/cunning/tactical.lua
index b0627cecc1738a82d8f05b86a9686c06c2c0dcdc..2972862d04cc61d7d590e03d511215f6aeb0c245 100644
--- a/game/modules/tome/data/talents/cunning/tactical.lua
+++ b/game/modules/tome/data/talents/cunning/tactical.lua
@@ -111,8 +111,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t) * 100
 		return ([[When you avoid a melee blow from an adjacent foe, you have a %d%% chance to get a free, automatic melee attack against the attacker for %d%% damage, up to %0.1f times per turn.
-		Unarmed fighters using it will also attempt to throw the target to the ground if the attack lands, dazing them for 2 turns or stunning them for 2 turns if the target is grappled.
-		The chance of countering and number of counter attacks increase with your Cunning.]]):tformat(t.counterchance(self,t), damage,  t.getCounterAttacks(self, t))
+		Unarmed fighters using it will also attempt to throw the target to the ground if the attack lands, dazing them for 2 turns or stunning them for 2 turns if the target is grappled %s.
+		The chance of countering and number of counter attacks increase with your Cunning.]]):tformat(t.counterchance(self,t), damage,  t.getCounterAttacks(self, t), Desc.vs"ap")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cunning/traps.lua b/game/modules/tome/data/talents/cunning/traps.lua
index e67f2b109b70cfefcffc3af28c31be66d7e185ff..2fa5e7fab3256542f544559d1c0349bc388aa291 100644
--- a/game/modules/tome/data/talents/cunning/traps.lua
+++ b/game/modules/tome/data/talents/cunning/traps.lua
@@ -1166,9 +1166,9 @@ newTalent{
 		return ([[Deals %0.2f physical damage.  Target removed from combat or pinned 5 turns.]]):tformat(damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
 	end,
 	info = function(self, t)
-		return ([[Lay a pressure triggered trap that collapses the ground under the target, dealing %0.2f physical damage while burying them (removing from combat) for 5 turns.
-Victims may resist being buried, in which case they are pinned (ignores 50%% pin immunity) instead.]]):
-		tformat(damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
+		return ([[Lay a pressure triggered trap that collapses the ground under the target, dealing %0.2f physical damage while burying them (removing from combat) for 5 turns %s.
+Victims may resist being buried, in which case they are pinned (ignores 50%% pin immunity) instead %s.]]):
+		tformat(damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)), Desc.vs"ap", Desc.vs())
 	end,
 }
 
@@ -1459,9 +1459,9 @@ newTalent{
 	info = function(self, t)
 		local instant = self.trap_primed == t.id and _t"\n#YELLOW#Triggers immediately when placed.#LAST#" or ""
 		return ([[Lay a trap that releases a radius 3 cloud of thick poisonous gas lasting 4 turns.
-		Each turn, the cloud poisons all within (%0.2f nature damage over 5 turns).   There is a 25%% chance the poison is enhanced with crippling, numbing or insidious effects.
+		Each turn, the cloud poisons all within (%0.2f nature damage over 5 turns) %s.   There is a 25%% chance the poison is enhanced with crippling, numbing or insidious effects.
 		This trap can use a primed trigger and a high level lure can trigger it.%s]]):
-		tformat(damDesc(self, DamageType.POISON, t.getDamage(self, t)), instant)
+		tformat(damDesc(self, DamageType.POISON, t.getDamage(self, t)), Desc.vs"ap", instant)
 	end,
 }
 
@@ -1760,11 +1760,11 @@ newTalent{
 		tformat(t.getDuration(self,t), damDesc(self, engine.DamageType.TEMPORAL, t.getDamage(self, t)))
 	end,
 	info = function(self, t)
-		return ([[Lay a trap that creates a radius 5 gravitic anomaly when triggered by foes approaching within range 1.  Each turn, the anomaly deals %0.2f temporal damage (based on your Magic) to foes while pulling them towards its center (chance increases with your combat accuracy or spell power, whichever is higher).
+		return ([[Lay a trap that creates a radius 5 gravitic anomaly when triggered by foes approaching within range 1.  Each turn, the anomaly deals %0.2f temporal damage (based on your Magic) to foes while pulling them towards its center %s.
 		Each anomaly lasts %d turns (up to the amount of time since the last anomaly dissipated, based on your Trap Mastery skill).
 		The trap may trigger more than once, but requires at least 2 turns to recharge between activations.
 This design does not require advanced preparation to use.]]):
-		tformat(damDesc(self, engine.DamageType.TEMPORAL, t.getDamage(self, t)), t.getDuration(self,t))
+		tformat(damDesc(self, engine.DamageType.TEMPORAL, t.getDamage(self, t)), Desc.vs(Desc.max("acc", "sp"), "ps"), t.getDuration(self,t))
 	end,
 }
 
@@ -2149,10 +2149,10 @@ newTalent{
 		tformat(t.getDistance(self, t))
 	end,
 	info = function(self, t)
-		return ([[Deploy a hidden spring-loaded catapult that will trigger (by pressure) for any creature passing over it.  Victims will be knocked back towards a target location up to %d grids away and be dazed for 5 turns.
+		return ([[Deploy a hidden spring-loaded catapult that will trigger (by pressure) for any creature passing over it.  Victims will be knocked back %s towards a target location up to %d grids away and be dazed for 5 turns.
 		This trap has a %d%% chance to reset itself after triggering, but can only trigger once per turn.
 		The chance to affect the target improves with your combat accuracy.]]):
-		tformat(t.getDistance(self, t), t.resetChance(self, t))
+		tformat(t.getDistance(self, t),  Desc.vs"ap", t.resetChance(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cursed/advanced-shadowmancy.lua b/game/modules/tome/data/talents/cursed/advanced-shadowmancy.lua
index 34c54ca93783c7374a21d8f8834296a4bf3999a9..be68e45e3e9e03a448bc1024565c12e1e1eb8a27 100644
--- a/game/modules/tome/data/talents/cursed/advanced-shadowmancy.lua
+++ b/game/modules/tome/data/talents/cursed/advanced-shadowmancy.lua
@@ -57,9 +57,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Target a nearby shadow, and command it to merge into a nearby enemy, reducing their damage by %d%% for 5 turns.
+		return ([[Target a nearby shadow, and command it to merge into a nearby enemy, reducing their damage by %d%% for 5 turns %s.
 		Killing your shadow releases some of your inner hatred, restoring 8 Hate to yourself.]]):
-		tformat(t.getReduction(self, t))
+		tformat(t.getReduction(self, t), Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cursed/crimson-templar.lua b/game/modules/tome/data/talents/cursed/crimson-templar.lua
index 629b87cc035cc481aa2cb5d1cbf23a408f55fc55..9fac844c0c7435300483c07a6d97a7274d5e626c 100644
--- a/game/modules/tome/data/talents/cursed/crimson-templar.lua
+++ b/game/modules/tome/data/talents/cursed/crimson-templar.lua
@@ -128,12 +128,11 @@ newTalent{
 		local burn = t.getStrength(self, t)
 		local cost = t.getPrice(self, t)
 		local dur = t.getDuration(self, t)
-		return ([[When you kill an enemy, their death forms a cursed magical pattern on the ground. This creates a circle of radius %d which blinds enemies and deals them %0.2f light damage, while giving you %d positive energy per turn. The circle lasts for %d turns.
+		return ([[When you kill an enemy, their death forms a cursed magical pattern on the ground. This creates a circle of radius %d which blinds enemies %s and deals them %0.2f light damage, while giving you %d positive energy per turn. The circle lasts for %d turns.
 							The damage will increase with your Spellpower.
 							The duration of the circle can be increased by a critical hit.
-							The blind chance increases with your Spellpower.
 							You can activate this talent to draw the pattern in your own blood, creating it underneath you at the cost of %d%% of your maximum life.
-]]):tformat(rad, damDesc(self, DamageType.LIGHT, burn), 2, dur, cost)
+]]):tformat(rad, Desc.vs"sp", damDesc(self, DamageType.LIGHT, burn), 2, dur, cost)
 	end,
 }
 
@@ -170,10 +169,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Dooms all enemies within a radius 2 ball for 20 turns. Each time an affected target uses a talent, it takes %0.2f physical damage as its life is drawn out. In addition, any bleed applied to the target will have its power increased by %d%%.
+		return ([[Dooms all enemies within a radius 2 ball for 20 turns %s. Each time an affected target uses a talent, it takes %0.2f physical damage as its life is drawn out. In addition, any bleed applied to the target will have its power increased by %d%%.
 							The damage will increase with your Spellpower.
 							The chance to apply will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.PHYSICAL, t.getPower(self, t)), t.getBleedIncrease(self, t)*100)
+		tformat(Desc.vs"ss", damDesc(self, DamageType.PHYSICAL, t.getPower(self, t)), t.getBleedIncrease(self, t)*100)
 	end,
 }
 
@@ -263,10 +262,9 @@ newTalent{
 		local conversion = t.getConversion(self, t)*100
 		local minimum = t.getMinHeal(self, t)
 		local extension = t.getExtension(self, t)
-		return ([[Draw on the wounds of enemies within range 10, healing yourself and putting them into a merciful sleep.
-							The sleep chance increases with your Spellpower.
+		return ([[Draw on the wounds of enemies within range 10, healing yourself and putting them into a merciful sleep %s.
 							You are healed for %d%% of the remaining damage of bleed effects on enemies in range (minimum %d per bleed). Enemies fall asleep for %d turns longer than their longest-lasting bleed, rendering them unable to act. The strength of the sleep effect is based on the strength of the bleed. Excess damage will reduce their sleep duration.
 							
-							When the sleep ends, each target will benefit from Insomnia for a number of turns equal to the amount of time it was asleep (up to ten turns max), granting it 50%% sleep immunity.]]):tformat(conversion, minimum, extension)
+							When the sleep ends, each target will benefit from Insomnia for a number of turns equal to the amount of time it was asleep (up to ten turns max), granting it 50%% sleep immunity.]]):tformat(Desc.vs"sm", conversion, minimum, extension)
 	end,
 }
diff --git a/game/modules/tome/data/talents/cursed/dark-sustenance.lua b/game/modules/tome/data/talents/cursed/dark-sustenance.lua
index f8d39db9618fff1697516935b12d26a59bfa9bf4..80c503fc88515d214e60e58cf6cf5a61eaaf9008 100644
--- a/game/modules/tome/data/talents/cursed/dark-sustenance.lua
+++ b/game/modules/tome/data/talents/cursed/dark-sustenance.lua
@@ -113,9 +113,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local hateGain = t.getHateGain(self, t)
-		return ([[Feed from the essence of your enemy. Draws %0.1f hate per turn from a targeted foe, as long as they remain in your line of sight.
+		return ([[Feed from the essence of your enemy. Draws %0.1f hate per turn from a targeted foe, as long as they remain in your line of sight %s.
 			If you aren't already feeding this will be automatically applied to the nearest enemy.
-		Hate gain improves with your Mindpower.]]):tformat(hateGain)
+		Hate gain improves with your Mindpower.]]):tformat(hateGain, Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cursed/darkness.lua b/game/modules/tome/data/talents/cursed/darkness.lua
index af0552ff5a83d1bdf8dbd71766a87abdf519fc4a..f9b428f53f53f141f24764d6aabb8dc036476960 100644
--- a/game/modules/tome/data/talents/cursed/darkness.lua
+++ b/game/modules/tome/data/talents/cursed/darkness.lua
@@ -430,9 +430,9 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local damageIncrease = getDamageIncrease(self)
-		return ([[Sends a torrent of searing darkness through your foes, doing %d darkness damage. There is a 25%% chance the rushing darkness will blind them for 3 turns and cause them to lose track of their target.
+		return ([[Sends a torrent of searing darkness through your foes, doing %d darkness damage. There is a 25%% chance the rushing darkness will blind them for 3 turns %s and cause them to lose track of their target %s.
 		If you know the Creeping Darkness talent, a short-lived trail of darkness is left in the beam's wake. Its damage is identical to that of Creeping Darkness's.
-		The damage will increase with your Mindpower. You do +%d%% damage to anything that has entered your creeping dark.]]):tformat(damDesc(self, DamageType.DARKNESS, damage), damageIncrease)
+		The damage will increase with your Mindpower. You do +%d%% damage to anything that has entered your creeping dark.]]):tformat(damDesc(self, DamageType.DARKNESS, damage), Desc.vs"mp", Desc.vs(), damageIncrease)
 	end,
 }
 
@@ -474,7 +474,7 @@ newTalent{
 		local pinDuration = t.getPinDuration(self, t)
 		local damage = t.getDamage(self, t)
 		local damageIncrease = getDamageIncrease(self)
-		return ([[Spawn tendrils of darkness to pursue a single target for up to 12 turns, leaving behind a trail of creeping darkness as they move. Targets seized by the tendrils are pinned for %d turns and shrouded in darkness. The darkness deals %0.2f damage per turn to those within.
-		The damage will increase with your Mindpower. You do +%d%% damage to anything that has entered your creeping dark.]]):tformat(pinDuration, damage, damageIncrease)
+		return ([[Spawn tendrils of darkness to pursue a single target for up to 12 turns, leaving behind a trail of creeping darkness as they move. Targets seized by the tendrils are pinned for %d turns %s and shrouded in darkness. The darkness deals %0.2f damage per turn to those within.
+		The damage will increase with your Mindpower. You do +%d%% damage to anything that has entered your creeping dark.]]):tformat(pinDuration, Desc.vs(), damage, damageIncrease)
 	end,
 }
diff --git a/game/modules/tome/data/talents/cursed/fears.lua b/game/modules/tome/data/talents/cursed/fears.lua
index 5ef9bb010cf48b2832eb9933319b17862456da87..1f1755009b36901edd35b8aeee43704acf9af3a1 100644
--- a/game/modules/tome/data/talents/cursed/fears.lua
+++ b/game/modules/tome/data/talents/cursed/fears.lua
@@ -185,8 +185,7 @@ newTalent{
 		local damInstil = t.getDamage(self, t) / 2
 		local damTerri = t.getTerrifiedDamage(self, t) / 2
 		local damHaunt = t.getHauntedDamage(self, t) / 2
-		return ([[Instill fear in your foes within %d radius of a target location dealing %0.2f mind and %0.2f darkness damage and causing one of 4 possible fears that last for %d turns.
-		The targets can save vs your Mindpower to resist the effect.
+		return ([[Instill fear in your foes within %d radius of a target location dealing %0.2f mind and %0.2f darkness damage and causing one of 4 possible fears that last for %d turns %s.
 		Fear effects improve with your Mindpower.
 
 		Possible fears are:
@@ -194,7 +193,7 @@ newTalent{
 		#ORANGE#Despair:#LAST# Reduces mind resist, mindsave, armour and defence by %d.
 		#ORANGE#Terrified:#LAST# Deals %0.2f mind and %0.2f darkness damage per turn and increases cooldowns by %d%%.
 		#ORANGE#Haunted:#LAST# Causes the target to suffer %0.2f mind and %0.2f darkness damage for each detrimental mental effect every turn.
-		]]):tformat(self:getTalentRadius(t), damDesc(self, DamageType.MIND, damInstil), damDesc(self, DamageType.DARKNESS, damInstil), t.getDuration(self, t),
+		]]):tformat(self:getTalentRadius(t), damDesc(self, DamageType.MIND, damInstil), damDesc(self, DamageType.DARKNESS, damInstil), t.getDuration(self, t), Desc.vs"mm",
 		t.getParanoidAttackChance(self, t),
 		-t.getDespairStatChange(self, t),
 		damDesc(self, DamageType.MIND, damTerri), damDesc(self, DamageType.DARKNESS, damTerri), t.getTerrifiedPower(self, t),
diff --git a/game/modules/tome/data/talents/cursed/force-of-will.lua b/game/modules/tome/data/talents/cursed/force-of-will.lua
index 3e43a98c580a44d8944ea3034d9555c0aa097429..a0b2eef9fab594241f66ba76404f5b28e029ae2e 100644
--- a/game/modules/tome/data/talents/cursed/force-of-will.lua
+++ b/game/modules/tome/data/talents/cursed/force-of-will.lua
@@ -319,9 +319,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local knockback = t.getKnockback(self, t)
 		local dazeDuration = t.getDazeDuration(self, t)
-		return ([[You rage coalesces at a single point, and then explodes outward, blasting enemies within a radius of %d in all directions. The blast causes %d damage and %d knockback at the center, that decreases with distance. Anyone caught in the explosion will also be dazed for 3 turns.
+		return ([[You rage coalesces at a single point, and then explodes outward, blasting enemies within a radius of %d in all directions. The blast causes %d damage and %d knockback at the center, that decreases with distance. Anyone caught in the explosion will also be dazed for 3 turns %s.
 		In addition, your ability to channel force with this talent increases all critical damage by %d%% (currently: %d%%)
-		Damage increases with your Mindpower.]]):tformat(radius, damDesc(self, DamageType.PHYSICAL, damage), knockback, t.critpower(self, t), self.combat_critical_power or 0)
+		Damage increases with your Mindpower.]]):tformat(radius, damDesc(self, DamageType.PHYSICAL, damage), knockback, Desc.vs(), t.critpower(self, t), self.combat_critical_power or 0)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cursed/gestures.lua b/game/modules/tome/data/talents/cursed/gestures.lua
index 3b53074c534987a9660d9d3aa288ed90d53c50c9..873793c5906fa3c18c958961b1f1d1fd944502a4 100644
--- a/game/modules/tome/data/talents/cursed/gestures.lua
+++ b/game/modules/tome/data/talents/cursed/gestures.lua
@@ -198,12 +198,12 @@ newTalent{
 		local stunChance = t.getStunChance(self, t)
 		local bonusDamage = t.getBonusDamage(self, t)
 		local bonusCritical = t.getBonusCritical(self, t)
-		return ([[Use a gesture of pain in place of a normal attack to assault the minds of your enemies, inflicting between %0.1f and %0.1f mind damage. If the attack succeeds, there is a %d%% chance to stun your opponent for 3 turns.
+		return ([[Use a gesture of pain in place of a normal attack to assault the minds of your enemies, inflicting between %0.1f and %0.1f mind damage %s. If the attack succeeds, there is a %d%% chance to stun your opponent for 3 turns %s.
 		This strike replaces your melee physical and checks your Mindpower against your opponent's Mental Save, and is thus not affected by your Accuracy or the enemy's Defense. The base damage (doubled) and the critical chance of any Mindstars equipped are added in when this attack is performed.
 		This talent requires two free or mindstar-equipped hands and has a 25%% chance to inflict brainlock, which can critically hit. The damage will increase with your Mindpower.
 		If attacking with two mindstars the attack will trigger their proc effects, if any.
 		Mindstars bonuses from damage and physical criticals: (+%d damage, +%d critical chance)]])
-		:tformat(damDesc(self, DamageType.MIND, baseDamage * 0.5), damDesc(self, DamageType.MIND, baseDamage), stunChance, bonusDamage, bonusCritical)
+		:tformat(damDesc(self, DamageType.MIND, baseDamage * 0.5), damDesc(self, DamageType.MIND, baseDamage), Desc.vs"mm", stunChance, Desc.vs"mp", bonusDamage, bonusCritical)
 	end,
 }
 
@@ -223,8 +223,8 @@ newTalent{
 	info = function(self, t)
 		local resistAllChange = t.getResistAllChange(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Enhance your Gesture of Pain with a malicious curse that causes any victim that is struck to have all resistances lowered by %d%% for %d turns.
-		]]):tformat(-resistAllChange, duration)
+		return ([[Enhance your Gesture of Pain with a malicious curse that causes any victim that is struck to have all resistances lowered by %d%% for %d turns %s.
+		]]):tformat(-resistAllChange, duration, Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cursed/gloom.lua b/game/modules/tome/data/talents/cursed/gloom.lua
index b03a440c6a07886c6439f5e4c9a55cf269ac0fc6..06abe536d312d41f77f4c4a51610019c57ee26b1 100644
--- a/game/modules/tome/data/talents/cursed/gloom.lua
+++ b/game/modules/tome/data/talents/cursed/gloom.lua
@@ -121,10 +121,10 @@ newTalent{
 		local chance = t.getChance(self, t)
 		local duration = t.getDuration(self, t)
 		local mindpowerChange = gloomTalentsMindpower(self)
-		return ([[A terrible gloom surrounds you, affecting all those who approach to within radius 3. At the end of each game turn, those caught in your gloom must save against your Mindpower, or have a %d%% chance to suffer from slowness (30%%), stun or confusion (30%%) for %d turns.
+		return ([[A terrible gloom surrounds you, affecting all those who approach to within radius 3. At the end of each game turn, those caught in your gloom have a %d%% chance to suffer from slowness (30%%), stun or confusion (30%%) for %d turns %s.
 		The chance increases with your mind speed.
 		This ability is innate, and carries no cost to activate or deactivate.
-		Each point in Gloom talents increases your Mindpower (current total: %d).]]):tformat(chance, duration, mindpowerChange)
+		Each point in Gloom talents increases your Mindpower (current total: %d).]]):tformat(chance, duration, Desc.vs"mm", mindpowerChange)
 	end,
 }
 
@@ -148,9 +148,9 @@ newTalent{
 		local incDamageChange = t.getIncDamageChange(self, t)
 		local hateBonus = t.getHateBonus(self, t)
 		local mindpowerChange = gloomTalentsMindpower(self)
-		return ([[Each turn, those caught in your gloom must save against your Mindpower, or have a %d%% chance to be crippled by fear for %d turns, reducing damage they inflict by %d%%. The first time you melee strike a foe after they have been weakened will give you %d hate.
+		return ([[Each turn, those caught in your gloom have a %d%% chance to be crippled by fear for %d turns, reducing damage they inflict by %d%% %s. The first time you melee strike a foe after they have been weakened will give you %d hate.
 		The chance increases with your mind speed.
-		Each point in Gloom talents increases your Mindpower (current total: %d).]]):tformat(chance, duration, -incDamageChange, hateBonus, mindpowerChange)
+		Each point in Gloom talents increases your Mindpower (current total: %d).]]):tformat(chance, duration, -incDamageChange, Desc.vs"mm", hateBonus, mindpowerChange)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cursed/punishments.lua b/game/modules/tome/data/talents/cursed/punishments.lua
index b6c256111a47e4247b97c7a223ff0e24aad58312..0e297a9788bc2f3a1fa6edca76d487ffb7054750 100644
--- a/game/modules/tome/data/talents/cursed/punishments.lua
+++ b/game/modules/tome/data/talents/cursed/punishments.lua
@@ -137,9 +137,9 @@ newTalent{
 		local hateGain = t.getHateGain(self, t)
 		return ([[Infect a target's mind with a virulent whisper that deals %d Mind damage and spreads amongst your foes, dealing damage and feeding you %0.1f Hate for each new victim. Each turn for %d turns, the initial victim will spread the whisper to a new target within %d tiles if one is available; beyond this, all affected targets have a %d%% chance of spreading the effect each turn for 4 turns.
 
-Targets damaged by this ability have a 25%% chance of suffering Brainlock.
+Targets damaged by this ability have a 25%% chance of suffering Brainlock %s.
 
-The damage increases with your Mindpower.]]):tformat(damDesc(self, DamageType.MIND, damage), hateGain, math.min(jumpCount, t.getDuration(self, t)), jumpRange, jumpChance)
+The damage increases with your Mindpower.]]):tformat(damDesc(self, DamageType.MIND, damage), hateGain, math.min(jumpCount, t.getDuration(self, t)), jumpRange, jumpChance, Desc.vs"mm")
 	end,
 }
 
@@ -301,9 +301,9 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local maxDamage = t.getDamage(self, t)
 		local minDamage = maxDamage / duration
-		return ([[Sear your hatred into the mind of a target, dealing escalating Mind damage each turn over %d turns. The victim will suffer %0.1f damage on the first turn, slowly increasing up to %0.1f damage on the last, dealing %d Mind damage in total. Re-applying the effect resets the damage escalation. The victim has a 25%% chance of suffering Brainlock each turn from the unbearable pain.
+		return ([[Sear your hatred into the mind of a target, dealing escalating Mind damage each turn over %d turns. The victim will suffer %0.1f damage on the first turn, slowly increasing up to %0.1f damage on the last, dealing %d Mind damage in total. Re-applying the effect resets the damage escalation. The victim has a 25%% chance of suffering Brainlock each turn from the unbearable pain %s.
 
-The damage increases with your Mindpower.]]):tformat(duration, damDesc(self, DamageType.MIND, minDamage), damDesc(self, DamageType.MIND, maxDamage), maxDamage * (duration + 1) / 2)
+The damage increases with your Mindpower.]]):tformat(duration, damDesc(self, DamageType.MIND, minDamage), damDesc(self, DamageType.MIND, maxDamage), maxDamage * (duration + 1) / 2, Desc.vs"mm")
 	end,
 }
 
@@ -341,7 +341,7 @@ newTalent{
 	info = function(self, t)
 		local chance = t.getChance(self, t)
 		local mindResistChange = t.getMindResistChange(self, t)
-		return ([[Your hateful will splinters into the minds of those you torture, breaking them down. Each time you inflict Mind damage, the victim has a %0.1f%% chance of going mad for 3 turns unless they save against your Mindpower. The madness will lower the victim's Mind resistance by %0.1f%% and cause them to become confused (50%% power), slowed (30%% power), or stunned for the duration.]]):tformat(chance, -mindResistChange)
+		return ([[Your hateful will splinters into the minds of those you torture, breaking them down. Each time you inflict Mind damage, the victim has a %0.1f%% chance of going mad for 3 turns %s. The madness will lower the victim's Mind resistance by %0.1f%% and cause them to become confused (50%% power), slowed (30%% power), or stunned for the duration.]]):tformat(chance, Desc.vs"mm", -mindResistChange)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cursed/rampage.lua b/game/modules/tome/data/talents/cursed/rampage.lua
index 7f877fefc6db3435a3ee7fc6056e55455cbca883..328c4aee955cc8cb90b1a2280340ab48aa641ee9 100644
--- a/game/modules/tome/data/talents/cursed/rampage.lua
+++ b/game/modules/tome/data/talents/cursed/rampage.lua
@@ -219,7 +219,7 @@ newTalent{
 		local hitCount = t.getHitCount(self, t)
 		local stunDuration = t.getStunDuration(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[While rampaging, you slam up to %d adjacent opponents, stunning them for %d turns and damaging them for between %d and %d physical damage. Your first slam of at least two opponents increases the rampage duration by 1.
-		Damage increases with your Physical Power.]]):tformat(hitCount, stunDuration, damage * 0.5, damage)
+		return ([[While rampaging, you slam up to %d adjacent opponents, stunning them for %d turns %s and damaging them for between %d and %d physical damage. Your first slam of at least two opponents increases the rampage duration by 1.
+		Damage increases with your Physical Power.]]):tformat(hitCount, stunDuration, Desc.vs"pp", damage * 0.5, damage)
 	end,
 }
diff --git a/game/modules/tome/data/talents/cursed/slaughter.lua b/game/modules/tome/data/talents/cursed/slaughter.lua
index 6f814620c76bd3425e3965ddacdbc4d48b6c74be..da526191582bc7bee3c42d4c59456132e8962ba0 100644
--- a/game/modules/tome/data/talents/cursed/slaughter.lua
+++ b/game/modules/tome/data/talents/cursed/slaughter.lua
@@ -75,10 +75,10 @@ newTalent{
 		local healFactorChange = t.getHealFactorChange(self, t)
 		local woundDuration = t.getWoundDuration(self, t)
 		return ([[You slash wildly at your target for %d%% (at 0 Hate) to %d%% (at 100+ Hate) damage.
-		At level 3, any wound you inflict with this carries a part of your curse, reducing the effectiveness of healing by %d%% for %d turns. The effect will stack.
+		At level 3, any wound you inflict with this carries a part of your curse, reducing the effectiveness of healing by %d%% for %d turns %s. The effect will stack.
 		The damage multiplier increases with your Strength.
 
-		This talent will also attack with your shield, if you have one equipped.]]):tformat(t.getDamageMultiplier(self, t, 0) * 100, t.getDamageMultiplier(self, t, 100) * 100, -healFactorChange * 100, woundDuration)
+		This talent will also attack with your shield, if you have one equipped.]]):tformat(t.getDamageMultiplier(self, t, 0) * 100, t.getDamageMultiplier(self, t, 100) * 100, -healFactorChange * 100, woundDuration, Desc.vs())
 	end,
 }
 
@@ -151,10 +151,10 @@ newTalent{
 	info = function(self, t)
 		local defenseChange = t.getDefenseChange(self, t)
 		return ([[Assault nearby foes with 4 fast attacks for %d%% (at 0 Hate) to %d%% (at 100+ Hate) damage each. Stalked prey are always targeted if nearby.
-		At level 3 the intensity of your assault overwhelms anyone who is struck, reducing their Defense by %d for 4 turns.
+		At level 3 the intensity of your assault overwhelms anyone who is struck, reducing their Defense by %d for 4 turns %s.
 		The damage multiplier and Defense reduction increase with your Strength.
 
-		This talent will also attack with your shield, if you have one equipped.]]):tformat(t.getDamageMultiplier(self, t, 0) * 100, t.getDamageMultiplier(self, t, 100) * 100, -defenseChange)
+		This talent will also attack with your shield, if you have one equipped.]]):tformat(t.getDamageMultiplier(self, t, 0) * 100, t.getDamageMultiplier(self, t, 100) * 100, -defenseChange, Desc.vs())
 	end,
 }
 
@@ -265,7 +265,7 @@ newTalent{
 		else
 			size = _t"Small"
 		end
-		return ([[Charge through your opponents, attacking anyone near your path for %d%% (at 0 Hate) to %d%% (at 100+ Hate) damage. %s opponents may be knocked away from your path. You can attack a maximum of %d times, and can hit targets along your path more than once.]]):tformat(t.getDamageMultiplier(self, t, 0) * 100, t.getDamageMultiplier(self, t, 100) * 100, size, maxAttackCount)
+		return ([[Charge through your opponents, attacking anyone near your path for %d%% (at 0 Hate) to %d%% (at 100+ Hate) damage. %s opponents may be knocked away from your path %s. You can attack a maximum of %d times, and can hit targets along your path more than once.]]):tformat(t.getDamageMultiplier(self, t, 0) * 100, t.getDamageMultiplier(self, t, 100) * 100, size, Desc.vs"pp", maxAttackCount)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cursed/strife.lua b/game/modules/tome/data/talents/cursed/strife.lua
index 58ac5727740976e308f67a214a0774b4eec42daa..d464465915ed790dba2608d7150f723a63d03da0 100644
--- a/game/modules/tome/data/talents/cursed/strife.lua
+++ b/game/modules/tome/data/talents/cursed/strife.lua
@@ -80,10 +80,10 @@ newTalent{
 		local armorChange = t.getArmorChange(self, t)
 		local defenseChange = t.getDefenseChange(self, t)
 		local resistPenetration = t.getResistPenetration(self, t)
-		return ([[Turn your attention to a nearby foe, and dominate them with your overwhelming presence. If the target fails to save versus your Mindpower, it will be unable to move for %d turns and vulnerable to attacks. They will lose %d Armour, %d Defense and your attacks will gain %d%% resistance penetration. If the target is adjacent to you, your domination will include a melee attack.
+		return ([[Turn your attention to a nearby foe, and dominate them with your overwhelming presence %s. They will be unable to move for %d turns and vulnerable to attacks. They will lose %d Armour, %d Defense and your attacks will gain %d%% resistance penetration. If the target is adjacent to you, your domination will include a melee attack.
 		Effects will improve with your Willpower.
 
-		This talent will also attack with your shield, if you have one equipped.]]):tformat(duration, -armorChange, -defenseChange, resistPenetration)
+		This talent will also attack with your shield, if you have one equipped.]]):tformat(Desc.vs"mm", duration, -armorChange, -defenseChange, resistPenetration)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/antimagic.lua b/game/modules/tome/data/talents/gifts/antimagic.lua
index fb0dc99ac6e6a5c7568be647335746c4d279b7d2..07f3479eb8219138da565ab12dfe3ed3a9f205e7 100644
--- a/game/modules/tome/data/talents/gifts/antimagic.lua
+++ b/game/modules/tome/data/talents/gifts/antimagic.lua
@@ -108,13 +108,13 @@ newTalent{
 	end,
 	info = function(self, t)
 		local rad = self:getTalentRadius(t)
-		return ([[Let out a burst of sound that silences for %d turns all those affected in a radius of %d.
+		return ([[Let out a burst of sound that silences %s for %d turns all those affected in a radius of %d.
 		Each turn for %d turns the effected area will cause %0.2f manaburn damage to all creatures inside.
 		For each creature silenced your equilibrium is reduced by %d (up to 5 times).
-		The damage and apply power will increase with the greater of your Mindpower or Physical power.
+		The damage will increase with the greater of your Mindpower or Physical power.
 
 		Learning this talent will let your Nature damage and penetration bonuses apply to all Manaburn damage regardless of source.]]):
-		tformat(t.getduration(self,t), rad, t.getFloorDuration(self,t), t.getDamage(self, t), t.getEquiRegen(self, t))
+		tformat(Desc.vs(Desc.max("pp", "mp"), "ms"), t.getduration(self,t), rad, t.getFloorDuration(self,t), t.getDamage(self, t), t.getEquiRegen(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/cold-drake.lua b/game/modules/tome/data/talents/gifts/cold-drake.lua
index a663f38dba1abcce17b0d6d79c8ec6aca28e1e13..cd3cd3741f4441e1a4e31f2e2fa62ab4d916e641 100644
--- a/game/modules/tome/data/talents/gifts/cold-drake.lua
+++ b/game/modules/tome/data/talents/gifts/cold-drake.lua
@@ -57,10 +57,10 @@ newTalent{
 				local shield, shield_combat = self:hasShield()
 				local weapon = self:hasMHWeapon() and self:hasMHWeapon().combat or self.combat
 				if not shield then
-					self:attackTarget(target, DamageType.ICE, t.damagemult(self, t), true)
+					self:attackTarget(target, DamageType.ICE_MIND, t.damagemult(self, t), true)
 				else
-					self:attackTargetWith(target, weapon, DamageType.ICE, t.damagemult(self, t))
-					self:attackTargetWith(target, shield_combat, DamageType.ICE, t.damagemult(self, t))
+					self:attackTargetWith(target, weapon, DamageType.ICE_MIND, t.damagemult(self, t))
+					self:attackTargetWith(target, shield_combat, DamageType.ICE_MIND, t.damagemult(self, t))
 				end
 			end
 		end)
@@ -68,11 +68,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You call upon the mighty claw of a cold drake and rake a wave of freezing cold in front of you, doing %d%% weapon damage as Ice damage in a cone of radius %d. Ice damage gives a chance of freezing the target.
+		return ([[You call upon the mighty claw of a cold drake and rake a wave of freezing cold in front of you, doing %d%% weapon damage as Ice damage in a cone of radius %d. Ice damage gives 25%% chance of freezing the target %s.
 		Every level in Ice Claw additionally raises your Physical Save by 2.
 		Each point in cold drake talents also increases your cold resistance by 1%%.
 
-		This talent will also attack with your shield, if you have one equipped.]]):tformat(100 * t.damagemult(self, t), self:getTalentRadius(t))
+		This talent will also attack with your shield, if you have one equipped.]]):tformat(100 * t.damagemult(self, t), self:getTalentRadius(t), Desc.vs"mp")
 	end,
 }
 
@@ -171,7 +171,7 @@ newTalent{
 					local t = self.summoner:getTalentFromId(self.T_ICE_WALL)
 					local tg = {type="ball", range=0, radius=self.radius, friendlyfire=false, talent=t, x=self.x, y=self.y}
 					self.summoner.__project_source = self
-					self.summoner:project(tg, self.x, self.y, engine.DamageType.ICE, self.dam)
+					self.summoner:project(tg, self.x, self.y, engine.DamageType.ICE_MIND, self.dam)
 					self.summoner.__project_source = nil
 					self:useEnergy()
 					self.temporary = self.temporary - 1
@@ -201,8 +201,8 @@ newTalent{
 		local icerad = t.getIceRadius(self, t)
 		local icedam = t.getIceDamage(self, t)
 		return ([[Summons an icy wall of %d length for %d turns. Ice walls are transparent, but block projectiles and enemies.
-		Ice walls also emit freezing cold, dealing %0.2f damage for each ice wall within radius %d of an enemy, and with each wall giving a 25%% chance to freeze an enemy. This cold cannot hurt the talent user or their allies.
-		Each point in cold drake talents also increases your cold resistance by 1%%.]]):tformat(3 + math.floor(self:getTalentLevel(t) / 2) * 2, t.getDuration(self, t), damDesc(self, DamageType.COLD, icedam),  icerad)
+		Ice walls also emit freezing cold, dealing %0.2f damage for each ice wall within radius %d of an enemy, and with each wall giving a 25%% chance to freeze an enemy %s. This cold cannot hurt the talent user or their allies.
+		Each point in cold drake talents also increases your cold resistance by 1%%.]]):tformat(3 + math.floor(self:getTalentLevel(t) / 2) * 2, t.getDuration(self, t), damDesc(self, DamageType.COLD, icedam),  icerad, Desc.vs"mp")
 	end,
 }
 
@@ -257,8 +257,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You breathe ice in a frontal cone of radius %d. Any target caught in the area will take %0.2f cold damage and be frozen for 3 turns.
+		return ([[You breathe ice in a frontal cone of radius %d. Any target caught in the area will take %0.2f cold damage and be frozen for 3 turns %s.
 		The damage will increase with your Strength, the critical chance is based on your Mental crit rate, and the Freeze apply power is based on your Mindpower.
-		Each point in cold drake talents also increases your cold resistance by 1%%.]]):tformat( self:getTalentRadius(t), damDesc(self, DamageType.COLD, t.getDamage(self, t)))
+		Each point in cold drake talents also increases your cold resistance by 1%%.]]):tformat( self:getTalentRadius(t), damDesc(self, DamageType.COLD, t.getDamage(self, t)), Desc.vs"mp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/corrosive-blades.lua b/game/modules/tome/data/talents/gifts/corrosive-blades.lua
index 252b44b62af59287d55113cfb6b70d5e47dda54d..53eacc9eeb78d07ce96c9b58192e36abcf4bff26 100644
--- a/game/modules/tome/data/talents/gifts/corrosive-blades.lua
+++ b/game/modules/tome/data/talents/gifts/corrosive-blades.lua
@@ -49,9 +49,9 @@ 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.1f Acid damage (which can disarm them).
+		return ([[Channel acid through your psiblades, extending their reach to create a beam doing %0.1f Acid damage (which can disarm them %s).
 		The damage increases with your Mindpower.]]):
-		tformat(damDesc(self, DamageType.ACID, dam))
+		tformat(damDesc(self, DamageType.ACID, dam), Desc.vs"mp")
 	end,
 }
 
@@ -174,9 +174,9 @@ newTalent{
 		local nb = t.getNb(self, t)
 		return ([[You focus on a target zone of radius 2 to make up to %d corrosive seeds appear.
 		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.
+		Each seed lasts %d turns and will explode when a hostile creature walks over it, knocking the creature back %s and dealing %0.1f Acid damage within radius 1.
 		The damage will increase with your Mindpower.]]):
-		tformat(nb, t.getDuration(self, t), damDesc(self, DamageType.ACID, dam))
+		tformat(nb, t.getDuration(self, t), Desc.vs"mp", damDesc(self, DamageType.ACID, dam))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/dwarven-nature.lua b/game/modules/tome/data/talents/gifts/dwarven-nature.lua
index 30d7e9955c2e8c77c0eeaf39e96b52d6039fbc0c..91f27ef5c250ff89778e34b7c17626dc38864f57 100644
--- a/game/modules/tome/data/talents/gifts/dwarven-nature.lua
+++ b/game/modules/tome/data/talents/gifts/dwarven-nature.lua
@@ -373,7 +373,7 @@ newTalent{
 	info = function(self, t)
 		local radius = self:getTalentRadius(t)
 		local dam = t.getDamage(self, t)
-		return ([[Fires spikes all around you, making your foes within radius %d bleed for %0.2f damage over 6 turns.
-		Damage and chance to apply the effect increase with Willpower.]]):tformat(radius, damDesc(self, DamageType.PHYSICAL, dam))
+		return ([[Fires spikes all around you, making your foes within radius %d bleed for %0.2f damage over 6 turns %s.
+		Damage and chance to apply the effect increase with Willpower.]]):tformat(radius, damDesc(self, DamageType.PHYSICAL, dam), Desc.vs"mp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/earthen-vines.lua b/game/modules/tome/data/talents/gifts/earthen-vines.lua
index 11785738f46b5ea7364a81edbf335dc573d5be02..881e126044770810dcf9ab6904a64180398b12b2 100644
--- a/game/modules/tome/data/talents/gifts/earthen-vines.lua
+++ b/game/modules/tome/data/talents/gifts/earthen-vines.lua
@@ -67,11 +67,11 @@ newTalent{
 		local turns, dam, arcanedam = t.getValues(self, t)
 		local xs = arcanedam and (" and %0.1f Arcane"):tformat(damDesc(self, DamageType.ARCANE, arcanedam)) or ""
 		return ([[From the ground around you, you form living stone vines extending from your feet.
-		Each turn, the vines will attempt to seize a random target within radius %d.
+		Each turn, the vines will attempt to seize a random target within radius %d %s.
 		Affected creatures are pinned to the ground and take %0.1f nature%s damage each turn for %d turns.
 		A creature entangled by the vines will have a chance to break free each turn, and will automatically succeed if it is more than %d grids away from you.
-		The chance to affect targets and damage increase with talent level and Willpower.]]):
-		tformat(rad, damDesc(self, DamageType.NATURE, dam), xs, turns, rad+4)
+		Damage increases with talent level and Willpower.]]):
+		tformat(rad, Desc.vs"mp", damDesc(self, DamageType.NATURE, dam), xs, turns, rad+4)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/eyals-fury.lua b/game/modules/tome/data/talents/gifts/eyals-fury.lua
index 571d675a94b747e41cdfcf4c544b90b0797c979f..1dc65e16f3df13bf8d8ba3bafce6ae6b7bda3456 100644
--- a/game/modules/tome/data/talents/gifts/eyals-fury.lua
+++ b/game/modules/tome/data/talents/gifts/eyals-fury.lua
@@ -157,9 +157,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You call upon the earth to create a blinding, corrosive cloud in an area of radius %d for %d turns.
-		Each turn, this cloud deals %0.1f acid damage to each foe with a 25%% chance to blind and a %d%% chance of burning away one magical sustain or beneficial magical effect.
+		Each turn, this cloud deals %0.1f acid damage to each foe with a 25%% chance to blind %s and a %d%% chance of burning away one magical sustain or beneficial magical effect.
 		The damage increases with your Mindpower.]]):
-		tformat(self:getTalentRadius(t), t.getDuration(self, t), damDesc(self, DamageType.ACID, t.getDamage(self, t)), t.getChance(self, t))
+		tformat(self:getTalentRadius(t), t.getDuration(self, t), damDesc(self, DamageType.ACID, t.getDamage(self, t)), Desc.vs(Desc.max("acc", "mp", "sp"), "ps"), t.getChance(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/fire-drake.lua b/game/modules/tome/data/talents/gifts/fire-drake.lua
index 99edada2068e2f85904646c7af50719dd64b8edd..b4f4c2f326a6e877caf0167fcf3d4ed79b2a9456 100644
--- a/game/modules/tome/data/talents/gifts/fire-drake.lua
+++ b/game/modules/tome/data/talents/gifts/fire-drake.lua
@@ -116,10 +116,10 @@ newTalent{
 	info = function(self, t)
 		local radius = self:getTalentRadius(t)
 		local power = 20 + 6 * self:getTalentLevel(t)
-		return ([[You let out a powerful roar that sends your foes in radius %d into utter confusion (power: %d%%) for 3 turns.
+		return ([[You let out a powerful roar that sends your foes in radius %d into utter confusion (power: %d%%) for 3 turns %s.
 		The sound wave is so strong, your foes also take %0.2f physical damage.
 		The damage improves with your Strength.
-		Each point in fire drake talents also increases your fire resistance by 1%%.]]):tformat(radius, power, self:combatTalentStatDamage(t, "str", 30, 380))
+		Each point in fire drake talents also increases your fire resistance by 1%%.]]):tformat(radius, power, Desc.vs"pm", self:combatTalentStatDamage(t, "str", 30, 380))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/harmony.lua b/game/modules/tome/data/talents/gifts/harmony.lua
index 79824b1f530956fb15924b8d233064a912cf4821..5e42e1980c9a2f2d34dd04dea6c6fa5753830051 100644
--- a/game/modules/tome/data/talents/gifts/harmony.lua
+++ b/game/modules/tome/data/talents/gifts/harmony.lua
@@ -172,10 +172,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		local pct = t.getPct(self, t)*100
-		return ([[A wave of natural energies flow around you in a radius of %d.  All creatures in the area will be affected by the Healing Nexus effect for %d turns.
+		return ([[A wave of natural energies flow around you in a radius of %d.  All creatures in the area will be affected by the Healing Nexus effect for %d turns %s.
 		On you, this effect causes each heal received to restore %d equilibrium and be %d%% effective.
 		On other creatures, all healing is intercepted and redirected to you at %d%% efficiency.
 		Only direct healing (not normal regeneration) is affected.]]):
-		tformat(self:getTalentRadius(t), t.getDur(self, t), t.getEquilibrium(self, t), 100 + pct, pct)
+		tformat(self:getTalentRadius(t), t.getDur(self, t), Desc.vs(), t.getEquilibrium(self, t), 100 + pct, pct)
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/higher-draconic.lua b/game/modules/tome/data/talents/gifts/higher-draconic.lua
index ae0cfc2c7c63900f75811d2382dbddc5b1df9d4c..2e1d740b59bcc8d7818301248fe025f09c8b4788 100644
--- a/game/modules/tome/data/talents/gifts/higher-draconic.lua
+++ b/game/modules/tome/data/talents/gifts/higher-draconic.lua
@@ -58,34 +58,49 @@ newTalent{
 			end
 		end
 
+		local apply_power = math.max(self:combatPhysicalpower(), self:combatMindpower())
 		if elem == "phys" then
 			attack_mode(self, target, DamageType.PHYSICAL, t.getWeaponDamage(self, t))
-			local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
-			local grids = self:project(tg, x, y, DamageType.SAND, {dur=3, dam=self:mindCrit(t.getBurstDamage(self, t))})
+			local tg = {type="ball", range=1, selffire=false, friendlyfire = false, radius=self:getTalentRadius(t), talent=t}
+			local grids = self:project(tg, x, y, DamageType.PHYSICAL, {dur=3, dam=self:mindCrit(t.getBurstDamage(self, t))})
+			self:projectApply(tg, x, y, Map.ACTOR, function(tg) if tg:canBe("blind") then tg:setEffect(tg.EFF_BLINDED, 3, {apply_power = apply_power}) end end, "hostile")
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_matter", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
 			game:playSoundNear(self, "talents/flame")
 		elseif elem == "cold" then
-			attack_mode(self, target, DamageType.ICE, t.getWeaponDamage(self, t))
-			local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
-			local grids = self:project(tg, x, y, DamageType.ICE_SLOW, self:mindCrit(t.getBurstDamage(self, t)))
+			attack_mode(self, target, DamageType.COLD, t.getWeaponDamage(self, t))
+			local tg = {type="ball", range=1, selffire=false, friendlyfire = false, radius=self:getTalentRadius(t), talent=t}
+			local grids = self:project(tg, x, y, DamageType.COLD, self:mindCrit(t.getBurstDamage(self, t)))
+			self:projectApply(tg, x, y, Map.ACTOR, function(tg)
+				if tg:canBe("slow") then tg:setEffect(tg.EFF_SLOW, 3, {power = 0.2, apply_power = apply_power}) end
+				if tg:canBe("stun") then tg:setEffect(tg.EFF_FROZEN, 3, {apply_power = apply_power}) end
+			end, "hostile")
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_ice", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
 			game:playSoundNear(self, "talents/flame")
 		elseif elem == "fire" then
-			attack_mode(self, target, DamageType.FIREBURN, t.getWeaponDamage(self, t))
-			local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
-			local grids = self:project(tg, x, y, DamageType.FIRE_STUN, self:mindCrit(t.getBurstDamage(self, t)))
+			attack_mode(self, target, DamageType.FIRE, t.getWeaponDamage(self, t))
+			local tg = {type="ball", range=1, selffire=false, friendlyfire = false,radius=self:getTalentRadius(t), talent=t}
+			local grids = self:project(tg, x, y, DamageType.FIRE, self:mindCrit(t.getBurstDamage(self, t)))
+			self:projectApply(tg, x, y, Map.ACTOR, function(tg)
+				if tg:canBe("stun") then tg:setEffect(tg.EFF_STUNNED, 3, {apply_power = apply_power}) end
+			end, "hostile")
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_fire", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
 			game:playSoundNear(self, "talents/flame")
 		elseif elem == "lightning" then
-			attack_mode(self, target, DamageType.LIGHTNING_DAZE, t.getWeaponDamage(self, t))
-			local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
-			local grids = self:project(tg, x, y, DamageType.LIGHTNING_DAZE, self:mindCrit(t.getBurstDamage(self, t)))
+			attack_mode(self, target, DamageType.LIGHTNING, t.getWeaponDamage(self, t))
+			local tg = {type="ball", range=1, selffire=false, friendlyfire = false,radius=self:getTalentRadius(t), talent=t}
+			local grids = self:project(tg, x, y, DamageType.LIGHTNING, self:mindCrit(t.getBurstDamage(self, t)))
+			self:projectApply(tg, x, y, Map.ACTOR, function(tg)
+				if tg:canBe("stun") then tg:setEffect(tg.EFF_DAZED, 3, {apply_power = apply_power}) end
+			end, "hostile")
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_lightning", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
 			game:playSoundNear(self, "talents/flame")
 		elseif elem == "acid" then
-			attack_mode(self, target, DamageType.ACID_DISARM, t.getWeaponDamage(self, t))
-			local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
-			local grids = self:project(tg, x, y, DamageType.ACID_DISARM, self:mindCrit(t.getBurstDamage(self, t)))
+			attack_mode(self, target, DamageType.ACID, t.getWeaponDamage(self, t))
+			local tg = {type="ball", range=1, selffire=false, friendlyfire = false,radius=self:getTalentRadius(t), talent=t}
+			local grids = self:project(tg, x, y, DamageType.ACID, self:mindCrit(t.getBurstDamage(self, t)))
+			self:projectApply(tg, x, y, Map.ACTOR, function(tg)
+				if tg:canBe("disarm") then tg:setEffect(tg.EFF_DISARMED, 3, {apply_power = apply_power}) end
+			end, "hostile")
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_acid", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
 			game:playSoundNear(self, "talents/flame")
 		end
@@ -96,11 +111,11 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		local speed = t.getPassiveSpeed(self, t)
 		return ([[Unleash raw, chaotic elemental damage upon your enemy.
-		You strike your enemy for %d%% weapon damage in one of blinding sand, disarming acid, freezing and slowing ice, dazing lightning or stunning flames, with equal odds.
+		You strike your enemy for %d%% weapon damage in one of blinding sand, disarming acid, freezing and slowing ice, dazing lightning or stunning flames, with equal odds. %s
 		Additionally, you will cause a burst that deals %0.2f of that damage to creatures in radius %d, regardless of if you hit with the blow.
 		Levels in Prismatic Slash increase your Physical and Mental attack speeds by %d%%.
 
-		This talent will also attack with your shield, if you have one equipped.]]):tformat(100 * self:combatTalentWeaponDamage(t, 1.2, 2.0), burstdamage, radius, 100*speed)
+		This talent will also attack with your shield, if you have one equipped.]]):tformat(100 * self:combatTalentWeaponDamage(t, 1.2, 2.0), Desc.vs(Desc.max("pp", "mp"), "ps"), burstdamage, radius, 100*speed)
 	end,
 }
 
@@ -156,10 +171,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		local effect = t.getEffect(self, t)
-		return ([[You breathe crippling poison in a frontal cone of radius %d. Any target caught in the area will take %0.2f nature damage each turn for 6 turns.
+		return ([[You breathe crippling poison in a frontal cone of radius %d %s. Any target caught in the area will take %0.2f nature damage each turn for 6 turns.
 		The poison also gives enemies a %d%% chance to fail actions more complicated than basic attacks and movement, while it is in effect.
 		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
-		Each point in Venomous Breath also increases your nature resistance by 3%%, and your nature damage by 4%%.]] ):tformat(self:getTalentRadius(t), damDesc(self, DamageType.NATURE, t.getDamage(self,t)/6), effect)
+		Each point in Venomous Breath also increases your nature resistance by 3%%, and your nature damage by 4%%.]] ):tformat(self:getTalentRadius(t), Desc.vs(), damDesc(self, DamageType.NATURE, t.getDamage(self,t)/6), effect)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/moss.lua b/game/modules/tome/data/talents/gifts/moss.lua
index 100d289fe265b8dd853930f2b0d30479dd4638d5..4504d004e61465b0e1a6e65eedf9bb423d6b2ef0 100644
--- a/game/modules/tome/data/talents/gifts/moss.lua
+++ b/game/modules/tome/data/talents/gifts/moss.lua
@@ -67,11 +67,11 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		return ([[Instantly grow a moss circle of radius %d at your feet.
 		Each turn the moss deals %0.2f nature damage to each foe within its radius.
-		This moss is very thick and sticky causing all foes passing through it have their movement speed reduced by %d%% and have a %d%% chance to be pinned to the ground for 4 turns.
+		This moss is very thick and sticky causing all foes passing through it have their movement speed reduced by %d%% and have a %d%% chance to be pinned to the ground for 4 turns %s.
 		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.]]):
-		tformat(radius, damDesc(self, DamageType.NATURE, damage), slow, pin, duration)
+		tformat(radius, damDesc(self, DamageType.NATURE, damage), slow, pin, Desc.vs"mp", duration)
 	end,
 }
 
@@ -164,11 +164,11 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		return ([[Instantly grow a moss circle of radius %d at your feet.
 		Each turn the moss deals %0.2f nature damage to each foe within its radius.
-		This moss is very slippery and causes affected foes to have a %d%% chance of failing to perform complex actions.
+		This moss is very slippery and causes affected foes to have a %d%% chance of failing to perform complex actions %s.
 		The moss lasts %d turns.
 		Moss talents are instant but place all other moss talents on cooldown for 3 turns.
-		The damage and the chance to apply the slippery effect increase with your Mindpower.]]):
-		tformat(radius, damDesc(self, DamageType.NATURE, damage), fail, duration)
+		The damage will increase with your Mindpower.]]):
+		tformat(radius, damDesc(self, DamageType.NATURE, damage), fail, Desc.vs"mm", duration)
 	end,
 }
 
@@ -214,10 +214,10 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		return ([[Instantly grow a moss circle of radius %d at your feet.
 		Each turn the moss deals %0.2f nature damage to each foe within its radius.
-		This moss is coated with strange fluids and has a %d%% chance to confuse (power %d%%) foes passing through it for 2 turns.
+		This moss is coated with strange fluids and has a %d%% chance to confuse (power %d%%) foes passing through it for 2 turns %s.
 		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.]]):
-		tformat(radius, damDesc(self, DamageType.NATURE, damage), chance, power, duration)
+		tformat(radius, damDesc(self, DamageType.NATURE, damage), chance, power, Desc.vs"mm", duration)
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/mucus.lua b/game/modules/tome/data/talents/gifts/mucus.lua
index 253c2d3856fd2c7899e1fe2eff9f14760dbc5aaf..35a17855aad8b3789e8b1201951ede95519aff71 100644
--- a/game/modules/tome/data/talents/gifts/mucus.lua
+++ b/game/modules/tome/data/talents/gifts/mucus.lua
@@ -78,10 +78,10 @@ newTalent{
 		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).
+		Your mucus will poison all foes crossing it, dealing %0.1f nature damage every turn for 5 turns (stacking) %s.
 		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 your Mindpower, and laying down more mucus in the same spot will intensify its effects and refresh its duration.]]):
-		tformat(dur, dur, damDesc(self, DamageType.NATURE, dam), equi)
+		tformat(dur, dur, damDesc(self, DamageType.NATURE, dam), Desc.vs"mp",  equi)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/oozing-blades.lua b/game/modules/tome/data/talents/gifts/oozing-blades.lua
index 79d66d418b8f3fab3686f7e93313767dbf714cb9..98c050c823a2e8f1e195ffc93af4711e2ab5c4c4 100644
--- a/game/modules/tome/data/talents/gifts/oozing-blades.lua
+++ b/game/modules/tome/data/talents/gifts/oozing-blades.lua
@@ -115,10 +115,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You use your psiblades to fire a small worm at a foe.
-		When it hits, it will burrow into the target's brain and stay there for 6 turns, interfering with its ability to use talents.
+		When it hits, it will burrow into the target's brain and stay there for 6 turns %s, interfering with its ability to use talents.
 		Each time a talent is used there is %d%% chance that %d talent(s) are placed on a %d turn(s) cooldown.
 		The chance will increase with your Mindpower.]]):
-		tformat(t.getChance(self, t), t.getNb(self, t), t.getTurns(self, t))
+		tformat(Desc.vs(), t.getChance(self, t), t.getNb(self, t), t.getTurns(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/sand-drake.lua b/game/modules/tome/data/talents/gifts/sand-drake.lua
index 4de569c488ef998b064cec7b4a150b022be1cf7a..a99ccf571e4bbf2f16187ca4c54b22589118dfca 100644
--- a/game/modules/tome/data/talents/gifts/sand-drake.lua
+++ b/game/modules/tome/data/talents/gifts/sand-drake.lua
@@ -81,8 +81,7 @@ newTalent{
 	end,
 	info = function(self, t)
 return ([[Attack the target for %d%% Nature weapon damage.
-		If the attack brings your target below a percent of its max life (based on talent level and relative size) or kills it, you attempt to swallow it, killing it automatically and regaining life and equilibrium depending on its level.
-		The target may save against your physical power to prevent this attempt.
+		If the attack brings your target below a percent of its max life (based on talent level and relative size) or kills it, you attempt to swallow it, killing it automatically %s and regaining life and equilibrium depending on its level.
 		Levels in Swallow raise your Physical and Mental critical rate by %d%%.
 		Each point in sand drake talents increase your physical resistance by 0.5%%.
 		This talent will also attack with your shield, if you have one equipped.
@@ -94,7 +93,9 @@ return ([[Attack the target for %d%% Nature weapon damage.
 		Big:  %d%%
 		Huge:  %d%%
 		Gargantuan:  %d%%]]):
-		tformat(100 * t.getDamage(self, t), t.getPassiveCrit(self, t),
+		tformat(100 * t.getDamage(self, t),
+			Desc.vs"pp",
+			t.getPassiveCrit(self, t),
 			t.maxSwallow(self, t, 1),
 			t.maxSwallow(self, t, 2),
 			t.maxSwallow(self, t, 3),
@@ -218,8 +219,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[You breathe sand in a frontal cone of radius %d. Any target caught in the area will take %0.2f physical damage, and will be blinded for %d turns.
+		return ([[You breathe sand in a frontal cone of radius %d. Any target caught in the area will take %0.2f physical damage, and will be blinded for %d turns %s.
 		The damage will increase with your Strength, the critical chance is based on your Mental crit rate, and the Blind apply power is based on your Mindpower.
-		Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):tformat(self:getTalentRadius(t), damDesc(self, DamageType.PHYSICAL, damage), duration)
+		Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):tformat(self:getTalentRadius(t), damDesc(self, DamageType.PHYSICAL, damage), duration, Desc.vs"mp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/slime.lua b/game/modules/tome/data/talents/gifts/slime.lua
index 948164525f311e9e806437a81210984ebe82adf1..80fd81122b586ea3e109d3261c6d9a79018308d8 100644
--- a/game/modules/tome/data/talents/gifts/slime.lua
+++ b/game/modules/tome/data/talents/gifts/slime.lua
@@ -117,8 +117,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Your skin drips with acid, damaging all that hit you for %0.1f disarming acid damage.
-		The damage increases with your Mindpower.]]):tformat(damDesc(self, DamageType.ACID, t.getDamage(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 %s.
+		The damage increases with your Mindpower.]]):tformat(damDesc(self, DamageType.ACID, t.getDamage(self, t)), t.getChance(self, t), Desc.vs"mp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/storm-drake.lua b/game/modules/tome/data/talents/gifts/storm-drake.lua
index f887e3963b527b9a07414af935e76823509c5e99..bdb1f52e79076c9c5803db0ec73c74fd68b38f6f 100644
--- a/game/modules/tome/data/talents/gifts/storm-drake.lua
+++ b/game/modules/tome/data/talents/gifts/storm-drake.lua
@@ -107,10 +107,10 @@ newTalent{
 	info = function(self, t)
 		local percent = t.getPercent(self, t)
 		local litdam = t.getDamage(self, t)
-		return ([[Generate an electrical field around you in a radius of %d. Any creature caught inside will lose up to %0.1f%% of its current life (%0.1f%% if the target is Elite or Rare, %0.1f%% if the target is a Unique or Boss, and %0.1f%% if they are an Elite Boss.). This life drain is irresistable, but can be saved against with physical save.
+		return ([[Generate an electrical field %s around you in a radius of %d. Any creature caught inside will lose up to %0.1f%% of its current life (%0.1f%% if the target is Elite or Rare, %0.1f%% if the target is a Unique or Boss, and %0.1f%% if they are an Elite Boss.).
 		Additionally, it will deal %0.2f lightning damage afterwards, regardless of target rank.
 		Current life loss and lightning damage will increase with your Mindpower, and the lightning damage element can critically hit with mental critical chances.
-		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):tformat(self:getTalentRadius(t), percent, percent/1.5, percent/2, percent/2.5, damDesc(self, DamageType.LIGHTNING, litdam))
+		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):tformat(Desc.vs"mp", self:getTalentRadius(t), percent, percent/1.5, percent/2, percent/2.5, damDesc(self, DamageType.LIGHTNING, litdam))
 	end,
 }
 
@@ -192,11 +192,18 @@ newTalent{
 	info = function(self, t)
 		local rad = t.getRadius(self, t)
 		return ([[Summon a tornado that moves very slowly towards the target, following it if it changes position.
-		Each time it moves every foes within radius 2 takes %0.2f lightning damage and is knocked back 2 spaces.
-		When it reaches the target it explodes in a radius of %d, knocking back targets and dealing %0.2f lightning and %0.2f physical damage.
+		Each time it moves every foes within radius 2 takes %0.2f lightning damage and is knocked back 2 spaces %s.
+		When it reaches the target it explodes in a radius of %d, knocking back targets %s and dealing %0.2f lightning and %0.2f physical damage.
 		The tornado will move a maximum of 20 times.
 		Damage will increase with your Mindpower.
-		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):tformat(damDesc(self, DamageType.LIGHTNING, t.getMoveDamage(self, t)), rad, damDesc(self, DamageType.LIGHTNING, t.getDamage(self, t)), damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
+		Each point in storm drake talents also increases your lightning resistance by 1%%.
+		]]):tformat(
+				damDesc(self, DamageType.LIGHTNING, t.getMoveDamage(self, t)),
+				Desc.vs(),
+				rad,
+				Desc.vs"mp",
+				damDesc(self, DamageType.LIGHTNING, t.getDamage(self, t)),
+				damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
 	end,
 }
 
@@ -253,12 +260,13 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[You breathe lightning in a frontal cone of radius %d. Any target caught in the area will take %0.2f to %0.2f lightning damage (%0.2f average) and be stunned for 3 turns.
+		return ([[You breathe lightning in a frontal cone of radius %d. Any target caught in the area will take %0.2f to %0.2f lightning damage (%0.2f average) and be stunned for 3 turns %s.
 		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate, and the Stun apply power is based on your Mindpower.
 		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):tformat(
 			self:getTalentRadius(t),
 			damDesc(self, DamageType.LIGHTNING, damage / 3),
 			damDesc(self, DamageType.LIGHTNING, damage),
-			damDesc(self, DamageType.LIGHTNING, (damage + damage / 3) / 2))
+			damDesc(self, DamageType.LIGHTNING, (damage + damage / 3) / 2),
+			Desc.vs"mp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/summon-distance.lua b/game/modules/tome/data/talents/gifts/summon-distance.lua
index ef1786df8b3e1f296ce9860a29193eabadaea248..34b6f8e67c00973a3288a757d3ec78a896a64efd 100644
--- a/game/modules/tome/data/talents/gifts/summon-distance.lua
+++ b/game/modules/tome/data/talents/gifts/summon-distance.lua
@@ -260,8 +260,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Breathe poison on your foes, doing %d damage over a few turns.
-		The damage will increase with your Willpower.]]):tformat(damDesc(self, DamageType.NATURE, self:combatTalentStatDamage(t, "wil", 30, 460)))
+		return ([[Breathe poison on your foes, doing %d damage over a few turns %s.
+		The damage will increase with your Willpower.]]):tformat(damDesc(self, DamageType.NATURE, self:combatTalentStatDamage(t, "wil", 30, 460)), Desc.vs"mp")
 	end,
 }
 
@@ -291,7 +291,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Spit poison on your foes, doing %d damage over a few turns.
-		The damage will increase with your Willpower.]]):tformat(damDesc(self, DamageType.NATURE, self:combatTalentStatDamage(t, "wil", 30, 460)))
+		The damage will increase with your Willpower.]]):tformat(damDesc(self, DamageType.NATURE, self:combatTalentStatDamage(t, "wil", 30, 460)), Desc.vs"mp")
 	end,
 }
 
@@ -372,10 +372,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Grab a target and pull it next to you, covering it with frost while reducing its movement speed by 50%% for %d turns.
+		return ([[Grab a target and pull it next to you, covering it with frost while reducing its movement speed by 50%% for %d turns %s.
 		The ice will also deal %0.2f cold damage.
 		The damage and chance to slow will increase with your Mindpower.]]):
-		tformat(t.getDuration(self, t), damDesc(self, DamageType.COLD, self:combatTalentMindDamage(t, 5, 140)))
+		tformat(t.getDuration(self, t), Desc.vs"mp", damDesc(self, DamageType.COLD, self:combatTalentMindDamage(t, 5, 140)))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/summon-utility.lua b/game/modules/tome/data/talents/gifts/summon-utility.lua
index 257b06da5f738160c9eb3816a249067e804a7576..b6e23c16f49718c4271fc36682ee71d3a2e57c58 100644
--- a/game/modules/tome/data/talents/gifts/summon-utility.lua
+++ b/game/modules/tome/data/talents/gifts/summon-utility.lua
@@ -81,7 +81,7 @@ newTalent{ short_name="SPIDER_WEB",
 		return true
 	end,
 	info = function(self, t)
-		return ([[Spread a web and throw it toward your target. If caught, it won't be able to move for %d turns.]]):tformat(t.getDuration(self, t))
+		return ([[Spread a web and throw it toward your target. If caught, it won't be able to move for %d turns %s.]]):tformat(t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/venom-drake.lua b/game/modules/tome/data/talents/gifts/venom-drake.lua
index e14eb6e97c8f7ef9ec08c4ae382213bc09bc0849..1d8ae89116bf768281ca24da3c456df6e8e7b0d2 100644
--- a/game/modules/tome/data/talents/gifts/venom-drake.lua
+++ b/game/modules/tome/data/talents/gifts/venom-drake.lua
@@ -62,10 +62,10 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		return ([[Spray forth a glob of acidic moisture at your enemy.
 		The target will take %0.2f Mindpower-based acid damage.
-		Enemies struck have a 25%% chance to be Disarmed for three turns, as their weapon is rendered useless by an acid coating.
+		Enemies struck have a 25%% chance to be disarmed for three turns %s, as their weapon is rendered useless by an acid coating.
 		At Talent Level 5, this becomes a piercing line of acid.
 		Every level in Acidic Spray additionally raises your Mindpower by 4, passively.
-		Each point in acid drake talents also increases your acid resistance by 1%%.]]):tformat(damDesc(self, DamageType.ACID, damage))
+		Each point in acid drake talents also increases your acid resistance by 1%%.]]):tformat(damDesc(self, DamageType.ACID, damage), Desc.vs"mp")
 	end,
 }
 
@@ -125,9 +125,10 @@ newTalent{
 		local atk = t.getAtk(self, t)
 		local radius = self:getTalentRadius(t)
 		return ([[Exhale a mist of lingering acid, dealing %0.2f acid damage that can critical in a radius of %d each turn for %d turns.
-		Enemies in this mist will be corroded for %d turns, lowering their Accuracy, their Armour and their Defense by %d.
+		Enemies in this mist will be corroded for %d turns %s, lowering their Accuracy, their Armour and their Defense by %d.
 		The damage and duration will increase with your Mindpower, and the radius will increase with talent level.
-		Each point in acid drake talents also increases your acid resistance by 1%%.]]):tformat(damDesc(self, DamageType.ACID, damage), radius, duration, cordur, atk)
+		Each point in acid drake talents also increases your acid resistance by 1%%.
+		]]):tformat(damDesc(self, DamageType.ACID, damage), radius, duration, cordur, Desc.vs"mp", atk)
 	end,
 }
 
@@ -177,10 +178,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You strike the enemy with a rain of fast, acidic blows. You strike four times for pure acid damage. Every blow does %d%% damage.
-		Every two talent levels, one of your strikes becomes blinding acid instead of normal acid, blinding the target 25%% of the time if it hits.
+		Every two talent levels, one of your strikes becomes blinding acid instead of normal acid, blinding the target 25%% of the time if it hits %s.
 		Each point in acid drake talents also increases your acid resistance by 1%%.
 
-		This talent will also attack with your shield, if you have one equipped.]]):tformat(100 * self:combatTalentWeaponDamage(t, 0.1, 0.6))
+		This talent will also attack with your shield, if you have one equipped.]]):tformat(100 * self:combatTalentWeaponDamage(t, 0.1, 0.6), Desc.vs(Desc.max("acc", "mp", "sp"), "ps"))
 	end,
 }
 
@@ -232,8 +233,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You breathe acid in a frontal cone of radius %d. Any target caught in the area will take %0.2f acid damage.
-		Enemies caught in the acid are disarmed for 3 turns.
+		Enemies caught in the acid are disarmed for 3 turns %s.
 		The damage will increase with your Strength, the critical chance is based on your Mental crit rate, and the Disarm apply power is based on your Mindpower.
-		Each point in acid drake talents also increases your acid resistance by 1%%.]]):tformat(self:getTalentRadius(t), damDesc(self, DamageType.ACID, t.getDamage(self, t)))
+		Each point in acid drake talents also increases your acid resistance by 1%%.]]):tformat(self:getTalentRadius(t), damDesc(self, DamageType.ACID, t.getDamage(self, t)), Desc.vs"mp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/misc/horrors.lua b/game/modules/tome/data/talents/misc/horrors.lua
index ab8f870218afec066efd1b73e9fdbe878a8bda08..3e23042c16271ed516653a9976c26f3393f51ecd 100644
--- a/game/modules/tome/data/talents/misc/horrors.lua
+++ b/game/modules/tome/data/talents/misc/horrors.lua
@@ -62,8 +62,8 @@ newTalent{
 		local damage = t.getDamage(self, t) * 100
 		local bleed = t.getBleedDamage(self, t) * 100
 		local heal_penalty = t.getHealingPenalty(self, t)
-		return ([[A nasty bite that hits for %d%% weapon damage, reduces the targets healing by %d%%, and causes the target to bleed for %d%% weapon damage over 5 turns.
-		Only usable while frenzied.]]):tformat(damage, heal_penalty, bleed)
+		return ([[A nasty bite that hits for %d%% weapon damage, reduces the targets healing by %d%%, and causes the target to bleed for %d%% weapon damage over 5 turns %s.
+		Only usable while frenzied.]]):tformat(damage, heal_penalty, bleed, Desc.vs"pp")
 	end,
 }
 
@@ -170,10 +170,10 @@ newTalent{
 		local damage = t.getDamage(self, t) * 100
 		local bleed = t.getBleedDamage(self, t) * 100
 		local power = t.getPower(self, t) *100
-		return ([[Bites the target for %d%% weapon damage, potentially causing it to bleed for %d%% weapon damage over five turns.
+		return ([[Bites the target for %d%% weapon damage, potentially causing it to bleed for %d%% weapon damage over five turns %s.
 		If the target is affected by the bleed it will send the devourer into a frenzy for %d turns (which in turn will frenzy other nearby devourers).
 		The frenzy will increase global speed by %d%%, physical crit chance by %d%%, and prevent death until -%d%% life.]]):
-		tformat(damage, bleed, t.getDuration(self, t), power, power, power)
+		tformat(damage, bleed, t.getDuration(self, t), Desc.vs"pp", power, power, power)
 	end,
 }
 
@@ -220,8 +220,8 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local light_reduction = t.getLiteReduction(self, t)
 		local darkness_resistance = t.getDarknessPower(self, t)
-		return ([[Creates a shroud of darkness over a radius 3 area that lasts %d turns.  The shroud causes %0.2f darkness damage each turn, reduces light radius by %d, and darkness resistance by %d%% of those within.]]):
-		tformat(duration, damDesc(self, DamageType.DARKNESS, (damage)), light_reduction, darkness_resistance)
+		return ([[Creates a shroud of darkness over a radius 3 area that lasts %d turns.  The shroud causes %0.2f darkness damage each turn, reduces light radius by %d, and darkness resistance by %d%% of those within %s.]]):
+		tformat(duration, damDesc(self, DamageType.DARKNESS, (damage)), light_reduction, darkness_resistance, Desc.vs"ss")
 	end,
 }
 -- Temporal Stalker Powers
@@ -252,8 +252,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Shows the target the madness of the void.  Each turn for 6 turns the target must make a mental save or suffer %0.2f mind damage as well as resource damage (based off the mind damage and nature of the resource).]]):
-		tformat(damDesc(self, DamageType.MIND, (damage)))
+		return ([[Shows the target the madness of the void.  Each turn for 6 turns the target may suffer %0.2f mind damage as well as resource damage %s.]]):
+		tformat(damDesc(self, DamageType.MIND, (damage)), Desc.vs"mm")
 	end,
 }
 
@@ -548,10 +548,10 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Grab a target and drag it to your side, holding it in place and silencing non-undead and creatures that need to breathe for %d turns.
+		return ([[Grab a target and drag it to your side, holding it in place and silencing non-undead and creatures that need to breathe for %d turns. %s
 		The grab will also deal %0.2f slime damage per turn.
 		The damage will increase with your Mindpower.]]):
-		tformat(duration, damDesc(self, DamageType.SLIME, damage))
+		tformat(duration, Desc.vs"mp", damDesc(self, DamageType.SLIME, damage))
 	end,
 }
 
@@ -700,8 +700,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Blast a wave of water all around you with a radius of %d, making all creatures Wet for 10 turns.
-		The damage will increase with your Spellpower.]]):tformat(radius)
+		return ([[Blast a wave of water all around you with a radius of %d, making all creatures Wet for 10 turns %s.
+		The damage will increase with your Spellpower.]]):tformat(radius, Desc.vs())
 	end,
 }
 
@@ -730,9 +730,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local Pdam, Fdam = self:damDesc(DamageType.PHYSICAL, self.level/2), self:damDesc(DamageType.ACID, self.level/2)
-		return ([[Latch on to the target and suck their blood, doing %0.2f physical and %0.2f acid damage per turn.
+		return ([[Latch on to the target and suck their blood, doing %0.2f physical and %0.2f acid damage per turn %s.
 		After 5 turns of drinking, drop off and gain the ability to Multiply.
 		Damage scales with your level.
-		]]):tformat(Pdam, Fdam)
+		]]):tformat(Pdam, Fdam, Desc.vs"as")
 	end,
 }
diff --git a/game/modules/tome/data/talents/misc/inscriptions.lua b/game/modules/tome/data/talents/misc/inscriptions.lua
index ff7f4e6f62c9cfe1879535e750f1e177c6035451..821ec9f72b42fd59e9539caf43bae43713242476 100644
--- a/game/modules/tome/data/talents/misc/inscriptions.lua
+++ b/game/modules/tome/data/talents/misc/inscriptions.lua
@@ -632,9 +632,9 @@ newInscription{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Inflicts %0.2f temporal damage.  If your target survives, it will be sent %d turns into the future.
+		return ([[Inflicts %0.2f temporal damage.  If your target survives, it will be sent %d turns into the future %s.
 		It will also lower your paradox by 25 (if you have any).
-		Note that messing with the spacetime continuum may have unforeseen consequences.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration)
+		Note that messing with the spacetime continuum may have unforeseen consequences.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration, Desc.vs"ss")
 	end,
 	short_info = function(self, t)
 		return ("%0.2f temporal damage, removed from time %d turns"):tformat(t.getDamage(self, t), t.getDuration(self, t))
diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua
index 633a0337b4a9c72887e28b3631b5a1e595aa0fa9..50dcc82bf25750e618d603dde0a8b761b386d83f 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -157,8 +157,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Releases stinging spores at the target, blinding it for %d turns.]]):
-		tformat(t.getDuration(self, t))
+		return ([[Releases stinging spores at the target, blinding it for %d turns %s.]]):
+		tformat(t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
@@ -219,9 +219,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target doing %d%% damage. If the attack hits, the target is stunned for %d turns.
-		The chance to stun improves with your Physical Power.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1), t.getDuration(self, t))
+		return ([[Hits the target doing %d%% damage. If the attack hits, the target is stunned for %d turns %s.]]):
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1), t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
@@ -253,8 +252,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target doing %d%% damage and trying to disarm the target for %d turns. The chance improves with your Physical Power.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1), t.getDuration(self, t))
+		return ([[Hits the target doing %d%% damage and trying to disarm the target for %d turns %s.]]):
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1), t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
@@ -288,9 +287,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target doing %d%% damage. If the attack hits, the target is constricted for %d turns.
-		The constriction power improves with your Physical Power.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1), t.getDuration(self, t))
+		return ([[Hits the target doing %d%% damage. If the attack hits, the target is constricted for %d turns %d.]]):
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1), t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
@@ -324,7 +322,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target with your weapon doing %d%% damage. If the attack hits, the target is knocked back up to 4 grids.  The chance improves with your Physical Power.]]):tformat(100 * self:combatTalentWeaponDamage(t, 1.5, 2))
+		return ([[Hits the target with your weapon doing %d%% damage. If the attack hits, the target is knocked back up to 4 grids %s.]]):tformat(100 * self:combatTalentWeaponDamage(t, 1.5, 2), Desc.vs"pp")
 	end,
 }
 
@@ -453,8 +451,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target doing %d%% damage. If the attack hits, the target is afflicted with a disease, inflicting %0.2f blight damage per turn for %d turns and reducing constitution by 10%% + 4.  The disease damage increases with your Strength, and the chance to apply it increases with your Physical Power.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1),damDesc(self, DamageType.BLIGHT,t.getDamage(self, t)),t.getDuration(self, t))
+		return ([[Hits the target doing %d%% damage. If the attack hits, the target is afflicted with a disease %s, inflicting %0.2f blight damage per turn for %d turns and reducing constitution by 10%% + 4.  The disease damage increases with your Strength, and the chance to apply it increases with your Physical Power.]]):
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1),damDesc(self, Desc.vs"ps", DamageType.BLIGHT,t.getDamage(self, t)),t.getDuration(self, t))
 	end,
 }
 
@@ -489,8 +487,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target doing %d%% damage. If the attack hits, the target is afflicted with a disease, inflicting %0.2f blight damage per turn for %d turns and reducing dexterity by 10%% + 4.  The disease damage increases with your Strength, and the chance to apply it increases with your Physical Power.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1),damDesc(self, DamageType.BLIGHT,t.getDamage(self, t)),t.getDuration(self, t))
+		return ([[Hits the target doing %d%% damage. If the attack hits, the target is afflicted with a disease %s, inflicting %0.2f blight damage per turn for %d turns and reducing dexterity by 10%% + 4.  The disease damage increases with your Strength, and the chance to apply it increases with your Physical Power.]]):
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1),damDesc(self, Desc.vs"ps", DamageType.BLIGHT,t.getDamage(self, t)),t.getDuration(self, t))
 	end,
 }
 
@@ -525,8 +523,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target doing %d%% damage. If the attack hits, the target is afflicted with a disease, inflicting %0.2f blight damage per turn for %d turns and reducing strength by 10%% + 4.  The disease damage increases with your Strength, and the chance to apply it increases with your Physical Power.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1),damDesc(self, DamageType.BLIGHT,t.getDamage(self, t)),t.getDuration(self, t))
+		return ([[Hits the target doing %d%% damage. If the attack hits, the target is afflicted with a disease %s, inflicting %0.2f blight damage per turn for %d turns and reducing strength by 10%% + 4.  The disease damage increases with your Strength, and the chance to apply it increases with your Physical Power.]]):
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 1), Desc.vs"ps", damDesc(self, DamageType.BLIGHT,t.getDamage(self, t)),t.getDuration(self, t))
 	end,
 }
 
@@ -551,7 +549,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Try to confuse the target's mind for %d (power %d%%) turns.]]):tformat(t.getDuration(self, t), t.getConfusion(self, t))
+		return ([[Try to confuse the target's mind for %d (power %d%%) turns %s.]]):tformat(t.getDuration(self, t), t.getConfusion(self, t), Desc.vs"sm")
 	end,
 }
 
@@ -649,7 +647,7 @@ newTalent{
 			local actor = game.level.map(px, py, Map.ACTOR)
 			if actor and actor ~= self then
 				local tg2 = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="arrow", particle_args={tile="particles_images/ice_shards"}}}
-				self:projectile(tg2, px, py, DamageType.ICE, self:spellCrit(t.getDamage(self, t)), {type="freeze"})
+				self:projectile(tg2, px, py, DamageType.ICE, {chance=25,dam=self:spellCrit(t.getDamage(self, t)),apply_power=self:combatSpellpower()}, {type="freeze"})
 			end
 		end)
 		game:playSoundNear(self, "talents/ice")
@@ -657,9 +655,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Hurl ice shard at the target dealing %0.2f ice damage.
+		return ([[Hurl ice shard at the target dealing %0.2f ice damage, 25%% chance of freezing %s.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.COLD, damage))
+		tformat(damDesc(self, DamageType.COLD, damage), Desc.vs"sp")
 	end,
 }
 
@@ -846,7 +844,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target doing %d%% damage; if the attack hits, the target is pinned to the ground for %d turns.  The chance to pin improves with Physical Power.]]):tformat(100 * self:combatTalentWeaponDamage(t, 0.8, 1.4), t.getDuration(self, t))
+		return ([[Hits the target doing %d%% damage; if the attack hits, the target is pinned to the ground for %d turns %s.]]):tformat(100 * self:combatTalentWeaponDamage(t, 0.8, 1.4), t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
@@ -877,7 +875,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[You project thick black ink, blinding targets in a radius %d cone for %d turns.  The chance to blind improves with Physical Power.]]):tformat(t.radius(self, t), duration)
+		return ([[You project thick black ink, blinding targets in a radius %d cone for %d turns %s.]]):tformat(t.radius(self, t), duration, Desc.vs"pp")
 	end,
 }
 
@@ -1008,8 +1006,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Rushes toward your target with incredible speed. If the target is reached, you use your claws to pin it to the ground for 5 turns.
-		You must rush from at least 2 tiles away.]]):tformat()
+		return ([[Rushes toward your target with incredible speed. If the target is reached, you use your claws to pin it to the ground for 5 turns %s.
+		You must rush from at least 2 tiles away.]]):tformat(Desc.vs())
 	end,
 }
 
@@ -1290,8 +1288,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target with a mighty blow to the legs doing %d%% weapon damage. If the attack hits, the target is unable to move for %d turns.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.4), t.getDuration(self, t))
+		return ([[Hits the target with a mighty blow to the legs doing %d%% weapon damage. If the attack hits, the target is unable to move for %d turns %s.]]):
+		tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.4), t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
@@ -1315,8 +1313,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Sends a telepathic attack, silencing the target for %d turns.  The chance to silence improves with Mindpower.]]):
-		tformat(t.getDuration(self, t))
+		return ([[Sends a telepathic attack, silencing the target for %d turns %s.]]):
+		tformat(t.getDuration(self, t), Desc.vs"mm")
 	end,
 }
 
@@ -1650,8 +1648,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Saps 30%% of the target's speed (increasing yours by the same amount) and inflicts %0.2f temporal damage for three turns.
-		]]):tformat(damDesc(self, DamageType.TEMPORAL, damage))
+		return ([[Saps 30%% of the target's speed %s and increases yours by the same amount, then inflicts %0.2f temporal damage for three turns.
+		]]):tformat(Desc.vs(), damDesc(self, DamageType.TEMPORAL, damage))
 	end,
 }
 
@@ -1734,7 +1732,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Start to sever the lifeline of the target. After 4 turns, if the target is still in line of sight of you, its existance will be ended (%d temporal damage).]]):tformat(damDesc(self, "TEMPORAL", t.getDamage(self, t)))
+		return ([[Start to sever the lifeline of the target %s. After 4 turns, if the target is still in line of sight of you, its existance will be ended (%d temporal damage).]]):tformat(Desc.vs(), damDesc(self, "TEMPORAL", t.getDamage(self, t)))
 	end,
 }
 
@@ -2279,10 +2277,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Grab a target and pull it next to you, covering it with frost while reducing its movement speed by 50%% for %d turns.
+		return ([[Grab a target and pull it next to you, covering it with frost while reducing its movement speed by 50%% for %d turns %s.
 		The ice will also deal %0.2f cold damage.
 		The damage and chance to slow will increase with your Spellpower.]]):
-		tformat(t.getDuration(self, t), damDesc(self, DamageType.COLD, self:combatTalentSpellDamage(t, 5, 140)))
+		tformat(t.getDuration(self, t), damDesc(self, Desc.vs"sp", DamageType.COLD, self:combatTalentSpellDamage(t, 5, 140)))
 	end,
 }
 
@@ -2334,10 +2332,10 @@ newTalent{
 		local drain = self:getTalentLevel(t) * 2
 		local daze = t.getDuration(self, t, 0)
 		local dazemax = t.getDuration(self, t, 5)
-		return ([[A punch to the body that deals %d%% damage, drains %d of the target's stamina per combo point, and dazes the target for %d to %d turns, depending on the amount of combo points you've accumulated.
+		return ([[A punch to the body that deals %d%% damage, drains %d of the target's stamina per combo point, and dazes the target for %d to %d turns %s, depending on the amount of combo points you've accumulated.
 		The daze chance will increase with your Physical Power.
 		Using this talent removes your combo points.]])
-		:tformat(damage, drain, daze, dazemax)
+		:tformat(damage, drain, daze, dazemax, Desc.vs"pp")
 	end,
 }
 
@@ -2425,9 +2423,9 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local damage = t.getDamage(self, t)
 		local maim = t.getMaim(self, t)
-		return ([[Grapples the target and inflicts %0.2f physical damage. If the target is already grappled, the target will be maimed as well, reducing damage by %d and global speed by 30%% for %d turns.
+		return ([[Grapples the target %s and inflicts %0.2f physical damage. If the target is already grappled, the target will be maimed as well, reducing damage by %d and global speed by 30%% for %d turns.
 		The grapple effects will be based off your grapple talent, if you have it, and the damage will scale with your Physical Power.]])
-		:tformat(damDesc(self, DamageType.PHYSICAL, (damage)), maim, duration)
+		:tformat(Desc.vs(), damDesc(self, DamageType.PHYSICAL, (damage)), maim, duration)
 	end,
 }
 
@@ -2474,8 +2472,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local returndamage = t.getReturnDamage(self, t)
-		return ([[Designate a target as a martyr for 10 turns. When the martyr deals damage, it also damages itself for %d%% of the damage dealt.]]):
-		tformat(returndamage)
+		return ([[Designate a target as a martyr for 10 turns %s. When the martyr deals damage, it also damages itself for %d%% of the damage dealt.]]):
+		tformat(Desc.vs"ss", returndamage)
 	end,
 }
 
@@ -2523,8 +2521,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Hits the target with your weapon doing %d%% damage and two shield strikes doing %d%% damage each, trying to overpower your target.
-		If the last attack hits, the target is knocked back 4 grids. The chance for knockback increases with your Accuracy.]])
-		:tformat(100 * self:combatTalentWeaponDamage(t, 0.8, 1.3), 100 * self:combatTalentWeaponDamage(t, 0.8, 1.3, self:getTalentLevel(self.T_SHIELD_EXPERTISE)))
+		If the last attack hits, the target is knocked back 4 grids %s.]])
+		:tformat(100 * self:combatTalentWeaponDamage(t, 0.8, 1.3), 100 * self:combatTalentWeaponDamage(t, 0.8, 1.3, self:getTalentLevel(self.T_SHIELD_EXPERTISE)), Desc.vs"ap")
 	end,
 }
 
@@ -2683,10 +2681,10 @@ newTalent{
 		local range = self:getTalentRange(t)
 		local dam = damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t))
 		return ([[Use your telekinetic power to enhance your strength, allowing you to pick up an adjacent enemy and hurl it anywhere within radius %d.
-		Upon landing, your target takes %0.1f Physical damage and is stunned for 4 turns.  All other creatures within radius 2 of the landing point take %0.1f Physical damage and are knocked away from you.
+		Upon landing, your target takes %0.1f Physical damage and is stunned for 4 turns %s.  All other creatures within radius 2 of the landing point take %0.1f Physical damage and are knocked away from you.
 		This talent ignores %d%% of the knockback resistance of the thrown target, which takes half damage if it resists being thrown.
 		The damage improves with your Mindpower and the range increases with both Mindpower and Strength.]]):
-		tformat(range, dam, dam/2, t.getKBResistPen(self, t))
+		tformat(range, dam, Desc.vs"mp", dam/2, t.getKBResistPen(self, t))
 	end,
 }
 
@@ -2936,10 +2934,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Throws a vial of sticky smoke that explodes in radius %d on your foes, reducing their vision range by %d for 5 turns.
+		return ([[Throws a vial of sticky smoke that explodes in radius %d on your foes, reducing their vision range by %d for 5 turns. %s
 		Creatures affected by smoke bomb can never prevent you from stealthing, even if their proximity would normally forbid it.
 		Use of this will not break stealth.]]):
-		tformat(self:getTalentRadius(t), t.getSightLoss(self,t))
+		tformat(self:getTalentRadius(t), t.getSightLoss(self,t), Desc.vs"ap")
 	end,
 }
 
@@ -3027,9 +3025,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		local speedpen = t.getSpeedPenalty(self, t)
-		return ([[You hit your target, doing %d%% damage. If your attack connects, the target is crippled for %d turns, losing %d%% melee, spellcasting and mind speed.
-		The chance to land the status improves with Accuracy, and the status power improves with Cunning.]]):
-		tformat(100 * damage, duration, speedpen)
+		return ([[You hit your target, doing %d%% damage. If your attack connects, the target is crippled for %d turns %s, losing %d%% melee, spellcasting and mind speed.
+		The status power improves with Cunning.]]):
+		tformat(100 * damage, duration, Desc.vs"ap", speedpen)
 	end,
 }
 
@@ -3417,9 +3415,9 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local damagetwo = t.getDamageTwo(self, t)
-		return ([[When you avoid a melee blow while unarmed, you have a %d%% chance to throw the target to the ground.  If the throw lands, the target will take %0.2f damage and be dazed for 2 turns, or %0.2f damage and be stunned for 2 turns if the target is grappled.  You may attempt up to %0.1f throws per turn.
+		return ([[When you avoid a melee blow while unarmed, you have a %d%% chance to throw the target to the ground.  If the throw lands, the target will take %0.2f damage and be dazed %s for 2 turns, or %0.2f damage and be stunned %s for 2 turns if the target is grappled.  You may attempt up to %0.1f throws per turn.
 		The chance of throwing increases with your Accuracy, the damage scales with your Physical Power, and the number of attempts with your Strength and Dexterity.]]):
-		tformat(t.getchance(self,t), damDesc(self, DamageType.PHYSICAL, (damage)), damDesc(self, DamageType.PHYSICAL, (damagetwo)), t.getThrows(self, t))
+		tformat(t.getchance(self,t), damDesc(self, DamageType.PHYSICAL, (damage)), Desc.vs"ap", damDesc(self, DamageType.PHYSICAL, (damagetwo)), Desc.vs"ap", t.getThrows(self, t))
 	end,
 }
 
@@ -3525,9 +3523,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[You reach out with shadowy vines toward your target, pulling it to you and silencing it for %d turns and dazing it for 2 turns.
-		The chance to hit improves with your Accuracy.]]):
-		tformat(duration)
+		return ([[You reach out with shadowy vines toward your target, pulling it to you and silencing %s it for %d turns and dazing %s it for 2 turns.]]):
+		tformat(Desc.vs"am", duration, Desc.vs"ap")
 	end,
 }
 
@@ -3650,9 +3647,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[For an instant, your weapons turn into a shadow leash that tries to grab the target's weapon, disarming it for %d turns.
-		The chance to hit improves with your Accuracy.]]):
-		tformat(duration)
+		return ([[For an instant, your weapons turn into a shadow leash that tries to grab the target's weapon, disarming it for %d turns %s.]]):
+		tformat(duration, Desc.vs"ap")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/misc/objects.lua b/game/modules/tome/data/talents/misc/objects.lua
index 7b1a050f097ae6ab681342b29528ce32737c7048..92ab7c455004a9ae1503cd10b17100f2ecb27043 100644
--- a/game/modules/tome/data/talents/misc/objects.lua
+++ b/game/modules/tome/data/talents/misc/objects.lua
@@ -429,7 +429,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[The target has a %d%% chance (stacking to a maximum of %d%%) to fail to cast any spell.  At level 2 magical effects may be disrupted, at level 3 magical sustains may be disrupted, and at level 5 magical constructs and undead may be stunned.]]):tformat(t.getpower(self, t),t.maxpower(self,t))
+		return ([[The target has a %d%% chance (stacking to a maximum of %d%%) to fail to cast any spell %s.  At level 2 magical effects may be disrupted, at level 3 magical sustains may be disrupted, and at level 5 magical constructs and undead may be stunned %s.]]):tformat(t.getpower(self, t),t.maxpower(self,t), Desc.vs"mp", Desc.vs"mp")
 	end,
 }
 
@@ -465,8 +465,8 @@ newTalent{
 		return
 	end,
 	info = function(self, t)
-		return ([[You enter into a fighting trance, gaining 15%% resist all, losing 15 mindpower, but gaining 20 mental save. However, each turn after the fifth that this talent is active, there is a chance that you will be overcome and become confused.
-This does not take a turn to use.]]):tformat()
+		return ([[You enter into a fighting trance, gaining 15%% resist all, losing 15 mindpower, but gaining 20 mental save. However, each turn after the fifth that this talent is active, there is a chance that you will be overcome and become confused %s.
+This does not take a turn to use.]]):tformat(Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/augmented-mobility.lua b/game/modules/tome/data/talents/psionic/augmented-mobility.lua
index 95a4ed168fedb7305dd8a0f92ee6a614bcb1a0db..d59db4fb3634ccbdcee6d752d2df3b589227f35e 100644
--- a/game/modules/tome/data/talents/psionic/augmented-mobility.lua
+++ b/game/modules/tome/data/talents/psionic/augmented-mobility.lua
@@ -110,10 +110,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		local range = self:getTalentRange(t)
-		return ([[Briefly extend your telekinetic reach to grab an enemy, haul them towards you and daze them for 1 turn.
+		return ([[Briefly extend your telekinetic reach to grab an enemy, haul them towards you and daze them for 1 turn %s.
 		Works on enemies up to %d squares away.
 		The cooldown decreases, and the range increases, with additional talent points spent.]]):
-		tformat(range)
+		tformat(Desc.vs"mp", range)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/augmented-striking.lua b/game/modules/tome/data/talents/psionic/augmented-striking.lua
index 9aba052d4a618023b1b57b2ed6923ec35e7dcca5..70b626160ab2ee219faafb899180e4ff0cb61fb5 100644
--- a/game/modules/tome/data/talents/psionic/augmented-striking.lua
+++ b/game/modules/tome/data/talents/psionic/augmented-striking.lua
@@ -99,10 +99,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Focus kinetic energy and strike an enemy for %d%% weapon damage as physical.
-		They will be pinned to the ground for %d turns by the force of this attack.
+		They will be pinned to the ground for %d turns by the force of this attack %s.
 		Any frozen creature hit by this attack will take an extra %0.2f physical damage.
 		The extra damage will scale with your Mindpower.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 2.0), t.getDur(self, t), damDesc(self, DamageType.PHYSICAL, t.getDam(self, t)))
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 2.0), t.getDur(self, t), Desc.vs"mp", damDesc(self, DamageType.PHYSICAL, t.getDam(self, t)))
 	end,
 }
 
@@ -139,11 +139,11 @@ newTalent{
 			if self:hasEffect(self.EFF_TRANSCENDENT_PYROKINESIS) then
 				local tg = {type="ball", range=1, radius=1, friendlyfire=false}
 				self:project(tg, x, y, DamageType.COLD, dam)
-				self:project(tg, x, y, DamageType.FREEZE, {dur=dur, hp=dam})
+				self:project(tg, x, y, DamageType.FREEZE, {dur=dur, hp=dam, apply_power = self:combatMindpower()})
 				game.level.map:particleEmitter(x, y, tg.radius, "iceflash", {radius=1})
 			else
 				DamageType:get(DamageType.COLD).projector(self, x, y, DamageType.COLD, dam)
-				DamageType:get(DamageType.FREEZE).projector(self, x, y, DamageType.FREEZE, {dur=dur, hp=dam})
+				DamageType:get(DamageType.FREEZE).projector(self, x, y, DamageType.FREEZE, {dur=dur, hp=dam, apply_power = self:combatMindpower()})
 			end
 
 			if target:hasEffect(target.EFF_PINNED) and target:hasEffect(target.EFF_FROZEN) then
@@ -197,10 +197,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Focus thermal energy and strike an enemy for %d%% weapon damage as cold.
-		A burst of cold will then engulf them, doing an extra %0.1f Cold damage and also freeze them for %d turns.
+		A burst of cold will then engulf them, doing an extra %0.1f Cold damage and also freeze them for %d turns %s.
 		If the attack freezes a pinned creature a burst of ice is summoned, circling the caster and the creature with a wall of ice for 3 turns.
 		The cold burst damage will scale with your Mindpower.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 2.0), damDesc(self, DamageType.COLD, t.getDam(self, t)), t.getDur(self, t))
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 2.0), damDesc(self, DamageType.COLD, t.getDam(self, t)), t.getDur(self, t), Desc.vs"mp")
 	end,
 }
 
@@ -312,11 +312,11 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Focus charged energy and strike an enemy for %d%% weapon damage as lightning.
-		Energy will then discharge from your weapon, doing an extra %0.2f lightning damage and halving their stun/daze/freeze/pin resistance for %d turns.
+		Energy will then discharge from your weapon, doing an extra %0.2f lightning damage and halving their stun/daze/freeze/pin resistance for %d turns %s.
 		If the target is pinned and Charged Shield is sustained, its absorb value will be increased by %0.2f.
 		If the target is frozen, the ice will melt in a flash of vapour, knocking back all creatures around it in radius 2.
 		The discharge damage will scale with your Mindpower.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 2.0), damDesc(self, DamageType.LIGHTNING, t.getDam(self, t)), t.getDur(self, t), 1.5 * damDesc(self, DamageType.LIGHTNING, t.getDam(self, t)))
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 2.0), damDesc(self, DamageType.LIGHTNING, t.getDam(self, t)), t.getDur(self, t), Desc.vs"ms", 1.5 * damDesc(self, DamageType.LIGHTNING, t.getDam(self, t)))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/charged-mastery.lua b/game/modules/tome/data/talents/psionic/charged-mastery.lua
index 5fcc77bf4b841691e8374cc2e826a5a87f70feb3..bc219da4101d36b283c39830439b5206e410f23e 100644
--- a/game/modules/tome/data/talents/psionic/charged-mastery.lua
+++ b/game/modules/tome/data/talents/psionic/charged-mastery.lua
@@ -46,11 +46,11 @@ newTalent{
 		The cooldowns of Charged Shield, Charged Leech, Charged Aura, Charged Strike and Brainstorm are reset.
 		Charged Aura effects will have their radius increased by 1.
 		Your Charged Shield will have 100%% absorption efficiency and will absorb twice the normal amount of damage.
-		Brainstorm will also inflict blindness.
-		Charge Leech will also inflict confusion (%d%% effect).
+		Brainstorm will also inflict blindness %s.
+		Charge Leech will also inflict confusion (%d%% effect) %s.
 		Charged Strike will have its secondary lightning burst chain to up to 3 targets in a radius of 3.
 		The damage bonus and resistance penetration scale with your Mindpower.
-		Only one Transcendent talent may be in effect at a time.]]):tformat(t.getDuration(self, t), t.getPower(self, t), t.getPenetration(self, t), t.getConfuse(self, t))
+		Only one Transcendent talent may be in effect at a time.]]):tformat(t.getDuration(self, t), t.getPower(self, t), t.getPenetration(self, t), Desc.vs"mp", t.getConfuse(self, t), Desc.vs"mm")
 	end,
 }
 
@@ -117,10 +117,10 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		return ([[Cast a net of static electricity in a radius of %d for %d turns.
-		Enemies standing in the net will take %0.1f Lightning damage and be slowed by %d%%.
+		Enemies standing in the net will take %0.1f Lightning damage and be slowed by %d%% %s.
 		When you move through the net, a static charge will accumulate on your weapon which will add %0.1f additional Lightning damage to your next attack for each turn you spend within its area.
 		These effects scale with your Mindpower.]]):
-		tformat(self:getTalentRadius(t), duration, damDesc(self, DamageType.LIGHTNING, damage), t.getSlow(self, t), damDesc(self, DamageType.LIGHTNING, t.getWeaponDamage(self, t)))
+		tformat(self:getTalentRadius(t), duration, damDesc(self, DamageType.LIGHTNING, damage), t.getSlow(self, t), Desc.vs"mp", damDesc(self, DamageType.LIGHTNING, t.getWeaponDamage(self, t)))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/distortion.lua b/game/modules/tome/data/talents/psionic/distortion.lua
index 6608ae603466af4263c40369f4e71b88455ab6ae..5ba4392d46d78d284cfb2b0f3b6e51fa63786400 100644
--- a/game/modules/tome/data/talents/psionic/distortion.lua
+++ b/game/modules/tome/data/talents/psionic/distortion.lua
@@ -66,11 +66,11 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
 		local distort = DistortionCount(self)
-		return ([[Fire a bolt of distortion that ignores resistance and inflicts %0.2f physical damage.  This damage will distort affected targets, decreasing physical resistance by %d%% and rendering them vulnerable to distortion effects for two turns.
+		return ([[Fire a bolt of distortion that ignores resistance and inflicts %0.2f physical damage.  This damage will distort affected targets %s, decreasing physical resistance by %d%% and rendering them vulnerable to distortion effects for two turns.
 		If the bolt comes in contact with a target that's already distorted, a detonation will occur, inflicting 150%% of the base damage in a radius of %d.
 		Investing in this talent will increase the physical resistance reduction from all of your distortion effects.
 		At talent level 5, you learn to shape your distortion effects, preventing them from hitting you or your allies.
-		The damage will scale with your Mindpower.]]):tformat(damDesc(self, DamageType.PHYSICAL, damage), distort, radius)
+		The damage will scale with your Mindpower.]]):tformat(damDesc(self, DamageType.PHYSICAL, damage), Desc.vs(), distort, radius)
 	end,
 }
 
@@ -111,11 +111,11 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		local power = t.getPower(self, t)
 		local distort = DistortionCount(self)
-		return ([[Creates a distortion wave in a radius %d cone that deals %0.2f physical damage and knocks back targets in the blast radius.
-		This damage will distort affected targets, decreasing physical resistance by %d%% and rendering them vulnerable to distortion effects for two turns.
+		return ([[Creates a distortion wave in a radius %d cone that deals %0.2f physical damage and knocks back targets in the blast radius %s.
+		This damage will distort affected targets %s, decreasing physical resistance by %d%% and rendering them vulnerable to distortion effects for two turns.
 		Investing in this talent will increase the physical resistance reduction from all of your distortion effects.
-		If the target is already distorted, they'll be stunned for %d turns as well.
-		The damage will scale with your Mindpower.]]):tformat(radius, damDesc(self, DamageType.PHYSICAL, damage), distort, power)
+		If the target is already distorted, they'll be stunned for %d turns as well %s.
+		The damage will scale with your Mindpower.]]):tformat(radius, damDesc(self, DamageType.PHYSICAL, damage), Desc.vs"mp", Desc.vs(), distort, power, Desc.vs"mp")
 	end,
 }
 
@@ -157,11 +157,11 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		local distort = DistortionCount(self)
-		return ([[Ravages the target with distortion, inflicting %0.2f physical damage each turn for %d turns.
-		This damage will distort affected targets, decreasing physical resistance by %d%% and rendering them vulnerable to distortion effects for two turns.
+		return ([[Ravages the target with distortion %s, inflicting %0.2f physical damage each turn for %d turns.
+		This damage will distort affected targets %s, decreasing physical resistance by %d%% and rendering them vulnerable to distortion effects for two turns.
 		If the target is already distorted when Ravage is applied, the damage will be increased by 50%% and the target will lose one beneficial physical effect or sustain each turn.
 		Investing in this talent will increase the physical resistance reduction from all of your distortion effects.
-		The damage will scale with your Mindpower.]]):tformat(damDesc(self, DamageType.PHYSICAL, damage), duration, distort)
+		The damage will scale with your Mindpower.]]):tformat(Desc.vs"mp", damDesc(self, DamageType.PHYSICAL, damage), duration, Desc.vs(), distort)
 	end,
 }
 
@@ -261,8 +261,8 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		local distort = DistortionCount(self)
 		return ([[Create a powerful maelstorm for %d turns.  Each turn, the maelstrom will pull in targets within a radius of %d, and inflict %0.2f physical damage.
-		This damage will distort affected targets, decreasing physical resistance by %d%% and rendering them vulnerable to distortion effects for two turns.
+		This damage will distort affected targets %s, decreasing physical resistance by %d%% and rendering them vulnerable to distortion effects for two turns.
 		Investing in this talent will increase the physical resistance reduction from all of your distortion effects.
-		The damage will scale with your Mindpower.]]):tformat(duration, radius, damDesc(self, DamageType.PHYSICAL, damage), distort)
+		The damage will scale with your Mindpower.]]):tformat(duration, radius, damDesc(self, DamageType.PHYSICAL, damage), Desc.vs(), distort)
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/psionic/dream-forge.lua b/game/modules/tome/data/talents/psionic/dream-forge.lua
index cf7f1e490c6e9d37a731d0fc6ee8f9580ccb7741..2578eb033a281289eeec8a528ad2b634dd1df86d 100644
--- a/game/modules/tome/data/talents/psionic/dream-forge.lua
+++ b/game/modules/tome/data/talents/psionic/dream-forge.lua
@@ -278,9 +278,9 @@ newTalent{
 		local fail = t.getFailChance(self,t)
 		return ([[The pounding forge of thought in your mind is released upon your surroundings.  Each turn that you remain stationary, you'll strike the dreamforge, inflicting mind and burning damage on enemies around you.
 		The effect will build over five turns, until it reaches a maximum radius of %d, maximum mind damage of %0.2f, and maximum burning damage of %0.2f.
-		At this point you'll begin breaking the dreams of enemies who hear the forge, reducing their Mental Save by %d and giving them a %d%% chance of spell failure due to the tremendous echo in their minds for %d turns.
-		Broken Dreams has a %d%% chance to brainlock your enemies.
+		At this point you'll begin breaking the dreams of enemies who hear the forge, reducing their Mental Save by %d and giving them a %d%% chance of spell failure due to the tremendous echo in their minds for %d turns %s.
+		Broken Dreams has a %d%% chance to brainlock your enemies %s.
 		The damage and dream breaking effect will scale with your Mindpower.]]):
-		tformat(radius, damDesc(self, DamageType.MIND, damage), damDesc(self, DamageType.FIRE, damage), power, fail, duration, chance)
+		tformat(radius, damDesc(self, DamageType.MIND, damage), damDesc(self, DamageType.FIRE, damage), power, fail, duration, Desc.vs"mm", chance, Desc.vs"mm")
 	end,
 }
diff --git a/game/modules/tome/data/talents/psionic/dream-smith.lua b/game/modules/tome/data/talents/psionic/dream-smith.lua
index 0f7e5deb28faf2ad38612abe42e9fa7db9cbd526..ca1b93396e0fa4edbf511ed117da6420590ee88c 100644
--- a/game/modules/tome/data/talents/psionic/dream-smith.lua
+++ b/game/modules/tome/data/talents/psionic/dream-smith.lua
@@ -226,9 +226,9 @@ newTalent{
 		local power = t.getDamage(self, t)
 		local percent = t.getPercentInc(self, t)
 		local stun = t.getStun(self, t)
-		return ([[Crush your enemy with your Dream Hammer, inflicting %d%% weapon damage.  If the attack hits, the target is stunned for %d turns.
-		Stun chance improves with your Mindpower.  Learning this talent increases your Physical Power for Dream Hammer damage calculations by %d and all damage with Dream Hammer attacks by %d%%.
-		]]):tformat(damage * 100, stun, power, percent * 100)
+		return ([[Crush your enemy with your Dream Hammer, inflicting %d%% weapon damage.  If the attack hits, the target is stunned for %d turns %s.
+		Learning this talent increases your Physical Power for Dream Hammer damage calculations by %d and all damage with Dream Hammer attacks by %d%%.
+		]]):tformat(damage * 100, stun, Desc.vs"mp", power, percent * 100)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/dreaming.lua b/game/modules/tome/data/talents/psionic/dreaming.lua
index e22afd2944359fa1d515cbb7b4cedabe16d541f0..ef7a50a3e7b11f853a6d641afcbec4ed9e9b2c2b 100644
--- a/game/modules/tome/data/talents/psionic/dreaming.lua
+++ b/game/modules/tome/data/talents/psionic/dreaming.lua
@@ -91,10 +91,10 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local power = t.getSleepPower(self, t)
 		local insomnia = t.getInsomniaPower(self, t)
-		return([[Puts targets in a radius of %d to sleep for %d turns, rendering them unable to act.  Every %d points of damage the target suffers will reduce the effect duration by one turn.
+		return([[Puts targets in a radius of %d to sleep for %d turns %s, rendering them unable to act.  Every %d points of damage the target suffers will reduce the effect duration by one turn.
 		When Sleep ends, the target will suffer from Insomnia for a number of turns equal to the amount of time it was asleep (up to ten turns max), granting it %d%% sleep immunity for each turn of the Insomnia effect.
 		At talent level 5 Sleep will become contagious and has a 25%% chance to spread to nearby targets each turn.
-		The damage threshold will scale with your Mindpower.]]):tformat(radius, duration, power, insomnia)
+		The damage threshold will scale with your Mindpower.]]):tformat(radius, duration, Desc.vs"mm", power, insomnia)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/focus.lua b/game/modules/tome/data/talents/psionic/focus.lua
index 56e670e4af58d1c5a564f10e2b3b6af1ea1554b6..44b914e2884ef70dbc7bdde34ca1143dbc327f84 100644
--- a/game/modules/tome/data/talents/psionic/focus.lua
+++ b/game/modules/tome/data/talents/psionic/focus.lua
@@ -58,9 +58,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local dam = t.getDamage(self, t)
-		return ([[Focus energies into a beam to lash all creatures in a line with physical force, doing %d Physical damage and knocking them off balance (-15%% damage penalty) for 2 turns.
+		return ([[Focus energies into a beam to lash all creatures in a line with physical force, doing %d Physical damage and knocking them off balance (-15%% damage penalty) for 2 turns %s.
 		The damage will scale with your Mindpower.]]):
-		tformat(damDesc(self, DamageType.PHYSICAL, dam))
+		tformat(damDesc(self, DamageType.PHYSICAL, dam), Desc.vs"mp")
 	end,
 }
 
@@ -141,9 +141,9 @@ newTalent{
 		local dam = t.getDamage(self, t)
 		return ([[Mentally focus electricity into a ball of plasma and hurl it at the target.
 		The plasma will explode on impact, dealing %0.1f Lightning damage within radius %d.
-		This talent will apply cross tier Brainlock.
+		This talent will apply cross tier Brainlock %s.
 		The damage will increase with your Mindpower.]]):
-		tformat(damDesc(self, DamageType.LIGHTNING, dam), self:getTalentRadius(t))
+		tformat(damDesc(self, DamageType.LIGHTNING, dam), self:getTalentRadius(t), Desc.vs"mm")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/grip.lua b/game/modules/tome/data/talents/psionic/grip.lua
index e48b325dde5193813be7456f1e859c147387d1df..a0cf167cdbb7f61b84330bbf832c75d00908b080 100644
--- a/game/modules/tome/data/talents/psionic/grip.lua
+++ b/game/modules/tome/data/talents/psionic/grip.lua
@@ -53,9 +53,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local dur = t.getDuration(self, t)
-		return ([[Bind the target in crushing bands of telekinetic force, immobilizing it for %d turns. 
+		return ([[Bind the target in crushing bands of telekinetic force, immobilizing it for %d turns %s.
 		The duration will improve with your Mindpower.]]):
-		tformat(dur)
+		tformat(dur, Desc.vs"mp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/kinetic-mastery.lua b/game/modules/tome/data/talents/psionic/kinetic-mastery.lua
index aa0961222a3fafdfd82fb35dfb458b4c5f4110e5..af8c4938552e697b560c5aeaecacfb65efdda7bd 100644
--- a/game/modules/tome/data/talents/psionic/kinetic-mastery.lua
+++ b/game/modules/tome/data/talents/psionic/kinetic-mastery.lua
@@ -45,11 +45,11 @@ newTalent{
 		The cooldowns of Kinetic Shield, Kinetic Leech, Kinetic Aura, Kinetic Strike and Mindlash are reset.
 		Kinetic Aura effects will have their radius increased by 1.
 		Your Kinetic Shield will have 100%% absorption efficiency and will absorb twice the normal amount of damage.
-		Mindlash will also inflict stun.
-		Kinetic Leech will put enemies to sleep.
+		Mindlash will also inflict stun %s.
+		Kinetic Leech will put enemies to sleep %s.
 		Kinetic Strike will hit 2 adjacent enemies in a sweeping attack.
 		The damage bonus and resistance penetration scale with your Mindpower.
-		Only one Transcendent talent may be in effect at a time.]]):tformat(t.getDuration(self, t), t.getPower(self, t), t.getPenetration(self, t))
+		Only one Transcendent talent may be in effect at a time.]]):tformat(t.getDuration(self, t), t.getPower(self, t), t.getPenetration(self, t), Desc.vs"mp", Desc.vs"mm")
 	end,
 }
 
@@ -144,14 +144,14 @@ newTalent{
 		return ([[Build telekinetic power and dump it into an adjacent creature or yourself.
 		This will launch them to a targeted location in radius %d.
 
-		Launched enemies take %0.1f Physical damage and are stunned for %d turns upon landing.
+		Launched enemies take %0.1f Physical damage and are stunned %s for %d turns upon landing.
 		When the target lands, creatures within radius 2 take %0.1f Physical damage and are knocked away from you.
 		This talent ignores %d%% of the knockback resistance of the thrown target, which takes half damage if it resists being thrown.
 
 		When used on yourself, you will launch in a straight line, knocking enemies flying and doing %0.1f Physical damage to each.
 		You can break through %d walls while doing this.
 		The damage and range increases with Mindpower.]]):
-		tformat(range, dam, math.floor(range/2), dam/2, t.getKBResistPen(self, t), dam, math.floor(range/2))
+		tformat(range, dam, Desc.vs"mp", math.floor(range/2), dam/2, t.getKBResistPen(self, t), dam, math.floor(range/2))
 	end,
 }
 
@@ -253,8 +253,8 @@ newTalent{
 	info = function(self, t)
 		local dur = t.getDuration(self, t)
 		local dam = t.getDamage(self, t)
-		return ([[Bind the target mercilessly with constant, bone-shattering pressure, pinning and slowing it by 50%% for %d turns and dealing %0.1f Physical damage each turn.
+		return ([[Bind the target mercilessly with constant, bone-shattering pressure, pinning %s and slowing it by 50%% %s for %d turns and dealing %0.1f Physical damage each turn.
 		The duration and damage improve with Mindpower.]]):
-		tformat(dur, damDesc(self, DamageType.PHYSICAL, dam))
+		tformat(Desc.vs"mp", Desc.vs(), dur, damDesc(self, DamageType.PHYSICAL, dam))
 	end,
 }
diff --git a/game/modules/tome/data/talents/psionic/nightmare.lua b/game/modules/tome/data/talents/psionic/nightmare.lua
index da9d2315f1e618dccd993c1d1c926ba5ffc2339c..6951f40f2e0a09269727bdca673ee1c4ba0cb8fe 100644
--- a/game/modules/tome/data/talents/psionic/nightmare.lua
+++ b/game/modules/tome/data/talents/psionic/nightmare.lua
@@ -80,10 +80,10 @@ newTalent{
 		local power = t.getSleepPower(self, t)
 		local damage = t.getDamage(self, t)
 		local insomnia = t.getInsomniaPower(self, t)
-		return([[Puts targets in a radius %d cone into a nightmarish sleep for %d turns, rendering them unable to act.  Every %d points of damage the target suffers will reduce the effect duration by one turn.
+		return([[Puts targets in a radius %d cone into a nightmarish sleep for %d turns %s, rendering them unable to act.  Every %d points of damage the target suffers will reduce the effect duration by one turn.
 		Each turn, they'll suffer %0.2f darkness damage.  This damage will not reduce the duration of the effect.
 		When Nightmare ends, the target will suffer from Insomnia for a number of turns equal to the amount of time it was asleep (up to ten turns max), granting it %d%% sleep immunity for each turn of the Insomnia effect.
-		The damage threshold and darkness damage will scale with your Mindpower.]]):tformat(radius, duration, power, damDesc(self, DamageType.DARKNESS, (damage)), insomnia)
+		The damage threshold and darkness damage will scale with your Mindpower.]]):tformat(radius, duration, Desc.vs"mm", power, damDesc(self, DamageType.DARKNESS, (damage)), insomnia)
 	end,
 }
 
@@ -182,10 +182,10 @@ newTalent{
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
 		local chance = t.getChance(self, t)
-		return ([[Brings the target's inner demons to the surface.  Each turn, for %d turns, there's a %d%% chance that a demon will surface, requiring the target to make a Mental Save to keep it from manifesting.
+		return ([[Brings the target's inner demons to the surface %s.  Each turn, for %d turns, there's a %d%% chance that a demon will surface, requiring the target to make a Mental Save to keep it from manifesting.
 		If the target is sleeping, the chance to save will be halved, and fear immunity will be ignored.  Otherwise, if the summoning is resisted, the effect will end early.
 		The summon chance will scale with your Mindpower and the demon's life will scale with the target's rank.
-		If a demon manifests the sheer terror will remove all sleep effects from the victim, but not the Inner Demons.]]):tformat(duration, chance)
+		If a demon manifests the sheer terror will remove all sleep effects from the victim, but not the Inner Demons.]]):tformat(Desc.vs"mm", duration, chance)
 	end,
 }
 
@@ -232,10 +232,10 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		local chance = t.getChance(self, t)
-		return ([[Inflicts %0.2f darkness damage each turn for %d turns, and has a %d%% chance to randomly cause blindness, stun, or confusion (lasting 3 turns).
+		return ([[Inflicts %0.2f darkness damage each turn for %d turns %s, and has a %d%% chance to randomly cause blindness, stun, or confusion for 3 turns %s.
 		If the target is sleeping, the chance of avoiding a negative effect will be halved and fear immunity will be ignored.
 		The damage will scale with your Mindpower.]]):
-		tformat(damDesc(self, DamageType.DARKNESS, (damage)), duration, chance)
+		tformat(damDesc(self, DamageType.DARKNESS, (damage)), duration, Desc.vs"mm", chance, Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/projection.lua b/game/modules/tome/data/talents/psionic/projection.lua
index 436ed10a6470ba91b378ac0a4e7ee2c45af4a1a8..a962aa02d0277ec24a103d5b21d4c3df85ccc101 100644
--- a/game/modules/tome/data/talents/psionic/projection.lua
+++ b/game/modules/tome/data/talents/psionic/projection.lua
@@ -251,12 +251,12 @@ newTalent{
 		return ([[Fills the air around you with reactive currents of force.
 		If you have a gem or mindstar in your psionically wielded slot, this will do %0.1f Physical damage to all adjacent enemies, costing %0.1f energy per creature. 
 		If you have a conventional weapon in your psionically wielded slot, this will add %0.1f Physical damage to all your weapon hits, costing %0.1f energy per hit.
-		When deactivated, if you have at least %d energy, a massive spike of kinetic energy is released as a range %d beam, smashing targets for up to %d physical damage and sending them flying.
+		When deactivated, if you have at least %d energy, a massive spike of kinetic energy is released as a range %d beam, smashing targets for up to %d physical damage and sending them flying %s.
 		#{bold}#Activating the aura takes no time but de-activating it does.#{normal}#
 		To turn off an aura without spiking it, deactivate it and target yourself. The damage will improve with your Mindpower.
 		You can only have two of these auras active at once.]]):
 		tformat(damDesc(self, DamageType.PHYSICAL, dam), mast, damDesc(self, DamageType.PHYSICAL, dam), mast, spikecost, t.getSpikedRange(self, t),
-		damDesc(self, DamageType.PHYSICAL, spikedam))
+		damDesc(self, DamageType.PHYSICAL, spikedam), Desc.vs"mp")
 	end,
 }
 
@@ -535,11 +535,11 @@ newTalent{
 		return ([[Fills the air around you with crackling energy.
 		If you have a gem or mindstar in your psionically wielded slot, this will do %0.1f Lightning damage to all adjacent enemies, costing %0.1f energy per creature. 
 		If you have a conventional weapon in your psionically wielded slot, this will add %0.1f Lightning damage to all your weapon hits, costing %0.1f energy per hit.
-		When deactivated, if you have at least %d energy, a massive spike of electrical energy jumps between up to %d nearby targets, doing up to %0.1f Lightning damage to each with a 50%% chance of dazing them.
+		When deactivated, if you have at least %d energy, a massive spike of electrical energy jumps between up to %d nearby targets, doing up to %0.1f Lightning damage to each with a 50%% chance of dazing them %s.
 		#{bold}#Activating the aura takes no time but de-activating it does.#{normal}#
 		To turn off an aura without spiking it, deactivate it and target yourself. The damage will improve with your Mindpower.
 		You can only have two of these auras active at once.]]):
-		tformat(damDesc(self, DamageType.LIGHTNING, dam), mast, damDesc(self, DamageType.LIGHTNING, dam), mast, spikecost, nb, damDesc(self, DamageType.LIGHTNING, spikedam))
+		tformat(damDesc(self, DamageType.LIGHTNING, dam), mast, damDesc(self, DamageType.LIGHTNING, dam), mast, spikecost, nb, damDesc(self, DamageType.LIGHTNING, spikedam), Desc.vs"mp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/psi-fighting.lua b/game/modules/tome/data/talents/psionic/psi-fighting.lua
index 07eb2f3cb97f587e345d29f2b4be2051ad1acb43..1becb7a6c4254712d48fcd29b85cd2024a054e0e 100644
--- a/game/modules/tome/data/talents/psionic/psi-fighting.lua
+++ b/game/modules/tome/data/talents/psionic/psi-fighting.lua
@@ -58,10 +58,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Gather your will, and brutally smash the target with your mainhand weapon and then your telekinetically wielded weapon, doing %d%% weapon damage.
-		If your mainhand weapon hits, you will also stun the target for %d turns.
+		If your mainhand weapon hits, you will also stun the target for %d turns %s.
 		This attack uses 60%% of your Willpower and Cunning instead of Strength and Dexterity to determine weapon damage and accuracy, for both attacks.
 		Any active Aura damage bonusses will extend to the weapons used for this attack.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 0.9, 1.5), t.duration(self,t))
+		tformat(100 * self:combatTalentWeaponDamage(t, 0.9, 1.5), t.duration(self,t), Desc.vs"mp")
 	end,
 }
 
@@ -129,10 +129,10 @@ newTalent{
 	info = function(self, t)
 		return ([[Assume a defensive mental state.
 		For one turn, you will fully block the next melee attack used against you with your telekinetically-wielded weapon and then strike the attacker with it for %d%% weapon damage.
-		At talent level 3 you will also disarm the attacker for 3 turns.
+		At talent level 3 you will also disarm the attacker for 3 turns %s.
 		At talent level 5 you will be able to reflexively block up to one attack per turn with a %d%% chance, based on your cunning. Each trigger requires and uses 10 Psi.
 		This requires a telekinetically-wielded weapon.]]):
-		tformat(100 * t.getWeaponDamage(self, t), t.getChance(self, t))
+		tformat(100 * t.getWeaponDamage(self, t), Desc.vs"mp", t.getChance(self, t))
 	end,
 }
 
@@ -193,9 +193,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Focus your will into a powerful thrust of your telekinetically-wielded weapon to impale your target and then viciously rip it free.
-		This deals %d%% weapon damage and then causes the victim to bleed for %0.1f Physical damage over four turns.
+		This deals %d%% weapon damage and then causes the victim to bleed for %0.1f Physical damage over four turns %s.
 		At level 3 the thrust is so powerful that it has %d%% chance to shatter a random temporary magical or psionic damage absorbing shield if one exists.
 		The bleeding damage increases with your Mindpower.]]):
-		tformat(100 * t.getWeaponDamage(self, t), damDesc(self, DamageType.PHYSICAL, t.getDamage(self,t)), t.getShatter(self, t))
+		tformat(100 * t.getWeaponDamage(self, t), damDesc(self, DamageType.PHYSICAL, t.getDamage(self,t)), Desc.vs"mp", t.getShatter(self, t))
 	end,
 }
diff --git a/game/modules/tome/data/talents/psionic/psychic-assault.lua b/game/modules/tome/data/talents/psionic/psychic-assault.lua
index fbdf25f6420e662708c1868a45aac0020b3d9ff7..a1e29b233c3e40d8a60899d9b7c4cfb2e41afe87 100644
--- a/game/modules/tome/data/talents/psionic/psychic-assault.lua
+++ b/game/modules/tome/data/talents/psionic/psychic-assault.lua
@@ -103,9 +103,9 @@ newTalent{
 		local cunning_damage = t.getPower(self, t)/2
 		local power = t.getConfuse(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Inflicts %0.2f mind damage and cripples the target's higher mental functions, reducing cunning by %d and confusing (%d%% power) the target for %d turns.
+		return ([[Inflicts %0.2f mind damage and cripples the target's higher mental functions, reducing cunning by %d and confusing (%d%% power) the target for %d turns. %s
 		The damage, cunning penalty, and confusion power will scale with your Mindpower.]]):
-		tformat(damDesc(self, DamageType.MIND, (damage)), cunning_damage, power, duration)
+		tformat(damDesc(self, DamageType.MIND, (damage)), cunning_damage, power, duration, Desc.vs"mm")
 	end,
 }
 
@@ -133,8 +133,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Sends out a blast of telepathic static in a %d radius, inflicting %0.2f mind damage.  This attack can brainlock affected targets.
-		The damage will increase with your Mindpower.]]):tformat(radius, damDesc(self, DamageType.MIND, damage))
+		return ([[Sends out a blast of telepathic static in a %d radius, inflicting %0.2f mind damage.  This attack can brainlock affected targets %s.
+		The damage will increase with your Mindpower.]]):tformat(radius, damDesc(self, DamageType.MIND, damage), Desc.vs"mm")
 	end,
 }
 
@@ -174,9 +174,9 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local power = t.getDamage(self, t) / 10
-		return ([[Cripples the target's mind, inflicting %0.2f mind damage and reducing its Mental Save by %d for 4 turns.  This attack always hits, and the mental save reduction stacks.
+		return ([[Cripples the target's mind, inflicting %0.2f mind damage and reducing its Mental Save by %d for 4 turns %s.  The mental save reduction stacks.
 		Against brainlocked targets, the damage and Mental Save reduction will be doubled.
 		The damage and save reduction will scale with your Mindpower.]]):
-		tformat(damDesc(self, DamageType.MIND, (damage)), power)
+		tformat(damDesc(self, DamageType.MIND, (damage)), power, Desc.vs())
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/psionic/slumber.lua b/game/modules/tome/data/talents/psionic/slumber.lua
index afdf8596dc48b47074a8f48839a83a3fda66204f..ab01e0eadc73b4cf1319a2b450f9bd58de23bc38 100644
--- a/game/modules/tome/data/talents/psionic/slumber.lua
+++ b/game/modules/tome/data/talents/psionic/slumber.lua
@@ -73,9 +73,9 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local power = t.getSleepPower(self, t)
 		local insomnia = t.getInsomniaPower(self, t)
-		return([[Puts the target into a deep sleep for %d turns, rendering it unable to act.  Every %d points of damage the target suffers will reduce the effect duration by one turn.
+		return([[Puts the target into a deep sleep for %d turns %s, rendering it unable to act.  Every %d points of damage the target suffers will reduce the effect duration by one turn.
 		When Slumber ends, the target will suffer from Insomnia for a number of turns equal to the amount of time it was asleep (up to ten turns max), granting it %d%% sleep immunity for each turn of the Insomnia effect.
-		The damage threshold will scale with your Mindpower.]]):tformat(duration, power, insomnia)
+		The damage threshold will scale with your Mindpower.]]):tformat(duration, Desc.vs"mm", power, insomnia)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/thermal-mastery.lua b/game/modules/tome/data/talents/psionic/thermal-mastery.lua
index fb674326de446a06397ac1a51a94c60d93171e46..3e6f439d00ea02a127b73d7c507fa1a20e41f8b7 100644
--- a/game/modules/tome/data/talents/psionic/thermal-mastery.lua
+++ b/game/modules/tome/data/talents/psionic/thermal-mastery.lua
@@ -46,11 +46,11 @@ newTalent{
 		The cooldowns of Thermal Shield, Thermal Leech, Thermal Aura, Thermal Strike and Pyrokinesis are reset.
 		Thermal Aura effects will have their radius increased by 1.
 		Your Thermal Shield will have 100%% absorption efficiency and will absorb twice the normal amount of damage.
-		Pyrokinesis will inflict Flameshock.
-		Thermal Leech will reduce enemy damage by %d%%.
+		Pyrokinesis will inflict Flameshock %s.
+		Thermal Leech will reduce enemy damage by %d%% %s.
 		Thermal Strike will have its secondary cold/freeze explode in radius 1.
 		The damage bonus and resistance penetration scale with your Mindpower.
-		Only one Transcendent talent may be in effect at a time.]]):tformat(t.getDuration(self, t), t.getPower(self, t), t.getPenetration(self, t), t.getDamagePenalty(self, t))
+		Only one Transcendent talent may be in effect at a time.]]):tformat(t.getDuration(self, t), t.getPower(self, t), t.getPenetration(self, t), Desc.vs"mp", t.getDamagePenalty(self, t), Desc.vs"mp")
 	end,
 }
 
@@ -89,9 +89,9 @@ newTalent{
 	info = function(self, t)
 		local dam = t.getDamage(self, t)
 		return ([[Quickly drain the heat from your target's brain, dealing %0.1f Cold damage.
-		Affected creatures will also be brainlocked for 4 turns, putting a random talent on cooldown, and freezing cooldowns.
-		The damage and chance to brainlock increase with your Mindpower.]]):
-		tformat(damDesc(self, DamageType.COLD, dam))
+		Affected creatures will also be brainlocked for 4 turns %s, putting a random talent on cooldown, and freezing cooldowns.
+		The damage increases with your Mindpower.]]):
+		tformat(damDesc(self, DamageType.COLD, dam), Desc.vs"mm")
 	end,
 }
 
@@ -143,10 +143,10 @@ newTalent{
 		local rad = self:getTalentRadius(t)
 		local dam = t.getDamage(self, t)
 		return ([[Within radius %d, transfer heat from a group of enemies bodies to their equipment, freezing them to the floor while the excess heat disables their weapons and armor.
-		Those afflicted will be dealt %0.1f Cold and %0.1f Fire damage, and be pinned (Frozen Feet) and disarmed for %d turns.
-		Targets suffering both types of damage will also have have their Armour and saves reduced by %d.
+		Those afflicted will be dealt %0.1f Cold and %0.1f Fire damage, and be pinned (Frozen Feet) and disarmed for %d turns %s.
+		Targets suffering both types of damage will also have have their Armour and saves reduced by %d %s.
 		The chance to apply the effects and the duration increase with your Mindpower.]]):
-		tformat(rad, damDesc(self, DamageType.COLD, dam), damDesc(self, DamageType.FIRE, dam), dur, t.getArmor(self, t))
+		tformat(rad, damDesc(self, DamageType.COLD, dam), damDesc(self, DamageType.FIRE, dam), dur, Desc.vs"mp", t.getArmor(self, t), Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/psionic/voracity.lua b/game/modules/tome/data/talents/psionic/voracity.lua
index a6bca6fff15dc260843534a84b3171f6825ff547..0705a33b25e9daa34ee7d112283c8466beb5c1e0 100644
--- a/game/modules/tome/data/talents/psionic/voracity.lua
+++ b/game/modules/tome/data/talents/psionic/voracity.lua
@@ -77,10 +77,10 @@ newTalent{
 	info = function(self, t)
 		local range = self:getTalentRadius(t)
 		return ([[You draw kinetic energy from your surroundings to replenish your Psi.
-		This will slow all targets within radius %d by %d%% (max %d%%) for four turns, draining %0.1f (max %0.1f) stamina from each.
+		This will slow %s all targets within radius %d by %d%% (max %d%%) for four turns, draining %0.1f (max %0.1f) stamina from each.
 		You replenish %d (max %d) Psi from the first target, with each additional target restoring 20%% less than the one before it.
 		The strength of these effects increases as your Psi depletes and with your Mindpower.]])
-		:tformat(range, t.getSlow(self, t)*100, t.getSlow(self, t, 0)*100, t.getDam(self, t), t.getDam(self, t, 0), t.getLeech(self, t), t.getLeech(self, t, 0))
+		:tformat(Desc.vs"mp", range, t.getSlow(self, t)*100, t.getSlow(self, t, 0)*100, t.getDam(self, t), t.getDam(self, t, 0), t.getLeech(self, t), t.getLeech(self, t, 0))
 	end,
 }
 
@@ -137,10 +137,10 @@ newTalent{
 	info = function(self, t)
 		local range = self:getTalentRadius(t)
 		return ([[You draw thermal energy from your surroundings to replenish your Psi.
-		This will freeze all targets within radius %d for %d (max %d) turns, and deal %0.1f (max %0.1f) Cold damage.
+		This will freeze %s all targets within radius %d for %d (max %d) turns, and deal %0.1f (max %0.1f) Cold damage.
 		You replenish %d (max %d) Psi from the first target, with each additional target restoring 20%% less than the one before it.
 		The damage and the strength of these effects increases as your Psi depletes and with your Mindpower.]])
-		:tformat(range, t.getDur(self, t), t.getDur(self, t, 0), damDesc(self, DamageType.COLD, t.getDam(self, t)), damDesc(self, DamageType.COLD, t.getDam(self, t, 0)), t.getLeech(self, t), t.getLeech(self, t, 0))
+		:tformat(Desc.vs"mp", range, t.getDur(self, t), t.getDur(self, t, 0), damDesc(self, DamageType.COLD, t.getDam(self, t)), damDesc(self, DamageType.COLD, t.getDam(self, t, 0)), t.getLeech(self, t), t.getLeech(self, t, 0))
 	end,
 }
 
@@ -206,10 +206,10 @@ newTalent{
 	info = function(self, t) -- could this use another effect?
 		local range = self:getTalentRadius(t)
 		return ([[You draw electical potential energy from your surroundings to replenish your Psi.
-		This deals %0.1f (max %0.1f) Lightning damage to all targets around you within radius %d, and has a %d%% (max %d%%) chance to daze them for 3 turns.
+		This deals %0.1f (max %0.1f) Lightning damage to all targets around you within radius %d, and has a %d%% (max %d%%) chance to daze %s them for 3 turns.
 		You replenish %d (max %d) Psi from the first target, with each additional target restoring 20%% less than the one before it.
 		The strength of these effects increases as your Psi depletes and with your Mindpower.]])
-		:tformat(t.getDam(self, t), t.getDam(self, t, 0), range, t.getDaze(self, t), t.getDaze(self, t, 0), t.getLeech(self, t), t.getLeech(self, t, 0))
+		:tformat(t.getDam(self, t), t.getDam(self, t, 0), range, t.getDaze(self, t), t.getDaze(self, t, 0), Desc.vs"mp", t.getLeech(self, t), t.getLeech(self, t, 0))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/acid-alchemy.lua b/game/modules/tome/data/talents/spells/acid-alchemy.lua
index c2d23e603e51b6bd7f2c9c833fddcd7a4aae0410..bcbec486ee86b0bd75993974f0ded58ae82644ac 100644
--- a/game/modules/tome/data/talents/spells/acid-alchemy.lua
+++ b/game/modules/tome/data/talents/spells/acid-alchemy.lua
@@ -115,9 +115,9 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
 		return ([[A radius %d pool of acid spawns at the target location, doing %0.1f Acid damage each turn for %d turns.
-		All creatures caught in the mire will also suffer a %d%% slowness effect.
+		All creatures caught in the mire will also suffer a %d%% slowness effect %s.
 		The damage will increase with your Spellpower.]]):
-		tformat(radius, damDesc(self, DamageType.ACID, damage), duration, slow)
+		tformat(radius, damDesc(self, DamageType.ACID, damage), duration, slow, Desc.vs"sp")
 	end,
 }
 
@@ -180,7 +180,7 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		return ([[Acid erupts all around your target, dealing %0.1f acid damage.
-		The acid attack is extremely distracting, and may remove up to %d physical or mental temporary effects or mental sustains (depending on the Spell Save of the target).
-		The damage and chance to remove effects will increase with your Spellpower.]]):tformat(damDesc(self, DamageType.ACID, damage), t.getRemoveCount(self, t))
+		The acid attack is extremely distracting, and may remove up to %d physical or mental temporary effects or mental sustains %s.
+		The damage increases with your Spellpower.]]):tformat(damDesc(self, DamageType.ACID, damage), t.getRemoveCount(self, t), Desc.vs"ss")
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/aether.lua b/game/modules/tome/data/talents/spells/aether.lua
index 7e79206bb12ece897ed45919a5e4931249966600..24990f008eaf2899f8ea276ba1fd45f2d2ceaaf4 100644
--- a/game/modules/tome/data/talents/spells/aether.lua
+++ b/game/modules/tome/data/talents/spells/aether.lua
@@ -136,11 +136,11 @@ newTalent{
 	end,
 	info = function(self, t)
 		local dam = t.getDamage(self, t)
-		return ([[You focus the aether into a spinning beam of arcane energies, doing %0.2f arcane damage and having 25%% chance to silence the creatures it pierces.
+		return ([[You focus the aether into a spinning beam of arcane energies, doing %0.2f arcane damage and having 25%% chance to silence the creatures it pierces %s.
 		The beam will also damage its epicenter each turn for 10%% of the damage (but it will not silence).
 		The beam spins with incredible speed (1600%%) and can only hit the same target up to 3 times inbetween their turns.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.ARCANE, dam))
+		tformat(damDesc(self, DamageType.ARCANE, dam), Desc.vs"sm")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/age-of-dusk.lua b/game/modules/tome/data/talents/spells/age-of-dusk.lua
index 2357c8ace2cd1891b54771965755a885e2697233..a6ab8196a12aebf608be1f4bcd327d414b3b7334 100644
--- a/game/modules/tome/data/talents/spells/age-of-dusk.lua
+++ b/game/modules/tome/data/talents/spells/age-of-dusk.lua
@@ -46,10 +46,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You unleash the glorious vision of the past when the continent was filled with death and plagues.
-		All foes in range %d catch a dire plague for 5 turns, dealing %0.2f darkness damage each turn.
+		All foes in range %d catch a dire plague for 5 turns %s, dealing %0.2f darkness damage each turn.
 		The Dire Plague is considered a disease but is not prevented by disease immunity.
 		Every turn there is a %d%% chance of a piece of the soul to be ripped away, increasing your souls by 1.
-		]]):tformat(self:getTalentRadius(t), damDesc(self, DamageType.DARKNESS, t:_getDamage(self)), t:_getChance(self))
+		]]):tformat(self:getTalentRadius(t), Desc.vs"ss", damDesc(self, DamageType.DARKNESS, t:_getDamage(self)), t:_getChance(self))
 	end,
 }
 
@@ -92,9 +92,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You call upon an eerie night to aid you for %d turns.
-		Each turn you automatically fire a beam of darkness towards a random foe (prioritizing the ones further away) that deals %0.2f darkness damage and has 25%% chance to blind any foes caught inside for 4 turns.
+		Each turn you automatically fire a beam of darkness towards a random foe (prioritizing the ones further away) that deals %0.2f darkness damage and has 25%% chance to blind any foes caught inside for 4 turns %s.
 		The damage will increase with your Spellpower.]]):
-		tformat(t:_getDur(self), damDesc(self, DamageType.DARKNESS, t:_getDamage(self)))
+		tformat(t:_getDur(self), damDesc(self, DamageType.DARKNESS, t:_getDamage(self)), Desc.vs"sp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/air.lua b/game/modules/tome/data/talents/spells/air.lua
index 81aea0396f3209bfa1a2f6bd51517ff2d4335599..08bb9c2d0f6975b58cfcf0766e033045b11c21ef 100644
--- a/game/modules/tome/data/talents/spells/air.lua
+++ b/game/modules/tome/data/talents/spells/air.lua
@@ -41,7 +41,7 @@ newTalent{
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		local dam = thaumaturgyBeamDamage(self, self:spellCrit(t.getDamage(self, t)))
-		self:project(tg, x, y, DamageType.LIGHTNING_DAZE, {dam=rng.avg(dam / 3, dam, 3), daze=self:attr("lightning_daze_tempest") or 0})
+		self:project(tg, x, y, DamageType.LIGHTNING_DAZE, {dam=rng.avg(dam / 3, dam, 3), daze=self:attr("lightning_daze_tempest") or 0, power_check=self:combatSpellpower()})
 		local _ _, x, y = self:canProject(tg, x, y)
 
 		if thaumaturgyCheck(self) then
@@ -123,7 +123,7 @@ newTalent{
 			local tgr = {type="beam", range=self:getTalentRange(t), selffire=false, talent=t, x=sx, y=sy}
 			print("[Chain lightning] jumping from", sx, sy, "to", actor.x, actor.y)
 			local dam = self:spellCrit(t.getDamage(self, t))
-			self:project(tgr, actor.x, actor.y, DamageType.LIGHTNING_DAZE, {dam=rng.avg(rng.avg(dam / 3, dam, 3), dam, 5), daze=self:attr("lightning_daze_tempest") or 0})
+			self:project(tgr, actor.x, actor.y, DamageType.LIGHTNING_DAZE, {dam=rng.avg(rng.avg(dam / 3, dam, 3), dam, 5), daze=self:attr("lightning_daze_tempest") or 0, power_check=self:combatSpellpower()})
 			if core.shader.active() then game.level.map:particleEmitter(sx, sy, math.max(math.abs(actor.x-sx), math.abs(actor.y-sy)), "lightning_beam", {tx=actor.x-sx, ty=actor.y-sy}, {type="lightning"})
 			else game.level.map:particleEmitter(sx, sy, math.max(math.abs(actor.x-sx), math.abs(actor.y-sy)), "lightning_beam", {tx=actor.x-sx, ty=actor.y-sy})
 			end
@@ -230,7 +230,7 @@ newTalent{
 			local a, id = rng.table(tgts)
 			table.remove(tgts, id)
 
-			self:project(tg, a.x, a.y, DamageType.LIGHTNING_DAZE, {dam=rng.avg(1, self:spellCrit(t.getDamage(self, t)), 3), daze=(self:attr("lightning_daze_tempest") or 0) / 2})
+			self:project(tg, a.x, a.y, DamageType.LIGHTNING_DAZE, {dam=rng.avg(1, self:spellCrit(t.getDamage(self, t)), 3), daze=(self:attr("lightning_daze_tempest") or 0) / 2, power_check=self:combatSpellpower()})
 			if core.shader.active() then game.level.map:particleEmitter(a.x, a.y, tg.radius, "ball_lightning_beam", {radius=tg.radius, tx=x, ty=y}, {type="lightning"})
 			else game.level.map:particleEmitter(a.x, a.y, tg.radius, "ball_lightning_beam", {radius=tg.radius, tx=x, ty=y}) end
 			game:playSoundNear(self, "talents/lightning")
diff --git a/game/modules/tome/data/talents/spells/conveyance.lua b/game/modules/tome/data/talents/spells/conveyance.lua
index 430fbefe49c968c97d21eb15d6dc9c21e9ebb30e..5d4552e34d159cd6c8ee823bb6b2ccb041e514a6 100644
--- a/game/modules/tome/data/talents/spells/conveyance.lua
+++ b/game/modules/tome/data/talents/spells/conveyance.lua
@@ -160,7 +160,7 @@ newTalent{
 		local radius = t.getRadius(self, t)
 		local range = t.getRange(self, t)
 		return ([[Teleports you randomly within a small range of up to %d grids.
-		At level 4, it allows you to specify which creature to teleport.
+		At level 4, it allows you to specify which creature to teleport. You need to bypass spell save with your spellpower to teleport hostile creatures.
 		At level 5, it allows you to choose the target area (radius %d).
 		If the target area is not in line of sight, there is a chance the spell will partially fail and teleport the target randomly.
 		The range will increase with your Spellpower.]]):tformat(range, radius)
@@ -275,7 +275,7 @@ newTalent{
 		local range = t.getRange(self, t)
 		local radius = t.getRadius(self, t)
 		return ([[Teleports you randomly within a large range (%d).
-		At level 4, it allows you to specify which creature to teleport.
+		At level 4, it allows you to specify which creature to teleport. You need to bypass spell save with your spellpower to teleport hostile creatures.
 		At level 5, it allows you to choose the target area (radius %d).
 		If the target area is not in line of sight, there is a chance the spell will partially fail and teleport the target randomly.
 		Random teleports have a minimum range of %d.
diff --git a/game/modules/tome/data/talents/spells/death.lua b/game/modules/tome/data/talents/spells/death.lua
index 67dfa5a40dcbb5c20deb2b7ec765ddd3c3a8855a..40f71b7be6cc7192983a9baa8ffa7d3435d9e90c 100644
--- a/game/modules/tome/data/talents/spells/death.lua
+++ b/game/modules/tome/data/talents/spells/death.lua
@@ -64,7 +64,7 @@ newTalent{
 	info = function(self, t)
 		local dam = damDesc(self, DamageType.FROSTDUSK, t:_getDamage(self))
 		return ([[Press your advantage when your foes are starting to crumble.
-		For every detrimental effect on the target you deals %0.2f frostdusk damage (with diminishing returns) and reduce its global speed by 25%% for one turn per effect (up to a maximum of %d).
+		For every detrimental effect on the target you deals %0.2f frostdusk damage (with diminishing returns) and reduce its global speed by 25%% for one turn per effect (up to a maximum of %d) %s.
 		The diminishing returns on damage bonus works this way:
 		- 2 effects: %0.2f
 		- 5 effects: %0.2f
@@ -72,7 +72,7 @@ newTalent{
 		- 15 effects: %0.2f
 		And so on...
 		Damage increases with your Spellpower.
-		]]):tformat(dam, t:_getMax(self), dam*t.incFormula(2), dam*t.incFormula(5), dam*t.incFormula(10), dam*t.incFormula(15))
+		]]):tformat(dam, t:_getMax(self), Desc.vs"ss", dam*t.incFormula(2), dam*t.incFormula(5), dam*t.incFormula(10), dam*t.incFormula(15))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/earth.lua b/game/modules/tome/data/talents/spells/earth.lua
index 2e17355a247417d3fa2a923f958de78212b0e12a..d2be7b1c499bdcf332264e43078cfed7a430a097 100644
--- a/game/modules/tome/data/talents/spells/earth.lua
+++ b/game/modules/tome/data/talents/spells/earth.lua
@@ -156,10 +156,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		local radius = self:getTalentRadius(t)
-		return ([[Conjures a mudslide, dealing %0.2f physical damage in a radius of %d. Any creatures caught inside will be knocked back 8 spaces.
+		return ([[Conjures a mudslide, dealing %0.2f physical damage in a radius of %d. Any creatures caught inside will be knocked back 8 spaces %s.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.PHYSICAL, damage), self:getTalentRadius(t))
+		tformat(damDesc(self, DamageType.PHYSICAL, damage), self:getTalentRadius(t), Desc.vs"sp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/eldritch-shield.lua b/game/modules/tome/data/talents/spells/eldritch-shield.lua
index 7c1e87a1507b36597166bd52b1891a1c5f2494ce..769c107533a299ba320ddc58635f39c976f2ca53 100644
--- a/game/modules/tome/data/talents/spells/eldritch-shield.lua
+++ b/game/modules/tome/data/talents/spells/eldritch-shield.lua
@@ -56,10 +56,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Channel eldritch forces into a melee attack, hitting the target with your weapon and shield for %d%% arcane damage.
-		If either attack hits, the target will be stunned for %d turns and you automatically Block.
-		The chance for the attack to stun increases with your Physical Power, but it is considered a magical attack and thus is resisted with spell save, rather than physical save.
+		If either attack hits, the target will be stunned for %d turns %s and you automatically Block.
 		Damage increases with Spellpower.]])
-		:tformat(100 * self:combatTalentWeaponDamage(t, 0.6, (100 + self:combatTalentSpellDamage(t, 50, 300)) / 100), t.getDuration(self, t))
+		:tformat(100 * self:combatTalentWeaponDamage(t, 0.6, (100 + self:combatTalentSpellDamage(t, 50, 300)) / 100), t.getDuration(self, t), Desc.vs"ps")
 	end,
 }
 
@@ -163,9 +162,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Channel eldritch forces into a ferocious melee attack, hitting the target three times with your shields doing %d%% Nature damage.
-		If any of the attacks hit, the target will be dazed for %d turns and your Block cooldown is reset.
-		The chance for the attack to daze increases with you Physical Power, but it is considered a magical attack and thus is resisted with spell save, rather than physical save.]])
-		:tformat(100 * self:combatTalentWeaponDamage(t, 0.6, 1.6), t.getDuration(self, t))
+		If any of the attacks hit, the target will be dazed for %d turns %s and your Block cooldown is reset.]])
+		:tformat(100 * self:combatTalentWeaponDamage(t, 0.6, 1.6), t.getDuration(self, t), Desc.vs"ps")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/eldritch-stone.lua b/game/modules/tome/data/talents/spells/eldritch-stone.lua
index f106be493535843d89d73dc2ac59794479d0a64b..cc7b1f9377b72fe31409612d969ea7bd1f37fb19 100644
--- a/game/modules/tome/data/talents/spells/eldritch-stone.lua
+++ b/game/modules/tome/data/talents/spells/eldritch-stone.lua
@@ -77,18 +77,18 @@ newTalent{
 	info = function(self, t)
 		local xs = ""
 		if self:knowTalent(self.T_POISONED_SPIKES) then
-			xs = ("poisoned for %0.1f Nature damage over 6 turns (%d%% healing reduction)"):tformat(damDesc(self, DamageType.NATURE, self:callTalent(self.T_POISONED_SPIKES, "getDamage")), self:callTalent(self.T_POISONED_SPIKES, "getHeal"))
+			xs = ("poisoned for %0.1f Nature damage over 6 turns (%d%% healing reduction) %s"):tformat(damDesc(self, DamageType.NATURE, self:callTalent(self.T_POISONED_SPIKES, "getDamage")), self:callTalent(self.T_POISONED_SPIKES, "getHeal"), Desc.vs(Desc.max("pp", "sp"), "ps"))
 		end
 		if self:knowTalent(self.T_ELDRITCH_SPIKES) then
-			xs = xs..(", blasted for %0.1f Arcane damage (and silenced for %d turns),"):tformat(damDesc(self, DamageType.ARCANE, self:callTalent(self.T_ELDRITCH_SPIKES, "getDamage")), self:callTalent(self.T_ELDRITCH_SPIKES, "getSilence"))
+			xs = xs..(", blasted for %0.1f Arcane damage (and silenced for %d turns %s),"):tformat(damDesc(self, DamageType.ARCANE, self:callTalent(self.T_ELDRITCH_SPIKES, "getDamage")), self:callTalent(self.T_ELDRITCH_SPIKES, "getSilence"), Desc.vs(Desc.max("pp", "sp"), "ms"))
 		end
 		if self:knowTalent(self.T_IMPALING_SPIKES) then
-			xs = xs..(" impaled for %0.1f Physical damage (and disarmed for %d turns),"):tformat(damDesc(self, DamageType.PHYSICAL, self:callTalent(self.T_IMPALING_SPIKES, "getDamage")), self:callTalent(self.T_IMPALING_SPIKES, "getDisarm"))
+			xs = xs..(" impaled for %0.1f Physical damage (and disarmed for %d turns %s),"):tformat(damDesc(self, DamageType.PHYSICAL, self:callTalent(self.T_IMPALING_SPIKES, "getDamage")), self:callTalent(self.T_IMPALING_SPIKES, "getDisarm"), Desc.vs(Desc.max("pp", "sp"), "ps"))
 		end
 		return ([[Stony spikes erupt from the ground in a radius %d cone.
-		Creatures caught in the area will be %scut for %0.1f Physical damage dealt over 6 turns.
-		The damage increases with your Spellpower, and the chance to apply the detrimental effect(s) improves with Spellpower or Physical Power, whichever is greater.]])
-		:tformat(self:getTalentRadius(t), xs ~="" and xs.._t" and " or "", damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
+		Creatures caught in the area will be %scut for %0.1f Physical damage dealt over 6 turns %s.
+		The damage increases with your Spellpower.]])
+		:tformat(self:getTalentRadius(t), xs ~="" and xs.._t" and " or "", damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)), Desc.vs(Desc.max("pp", "sp"), "ps"))
 	end,
 }
 
@@ -104,9 +104,9 @@ newTalent{
 	end, -- fix
 	info = function(self, t)
 		local dam = t.getDamage(self, t)
-		return ([[Coats your stone spikes with insidious poison, dealing %0.1f total nature damage over 6 turns while reducing all healing by %d%%.
-		The damage increases with Spellpower and the chance to poison and healing reduction increases with either Spellpower or Physical Power, whichever is greater.]]):
-		tformat(damDesc(self, DamageType.NATURE, t.getDamage(self, t)), t.getHeal(self, t))
+		return ([[Coats your stone spikes with insidious poison, dealing %0.1f total nature damage over 6 turns while reducing all healing by %d%% %s.
+		The damage increases with Spellpower.]]):
+		tformat(damDesc(self, DamageType.NATURE, t.getDamage(self, t)), t.getHeal(self, t), Desc.vs(Desc.max("pp", "sp"), "ps"))
 	end,
 }
 
@@ -120,9 +120,9 @@ newTalent{
 	getSilence = function(self, t) return math.ceil(self:combatTalentLimit(t, 12, 4, 8.5)) end,
 	info = function(self, t)
 		local dam = t.getDamage(self, t)
-		return ([[Imbues your stone spikes with arcane forces, dealing %0.1f Arcane damage and silencing each target hit for %d turns.
-		The damage increases with Spellpower and the chance to silence increases with either Spellpower or Physical Power, whichever is greater.]]):
-		tformat(damDesc(self, DamageType.ARCANE, t.getDamage(self, t)), t.getSilence(self, t))
+		return ([[Imbues your stone spikes with arcane forces, dealing %0.1f Arcane damage and silencing each target hit for %d turns %s.
+		The damage increases with Spellpower.]]):
+		tformat(damDesc(self, DamageType.ARCANE, t.getDamage(self, t)), t.getSilence(self, t), Desc.vs(Desc.max("pp", "sp"), "ms"))
 	end,
 }
 
@@ -135,9 +135,9 @@ newTalent{
 	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 200) end,
 	getDisarm = function(self, t) return math.ceil(self:combatTalentLimit(t, 12, 4, 8.5)) end,
 	info = function(self, t)
-		return ([[Your stone spikes grow in length, instantly dealing %0.1f Physical damage and disarming targets hit for %d turns.
-		The damage increases with Spellpower and the chance to disarm increases with either Spellpower or Physical Power, whichever is greater.]]):
-		tformat(damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)), t.getDisarm(self, t))
+		return ([[Your stone spikes grow in length, instantly dealing %0.1f Physical damage and disarming targets hit for %d turns %s.
+		The damage increases with Spellpower.]]):
+		tformat(damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)), t.getDisarm(self, t), Desc.vs(Desc.max("pp", "sp"), "ps"))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/energy-alchemy.lua b/game/modules/tome/data/talents/spells/energy-alchemy.lua
index e9fa2c03bbb9f7c4c9a61a1868177f97ae1a01c3..53675e2588626ba0d8289e8dcf536612726b7ee8 100644
--- a/game/modules/tome/data/talents/spells/energy-alchemy.lua
+++ b/game/modules/tome/data/talents/spells/energy-alchemy.lua
@@ -121,7 +121,6 @@ newTalent{
  			end
  			if actor:canBe("knockback") then
   				actor:knockback(self.x, self.y, 3)
-  				actor:crossTierEffect(actor.EFF_OFFBALANCE, self:combatSpellpower())
   			end
 		end, dam)
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "gravity_breath", {radius=tg.radius, tx=x-self.x, ty=y-self.y, allow=core.shader.allow("distort")})
@@ -131,8 +130,8 @@ newTalent{
 	info = function(self, t)
 		local radius = self:getTalentRadius(t)
 		return ([[By crushing an alchemist gem you generate a thunderclap in a cone of radius %d dealing %0.2f physical damage and %0.2f lightning damage.
-		All creatures caught inside are knocked back and disarmed for %d turns.
-		The duration and damage will increase with your Spellpower.]]):tformat(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)), damDesc(self, DamageType.LIGHTNING, t.getDamage(self, t)), t.getDuration(self, t))
+		All creatures caught inside are knocked back and disarmed %s for %d turns.
+		The duration and damage will increase with your Spellpower.]]):tformat(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)), damDesc(self, DamageType.LIGHTNING, t.getDamage(self, t)), Desc.vs"sp", t.getDuration(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/enhancement.lua b/game/modules/tome/data/talents/spells/enhancement.lua
index 25c3886643faf8af43717754c14efe207674d1aa..09d490c4de643a05eb4c98b23c4b72e051165f4f 100644
--- a/game/modules/tome/data/talents/spells/enhancement.lua
+++ b/game/modules/tome/data/talents/spells/enhancement.lua
@@ -145,10 +145,10 @@ newTalent{
 	info = function(self, t)
 		local icedamage = t.getIceDamage(self, t)
 		local icedamageinc = t.getIceDamageIncrease(self, t)
-		return ([[Engulfs your hands (and weapons) in a sheath of lightning, dealing %d lightning damage with a chance to daze (25%%) per melee attack and increasing all lightning damage dealt by %d%%.
+		return ([[Engulfs your hands (and weapons) in a sheath of lightning, dealing %d lightning damage with 25%% chance to daze %s per melee attack and increasing all lightning damage dealt by %d%%.
 		Each hit will also regenerate %0.2f mana.
 		The effects will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.LIGHTNING, icedamage), icedamageinc, self:getTalentLevel(t) / 3)
+		tformat(damDesc(self, DamageType.LIGHTNING, icedamage), Desc.vs(Desc.max("pp", "sp", "mp"), "ps"), icedamageinc, self:getTalentLevel(t) / 3)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/eradication.lua b/game/modules/tome/data/talents/spells/eradication.lua
index 4386a27fb6b26d9f7fa2fea178fc4372e2092d1b..e6054a879b802e7f726746604fe68f191e8b6f66 100644
--- a/game/modules/tome/data/talents/spells/eradication.lua
+++ b/game/modules/tome/data/talents/spells/eradication.lua
@@ -62,10 +62,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Spawn a boneyard of radius %d around you that lasts for 8 turns.
-		Any foes inside gain the brittle bones effect, reducing their physical resistance by %d%% and making all cooldowns %d%% longer.
+		Any foes inside gain the brittle bones effect, reducing their physical resistance by %d%% and making all cooldowns %d%% longer %s.
 		When one of your minions stands in the boneyard they gain %d more physical and spell power.
 		At level 5 when a minion dies inside the boneyard it has a %d%% chance to resurrect instantly. This effect may only happen once per minion.
-		]]):tformat(self:getTalentRadius(t), t:_getResist(self), t:_getCooldown(self), t:_getPower(self), t:_getResurrect(self))
+		]]):tformat(self:getTalentRadius(t), t:_getResist(self), t:_getCooldown(self), Desc.vs"ss",  t:_getPower(self), t:_getResurrect(self))
 	end,
 }
 
@@ -134,9 +134,9 @@ newTalent{
 		return true
 	end,	
 	info = function(self, t)
-		return ([[Teleport all foes in radius %d to your boneyard, as close to its center as possible.
+		return ([[Teleport all foes in radius %d to your boneyard, as close to its center as possible %s.
 		Up to %d ghouls or skeletons are created around them by the boneyard, without any additional soul cost, but they only last 5 turns.
-		]]):tformat(self:getTalentRadius(t), t:_getNb(self))
+		]]):tformat(self:getTalentRadius(t), Desc.vs"ss", t:_getNb(self))
 	end,
 }
 
@@ -168,10 +168,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Your target's doom draws near. Its healing factor is reduced by 80%%, and it will take %d%% of its remaining life (or %0.2f, whichever is lower) over 10 turns as frostdusk damage.
+		return ([[Your target's doom draws near %s. Its healing factor is reduced by 80%%, and it will take %d%% of its remaining life (or %0.2f, whichever is lower) over 10 turns as frostdusk damage.
 		This spell is so powerful that every 3 turns it tears a part of the target's soul, generating one soul for you.
 		The damage will increase with your Spellpower.]]):
-		tformat(t.getDamage(self, t), t.getMax(self, t))
+		tformat(Desc.vs"ss", t.getDamage(self, t), t.getMax(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/explosives.lua b/game/modules/tome/data/talents/spells/explosives.lua
index 6e58588acab20538a8d882edb4b2b748c5e46522..bead6ecfd19ef59e9519a215e0f476be7e96fa11 100644
--- a/game/modules/tome/data/talents/spells/explosives.lua
+++ b/game/modules/tome/data/talents/spells/explosives.lua
@@ -292,8 +292,8 @@ newTalent{
 		if ammo then dam = t.computeDamage(self, t, ammo) end
 		dam = damDesc(self, DamageType.PHYSICAL, dam)
 		return ([[Crush together two alchemist gems, making them extremely unstable.
-		You then throw them to a target area, where they explode on impact, dealing %0.2f physical damage and knocking back any creatures in the blast radius.
+		You then throw them to a target area, where they explode on impact, dealing %0.2f physical damage and knocking back any creatures in the blast radius %s.
 		Each kind of gem will also provide a specific effect.
-		The damage will improve with better gems and with your Spellpower.]]):tformat(dam)
+		The damage will improve with better gems and with your Spellpower.]]):tformat(dam, Desc.vs"sp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/fire.lua b/game/modules/tome/data/talents/spells/fire.lua
index da08612659e12a861e0fb090ddd808384febe473..96393fcb654ddd0547bc14d75d567564284d1849 100644
--- a/game/modules/tome/data/talents/spells/fire.lua
+++ b/game/modules/tome/data/talents/spells/fire.lua
@@ -131,9 +131,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local stunduration = t.getStunDuration(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Conjures up a cone of flame with radius %d. Any targets caught in the area will suffer Burning Shock, stunning them and dealing %0.2f fire damage over %d turns.
+		return ([[Conjures up a cone of flame with radius %d. Any targets caught in the area will suffer Burning Shock %s, stunning them and dealing %0.2f fire damage over %d turns.
 		The damage will increase with your Spellpower.]]):
-		tformat(radius, damDesc(self, DamageType.FIRE, damage), stunduration)
+		tformat(radius, Desc.vs"sp", damDesc(self, DamageType.FIRE, damage), stunduration)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/frost-alchemy.lua b/game/modules/tome/data/talents/spells/frost-alchemy.lua
index ddac4b2da374afa7e7bb8a414cd89db868450481..af42b9d444a4e219b495b174b5e87c099f454b4c 100644
--- a/game/modules/tome/data/talents/spells/frost-alchemy.lua
+++ b/game/modules/tome/data/talents/spells/frost-alchemy.lua
@@ -92,16 +92,16 @@ newTalent{
 	end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
-		local grids = self:project(tg, self.x, self.y, DamageType.COLDNEVERMOVE, {dur=t.getDuration(self, t), dam=t.getDamage(self, t)})
+		local grids = self:project(tg, self.x, self.y, DamageType.COLDNEVERMOVE, {dur=t.getDuration(self, t), dam=t.getDamage(self, t), apply_power=self:combatSpellpower()})
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_ice", {radius=tg.radius})
 		game:playSoundNear(self, "talents/ice")
 		return true
 	end,
 	info = function(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Invoke a blast of cold all around you with a radius of %d, doing %0.1f Cold damage and freezing creatures to the ground for %d turns.
+		return ([[Invoke a blast of cold all around you with a radius of %d, doing %0.1f Cold damage and freezing creatures to the ground for %d turns %s.
 		Affected creatures can still act, but cannot move.
-		The duration will increase with your Spellpower.]]):tformat(radius, damDesc(self, DamageType.COLD, t.getDamage(self, t)), t.getDuration(self, t))
+		The duration will increase with your Spellpower.]]):tformat(radius, damDesc(self, DamageType.COLD, t.getDamage(self, t)), t.getDuration(self, t), Desc.vs"sp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/golem.lua b/game/modules/tome/data/talents/spells/golem.lua
index dfe6a27b7546f4eb5a1ace7868db0265457c80ca..71d36d9a3928ab7dd46996e1d8b89f0500abdce3 100644
--- a/game/modules/tome/data/talents/spells/golem.lua
+++ b/game/modules/tome/data/talents/spells/golem.lua
@@ -78,9 +78,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Your golem rushes to the target, dealing %d%% damage and knocking it back.
-		Knockback chance will increase with talent level.
-		While rushing the golem becomes ethereal, passing harmlessly through creatures on the path to its target.]]):tformat(100 * damage)
+		return ([[Your golem rushes to the target, dealing %d%% damage and knocking it back %s.
+		While rushing the golem becomes ethereal, passing harmlessly through creatures on the path to its target.]]):tformat(100 * damage, Desc.vs"pp")
 	end,
 }
 
@@ -179,10 +178,10 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local duration = t.getPinDuration(self, t)
-		return ([[Your golem rushes to the target, crushing it into the ground for %d turns and doing %d%% damage.
+		return ([[Your golem rushes to the target, crushing it into the ground for %d turns %s and doing %d%% damage.
 		Pinning chance will increase with talent level.
 		While rushing the golem becomes ethereal, passing harmlessly through creatures on the path to its target.]]):
-		tformat(duration, 100 * damage)
+		tformat(duration, Desc.vs"pp", 100 * damage)
 	end,
 }
 
@@ -247,10 +246,10 @@ newTalent{
 	info = function(self, t)
 		local duration = t.getDazeDuration(self, t)
 		local damage = t.getGolemDamage(self, t)
-		return ([[Your golem rushes to the target and creates a shockwave with radius 2, dazing all foes for %d turns and doing %d%% damage.
+		return ([[Your golem rushes to the target and creates a shockwave with radius 2, dazing all foes for %d turns %s and doing %d%% damage.
 		Daze chance increases with talent level.
 		While rushing the golem becomes ethereal, passing harmlessly through creatures on the path to its target.]]):
-		tformat(duration, 100 * damage)
+		tformat(duration, Desc.vs"pp", 100 * damage)
 	end,
 }
 
@@ -505,7 +504,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Breathe poison on your foes, doing %d damage over a few turns.
-		The damage will increase with your Magic.]]):tformat(damDesc(self, DamageType.NATURE, self:combatTalentStatDamage(t, "mag", 30, 460)))
+		return ([[Breathe poison on your foes, doing %d damage over a few turns %s.
+		The damage will increase with your Magic.]]):tformat(damDesc(self, DamageType.NATURE, self:combatTalentStatDamage(t, "mag", 30, 460)), Desc.vs"sp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/grave.lua b/game/modules/tome/data/talents/spells/grave.lua
index 8cf5d0384f2901de372609d672b3978f63720876..ad41818412095fe215d1cd36d853471907b415a9 100644
--- a/game/modules/tome/data/talents/spells/grave.lua
+++ b/game/modules/tome/data/talents/spells/grave.lua
@@ -58,9 +58,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		return ([[Summon an icy spike directly on a foe, impaling it for %0.2f cold damage.
 		At level 5 it hits all foes in range 1 around the target.
-		Any creature hit will take %d%% more damage from your necrotic minions for 3 turns.
+		Any creature hit will take %d%% more damage from your necrotic minions for 3 turns %s.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.COLD, damage), t:_getMinionsInc(self))
+		tformat(damDesc(self, DamageType.COLD, damage), t:_getMinionsInc(self), Desc.vs"ss")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/ice.lua b/game/modules/tome/data/talents/spells/ice.lua
index edb70fecbecaf0d12ee042da9bd34953b192c709..d9a4d5259c4213a726d182d59f47e230f453ff9e 100644
--- a/game/modules/tome/data/talents/spells/ice.lua
+++ b/game/modules/tome/data/talents/spells/ice.lua
@@ -43,7 +43,7 @@ newTalent{
 
 		local dam = self:spellCrit(t.getDamage(self, t))
 		self:project(tg, x, y, DamageType.COLD, dam, {type="freeze"})
-		self:project(tg, x, y, DamageType.FREEZE, {dur=t.getDuration(self, t), hp=70 + dam * 0.7})
+		self:project(tg, x, y, DamageType.FREEZE, {dur=t.getDuration(self, t), hp=70 + dam * 0.7, apply_power=self:combatSpellpower()})
 
 		tg.type = "hit"
 		self:projectApply(tg, x, y, Map.ACTOR, function(target)
@@ -57,9 +57,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Condenses ambient water on a target, freezing it for %d turns and damaging it for %0.2f.
+		return ([[Condenses ambient water on a target, freezing it for %d turns %s and damaging it for %0.2f.
 		If this is used on a friendly target the cooldown is reduced by 33%%.
-		The damage will increase with your Spellpower.]]):tformat(t.getDuration(self, t), damDesc(self, DamageType.COLD, damage))
+		The damage will increase with your Spellpower.]]):tformat(t.getDuration(self, t), Desc.vs"sp", damDesc(self, DamageType.COLD, damage))
 	end,
 }
 
@@ -80,7 +80,7 @@ newTalent{
 	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 280) end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
-		local grids = self:project(tg, self.x, self.y, DamageType.COLDNEVERMOVE, {shatter_reduce=2, dur=4, dam=self:spellCrit(t.getDamage(self, t))})
+		local grids = self:project(tg, self.x, self.y, DamageType.COLDNEVERMOVE, {shatter_reduce=2, dur=4, dam=self:spellCrit(t.getDamage(self, t)), apply_power=self:combatSpellpower()})
 --		game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_ice", {radius=tg.radius})
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "circle", {oversize=1.1, a=255, limit_life=16, grow=true, speed=0, img="ice_nova", radius=tg.radius})
 		game:playSoundNear(self, "talents/ice")
@@ -89,10 +89,10 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Blast a wave of cold all around you with a radius of %d, doing %0.2f cold damage and freezing creatures to the ground for 4 turns.
+		return ([[Blast a wave of cold all around you with a radius of %d, doing %0.2f cold damage and freezing creatures to the ground for 4 turns %s.
 		Affected creatures can still act, but cannot move.
 		For each affected creature that is also wet the cooldown of Shatter decreases by 2.
-		The damage will increase with your Spellpower.]]):tformat(radius, damDesc(self, DamageType.COLD, damage))
+		The damage will increase with your Spellpower.]]):tformat(radius, damDesc(self, DamageType.COLD, damage), Desc.vs"sp")
 	end,
 }
 
@@ -150,11 +150,11 @@ newTalent{
 		* Critters will be instantly killed
 		* +50%% critical chance against Normal rank
 		* +25%% critical chance against Elites or Bosses
-		All affected foes will get the wet effect.
+		All affected foes will get the wet effect %s.
 		At most, it will affect %d foes.
 		If you are yourself Frozen, it will instantly be destroyed.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.COLD, damage), targetcount)
+		tformat(damDesc(self, DamageType.COLD, damage), Desc.vs"ss", targetcount)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/master-necromancer.lua b/game/modules/tome/data/talents/spells/master-necromancer.lua
index 8d3d6c1e13c287dbf1b670d82b136312f7f365ac..b6fbf8c5d07c817160bbab173dfad5a9775536bf 100644
--- a/game/modules/tome/data/talents/spells/master-necromancer.lua
+++ b/game/modules/tome/data/talents/spells/master-necromancer.lua
@@ -101,9 +101,9 @@ newTalent{
 		All non-ghoul minions are healed by %d%%.
 		If you know Call of the Mausoleum, the time remaining to the next free ghoul is reduced by %d.
 		if you know Corpse Explosion or Putrescent Liquefaction the duration of those effects are increased by %d.
-		All non-undead foes caught inside are dazed for %d turns.
+		All non-undead foes caught inside are dazed for %d turns %s.
 		In addition all your minions (created after you learn this spell) have a passive health regeneration.]]):
-		tformat(t:_getSpeed(self), t:_getHeal(self), t:_getGhoulDur(self), t:_getGhoulDur(self), t:_getDaze(self))
+		tformat(t:_getSpeed(self), t:_getHeal(self), t:_getGhoulDur(self), t:_getGhoulDur(self), t:_getDaze(self), Desc.vs"sp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/master-of-bones.lua b/game/modules/tome/data/talents/spells/master-of-bones.lua
index 179b865f41743db409cd446c05439713b9859eed..d57b07664a99b7098f9c10c1373b00f9e22dc210 100644
--- a/game/modules/tome/data/talents/spells/master-of-bones.lua
+++ b/game/modules/tome/data/talents/spells/master-of-bones.lua
@@ -313,10 +313,10 @@ newTalent{
 		game:playSoundNear(summon, "talents/skeleton")
 	end,
 	info = function(self, t)
-		return ([[Any time one of your skeleton or bone giant dies, it shatters in radius %d, making any foe bleed for %0.2f physical damage over 5 turns.
+		return ([[Any time one of your skeleton or bone giant dies, it shatters in radius %d, making any foe bleed for %0.2f physical damage over 5 turns %s.
 		If any other skeleton or bone giant minion is in the radius it will pickup some of the bones to enhance itself, increasing maximum and current life by %d, armour by %d and gain %0.2f physical melee retaliation for 20 turns.
 		This talent never works when you kill your own minions.
-		]]):tformat(self:getTalentRadius(t), t:_getDamage(self), t:_getHealth(self), t:_getArmor(self), t:_getRetaliation(self))
+		]]):tformat(self:getTalentRadius(t), t:_getDamage(self), Desc.vs"sp", t:_getHealth(self), t:_getArmor(self), t:_getRetaliation(self))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/master-of-flesh.lua b/game/modules/tome/data/talents/spells/master-of-flesh.lua
index 54b9e74df3dcd3f6029fbe956151fa53486f4635..1a40f8168e84b83d5f9667987f38b78bdb79a7c3 100644
--- a/game/modules/tome/data/talents/spells/master-of-flesh.lua
+++ b/game/modules/tome/data/talents/spells/master-of-flesh.lua
@@ -265,11 +265,11 @@ newTalent{
 	info = function(self, t)
 		return ([[Ghouls are nothing but mere tools to you, for %d turns you render them bloated with dark forces.
 		Anytime a ghoul or ghast is hit it will explode in a messy splash of gore, dealing %0.2f frostdusk damage to all foes in radius %d of it.
-		Any creature caught in the blast also receives a random disease that deals %0.2f blight damage over 6 turns and reduces one attribute by %d.
+		Any creature caught in the blast also receives a random disease %s that deals %0.2f blight damage over 6 turns and reduces one attribute by %d.
 		Only one ghoul may explode per turn. The one with the least time left to live is always the first to do so.
 		The damage and disease power is increased by your Spellpower.
 		]]):
-		tformat(t:_getDur(self), damDesc(self, DamageType.FROSTDUSK, t:_getDamage(self)), self:getTalentRadius(t), damDesc(self, DamageType.BLIGHT, t:_getDamage(self)), t:_getDiseasePower(self))
+		tformat(t:_getDur(self), damDesc(self, DamageType.FROSTDUSK, t:_getDamage(self)), self:getTalentRadius(t), Desc.vs"ss", damDesc(self, DamageType.BLIGHT, t:_getDamage(self)), t:_getDiseasePower(self))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/necrosis.lua b/game/modules/tome/data/talents/spells/necrosis.lua
index b7b40a84759aa93a5c83312d51a038290057a26e..34ce67a8173979bcffd3b156471ded9ca9e7d665 100644
--- a/game/modules/tome/data/talents/spells/necrosis.lua
+++ b/game/modules/tome/data/talents/spells/necrosis.lua
@@ -183,7 +183,7 @@ newTalent{
 		return ([[Each turn you unleash dark powers through your runeskin.
 		For each rune you have a random foe in sight will be hit by a spike of decrepitude, dealing %0.2f frostdusk damage.
 		A foe can only be hit by one spike per turn.
-		If your life is below 1, the spikes also reduce all damage done by the targets by %d%%.]]):
-		tformat(damDesc(self, DamageType.FROSTDUSK, t.getDamage(self, t)), t.getReduce(self, t))
+		If your life is below 1, the spikes also reduce all damage done by the targets by %d%% %s.]]):
+		tformat(damDesc(self, DamageType.FROSTDUSK, t.getDamage(self, t)), t.getReduce(self, t), Desc.vs"ss")
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/nightfall.lua b/game/modules/tome/data/talents/spells/nightfall.lua
index 4e7809b18d693fb2d6b59fd4803da3156ad503fe..a59164da9e9dceb88cb61b09e494bd531467c4dc 100644
--- a/game/modules/tome/data/talents/spells/nightfall.lua
+++ b/game/modules/tome/data/talents/spells/nightfall.lua
@@ -96,11 +96,11 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Dark fumes erupt from the ground in radius %d for 5 turns. Any creature entering the circle will receive either a bane of confusion or a bane of blindness.
+		return ([[Dark fumes erupt from the ground in radius %d for 5 turns. Any creature entering the circle will receive either a bane of confusion or a bane of blindness %s.
 		Only one bane can affect a creature.
 		Banes last for %d turns, and also deal %0.2f darkness damage.
 		The damage will increase with your Spellpower.]]):
-		tformat(self:getTalentRadius(t), t.getBaneDur(self,t), damDesc(self, DamageType.DARKNESS, damage))
+		tformat(self:getTalentRadius(t), Desc.vs"ss", t.getBaneDur(self,t), damDesc(self, DamageType.DARKNESS, damage))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/phantasm.lua b/game/modules/tome/data/talents/spells/phantasm.lua
index c4aba9230bb1a349edb49601810ad97500e95e8a..00ea4d5ac9b1a63e735e89f9c26076616a0a93cc 100644
--- a/game/modules/tome/data/talents/spells/phantasm.lua
+++ b/game/modules/tome/data/talents/spells/phantasm.lua
@@ -58,8 +58,8 @@ newTalent{
 		local turn = t.getBlindPower(self, t)
 		local dam = t.getDamage(self, t)
 		return ([[Creates a globe of pure light within a radius of %d that illuminates the area and deals %0.2f damage to all creatures.
-		At level 3, it also blinds all who see it (except the caster) for %d turns.]]):
-		tformat(radius, damDesc(self, DamageType.LIGHT, dam), turn)
+		At level 3, it also blinds all who see it (except the caster) for %d turns %s.]]):
+		tformat(radius, damDesc(self, DamageType.LIGHT, dam), turn, Desc.vs"sp")
 	end,
 }
 
@@ -114,9 +114,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		return ([[Surround yourself with a phantasmal shield of pure light.
 		Whenever you would take damage there is %d%% chance to become ethereal for an instant and fully ignore it.
-		If you do get hit, the shield glows brightly, sending triggering a flash of light on the attacker, dealing %0.2f light damage in radius %d around it and dazzling any affected creature (deal 10%% less damage) for 5 turns. This can only happen every %d turns.
+		If you do get hit, the shield glows brightly, sending triggering a flash of light on the attacker, dealing %0.2f light damage in radius %d around it and dazzling any affected creature (deal 10%% less damage) for 5 turns %s. This can only happen every %d turns.
 		The damage and ignore chance will increase with your Spellpower.]]):
-		tformat(t.getEvade(self, t), damDesc(self, DamageType.LIGHT, damage), self:getTalentRadius(t), t.getDur(self, t))
+		tformat(t.getEvade(self, t), damDesc(self, DamageType.LIGHT, damage), self:getTalentRadius(t), Desc.vs"ss", t.getDur(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/staff-combat.lua b/game/modules/tome/data/talents/spells/staff-combat.lua
index 5f7966056f71f8fce315318649d11e36e2cd96e2..07d81c44ef17971981b96895c7226fe240c54485 100644
--- a/game/modules/tome/data/talents/spells/staff-combat.lua
+++ b/game/modules/tome/data/talents/spells/staff-combat.lua
@@ -183,9 +183,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local dazedur = t.getDazeDuration(self, t)
-		return ([[Hit a target for %d%% melee damage and stun it for %d turns.
-		Stun chance will improve with Spellpower.
+		return ([[Hit a target for %d%% melee damage and stun it for %d turns %s.
 		At level 5, this attack cannot miss.]]):
-		tformat(100 * damage, dazedur)
+		tformat(100 * damage, dazedur, Desc.vs"sp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/stone-alchemy.lua b/game/modules/tome/data/talents/spells/stone-alchemy.lua
index b0f995393a4ec4ff11ad87896709ee1cb4af0984..dcfdae2a737c10865732772fcac538b6ff372a00 100644
--- a/game/modules/tome/data/talents/spells/stone-alchemy.lua
+++ b/game/modules/tome/data/talents/spells/stone-alchemy.lua
@@ -225,12 +225,12 @@ newTalent{
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Touch your foe and turn it to stone for %d turns.
+		return ([[Touch your foe and turn it to stone for %d turns %s.
 		Stoned creatures are unable to act or regen life, and are very brittle.
 		If a stoned creature is hit by an attack that deals more than 30%% of its life, it will shatter and be destroyed.
 		Stoned creatures are highly resistant to fire and lightning, and somewhat resistant to physical attacks.
 		At level 3 the touch will become a beam.
 		This spell may fail against creatures resistant to being stunned, that are specifically immune to stoning, or certain bosses.]]):
-		tformat(duration)
+		tformat(duration, Desc.vs"ss")
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/stone.lua b/game/modules/tome/data/talents/spells/stone.lua
index 347c4edf08062431d1131869b898640bbdaafea6..aa9b4a6d9fa00488f4d519d60fd56c9779df8efd 100644
--- a/game/modules/tome/data/talents/spells/stone.lua
+++ b/game/modules/tome/data/talents/spells/stone.lua
@@ -176,9 +176,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
 		local duration = t.getDuration(self, t)
-		return ([[Causes a violent earthquake that deals %0.2f physical damage in a radius of %d each turn for %d turns, and potentially stuns any and all creatures it affects.
+		return ([[Causes a violent earthquake that deals %0.2f physical damage in a radius of %d each turn for %d turns, and potentially stuns any and all creatures it affects %s.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.PHYSICAL, damage), radius, duration)
+		tformat(damDesc(self, DamageType.PHYSICAL, damage), radius, duration, Desc.vs"sp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/storm.lua b/game/modules/tome/data/talents/spells/storm.lua
index e4cb74af195b0386b42b3d0fa322d905755a4242..3c55ab1a10ceedd090d65a57dbf8e03d2bb937d7 100644
--- a/game/modules/tome/data/talents/spells/storm.lua
+++ b/game/modules/tome/data/talents/spells/storm.lua
@@ -36,7 +36,7 @@ newTalent{
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local dam = self:spellCrit(t.getDamage(self, t))
-		self:project(tg, self.x, self.y, DamageType.LIGHTNING_DAZE, {daze=75, dam=rng.avg(dam / 3, dam, 3)})
+		self:project(tg, self.x, self.y, DamageType.LIGHTNING_DAZE, {daze=75, dam=rng.avg(dam / 3, dam, 3), power_check=self:combatSpellpower()})
 
 		if core.shader.active(4) then
 			game.level.map:particleEmitter(self.x, self.y, tg.radius, "shader_ring", {radius=tg.radius*2, life=8}, {type="sparks"})
@@ -60,11 +60,12 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Lightning emanates from you in a circular wave with radius %d, doing %0.2f to %0.2f lightning damage (%0.2f average) and possibly dazing anyone affected (75%% chance).
+		return ([[Lightning emanates from you in a circular wave with radius %d, doing %0.2f to %0.2f lightning damage (%0.2f average) and possibly dazing anyone affected (75%% chance) %s.
 		The damage will increase with your Spellpower.]]):tformat(radius,
 		damDesc(self, DamageType.LIGHTNING, damage / 3),
 		damDesc(self, DamageType.LIGHTNING, damage),
-		damDesc(self, DamageType.LIGHTNING, (damage + damage / 3) / 2))
+		damDesc(self, DamageType.LIGHTNING, (damage + damage / 3) / 2),
+		Desc.vs"sp")
 	end,
 }
 
@@ -85,18 +86,20 @@ newTalent{
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		local dam = t.getDamage(self, t)
-		self:projectile(tg, x, y, DamageType.LIGHTNING_DAZE, {shock=5, daze=100, dam=self:spellCrit(rng.avg(dam / 3, dam, 3))}, {type="lightning_explosion"})
+		self:projectile(tg, x, y, DamageType.LIGHTNING_DAZE, {shock=5, daze=100, dam=self:spellCrit(rng.avg(dam / 3, dam, 3)), power_check=self:combatSpellpower()}, {type="lightning_explosion"})
 		game:playSoundNear(self, "talents/lightning")
 		return true
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Conjures up a bolt of lightning, doing %0.2f to %0.2f damage (%0.2f average) and dazing the target for 3 turns.
-		If the target resists the daze effect it is instead shocked, which halves stun/daze/pin resistance, for 5 turns.
+		return ([[Conjures up a bolt of lightning, doing %0.2f to %0.2f damage (%0.2f average) and dazing the target for 3 turns %s.
+		If the target resists the daze effect it is instead shocked, which halves stun/daze/pin resistance, for 5 turns %s.
 		The damage will increase with your Spellpower.]]):
 		tformat(damDesc(self, DamageType.LIGHTNING, damage / 3),
 		damDesc(self, DamageType.LIGHTNING, damage),
-		damDesc(self, DamageType.LIGHTNING, (damage + damage / 3) / 2))
+		damDesc(self, DamageType.LIGHTNING, (damage + damage / 3) / 2),
+		Desc.vs"sp",
+		Desc.vs"ss")
 	end,
 }
 
@@ -136,9 +139,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local chance = t.getChance(self, t)
 		local radius = t.getRadius(self, t)
-		return ([[Each time one of your lightning spells dazes a target, it has a %d%% chance to creates a chain reaction that summons a mighty Hurricane that lasts for 10 turns around the target with a radius of %d.
+		return ([[Each time one of your lightning spells dazes a target, it has a %d%% chance to creates a chain reaction that summons a mighty Hurricane %s that lasts for 10 turns around the target with a radius of %d.
 		Each turn, the afflicted creature and all creatures around it will take %0.2f to %0.2f lightning damage (%0.2f average).
-		The damage will increase with your Spellpower.]]):tformat(chance, radius,
+		The damage will increase with your Spellpower.]]):tformat(chance, Desc.vs"ss", radius,
 		damDesc(self, DamageType.LIGHTNING, damage / 3),
 		damDesc(self, DamageType.LIGHTNING, damage),
 		damDesc(self, DamageType.LIGHTNING, (damage + damage / 3) / 2))
@@ -184,7 +187,7 @@ newTalent{
 		local ressistpen = t.getResistPenalty(self, t)
 		local daze = t.getDaze(self, t)
 		return ([[Surround yourself with a Tempest, increasing all your lightning damage by %d%% and ignoring %d%% lightning resistance of your targets.
-		Your Lightning and Chain Lightning spells also gain a %d%% chance to daze, and your Thunderstorm spell gains a %d%% chance to daze.]])
-		:tformat(damageinc, ressistpen, daze, daze / 2)
+		Your Lightning and Chain Lightning spells also gain a %d%% chance to daze, and your Thunderstorm spell gains a %d%% chance to daze. %s]])
+		:tformat(damageinc, ressistpen, daze, daze / 2, Desc.vs"sp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/temporal.lua b/game/modules/tome/data/talents/spells/temporal.lua
index 7b6450ad14f874548d77d2bba6a3b8db0b1f6bb7..97e193aed3875316b5f699da6ed47bcaab40e651 100644
--- a/game/modules/tome/data/talents/spells/temporal.lua
+++ b/game/modules/tome/data/talents/spells/temporal.lua
@@ -47,8 +47,8 @@ newTalent{
 	info = function(self, t)
 		local slow = t.getSlow(self, t)
 		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.]]):
-		tformat(100 * slow, proj)
+		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 %s.]]):
+		tformat(100 * slow, proj, Desc.vs"ss")
 	end,
 }
 
@@ -109,10 +109,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Removes the target from the flow of time for %d turns. In this state, the target can neither act nor be harmed.
+		return ([[Removes the target from the flow of time for %d turns %s. In this state, the target can neither act nor be harmed.
 		Time does not pass at all for the target, no talents will cooldown, no resources will regen, and so forth.
 		The duration will increase with your Spellpower.]]):
-		tformat(duration)
+		tformat(duration, Desc.vs"ss")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/thaumaturgy.lua b/game/modules/tome/data/talents/spells/thaumaturgy.lua
index 31e08f5625269ee566c6a172d0843fe22f370a9c..36052220574bf1d9b20bf26775b25aa6aead7cb7 100644
--- a/game/modules/tome/data/talents/spells/thaumaturgy.lua
+++ b/game/modules/tome/data/talents/spells/thaumaturgy.lua
@@ -289,10 +289,10 @@ newTalent{
 		Thaumic damage can never be resisted by anything but "Resistance: All", always uses your highest resistance penetration and highest damage type bonus and can never be altered into other damage types.
 		It can trigger Burning Wake and Hurricane.
 		It is affected by the wet status (+30%% damage) if you are in Shivgoroth Form.
-		It has a 25%% chance to either stun or freeze the targets for 3 turns (if Crystalline Focus or Uttercold are active, respectively).
+		It has a 25%% chance to either stun %s or freeze %s the targets for 3 turns (if Crystalline Focus or Uttercold are active, respectively).
 		Each time you deal damage with a beam spell, the remaining cooldown is reduced by 1 (this can happen only once per turn).
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.THAUM, damage))
+		tformat(damDesc(self, DamageType.THAUM, damage), Desc.vs"sp", Desc.vs"sp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/spells/water.lua b/game/modules/tome/data/talents/spells/water.lua
index 13875fb962457e635613b2f6650c60e698a489a6..27e4e5f0b3afe5135a43868ce66013453e69727b 100644
--- a/game/modules/tome/data/talents/spells/water.lua
+++ b/game/modules/tome/data/talents/spells/water.lua
@@ -42,14 +42,14 @@ newTalent{
 
 		local dam = thaumaturgyBeamDamage(self, self:spellCrit(t.getDamage(self, t)))
 		if thaumaturgyCheck(self) then
-			self:project(tg, x, y, DamageType.ICE, {chance=25, do_wet=true, dam=dam})
+			self:project(tg, x, y, DamageType.ICE, {chance=25, do_wet=true, dam=dam, apply_power=self:combatSpellpower()})
 			game.level.map:particleEmitter(self.x, self.y, tg.radius, "ice_beam_wide", {tx=x-self.x, ty=y-self.y})
 		else
 			self:project(tg, x, y, function(px, py)
 				local actor = game.level.map(px, py, Map.ACTOR)
 				if actor and actor ~= self then
 					local tg2 = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="arrow", particle_args={tile="particles_images/ice_shards"}}}
-					self:projectile(tg2, px, py, DamageType.ICE, {chance=25, do_wet=true, dam=dam}, {type="freeze"})
+					self:projectile(tg2, px, py, DamageType.ICE, {chance=25, do_wet=true, dam=dam, apply_power=self:combatSpellpower()}, {type="freeze"})
 				end
 			end)
 		end
@@ -59,12 +59,12 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Hurl ice shards at the targets in the selected area. Each shard travels slowly and does %0.2f ice damage, hitting all adjacent targets on impact with 25%% chance to freeze them.
-		If the target resists being frozen, it instead get wet.
+		return ([[Hurl ice shards at the targets in the selected area. Each shard travels slowly and does %0.2f ice damage, hitting all adjacent targets on impact with 25%% chance to freeze them %s.
+		If the target resists being frozen, it instead get wet %s.
 		If the target is wet the damage increases by 30%% and the ice freeze chance increases to 50%%.
 		This spell will never hit the caster.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.COLD, damage))
+		tformat(damDesc(self, DamageType.COLD, damage), Desc.vs"sp", Desc.vs"ss")
 	end,
 }
 
@@ -94,7 +94,7 @@ newTalent{
 		-- Add a lasting map effect
 		game.level.map:addEffect(self,
 			x, y, t.getDuration(self, t),
-			DamageType.GLACIAL_VAPOUR, self:spellCrit(t.getDamage(self, t)),
+			DamageType.GLACIAL_VAPOUR, {dam=self:spellCrit(t.getDamage(self, t)),apply_power=self:combatSpellpower()},
 			self:getTalentRadius(t),
 			5, nil,
 			{type="ice_vapour"},
@@ -107,9 +107,9 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		return ([[Glacial fumes rise from the ground, doing %0.2f cold damage in a radius of 3 each turn for %d turns.
-		Creatures that are wet will take 30%% more damage and have 15%% chance to get frozen.
+		Creatures that are wet will take 30%% more damage and have 15%% chance to get frozen %s.
 		The damage will increase with your Spellpower.]]):
-		tformat(damDesc(self, DamageType.COLD, damage), duration)
+		tformat(damDesc(self, DamageType.COLD, damage), duration, Desc.vs"sp")
 	end,
 }
 
@@ -138,7 +138,7 @@ newTalent{
 		self:callTalent(self.T_ENERGY_ALTERATION, "forceActivate", DamageType.COLD)
 		game.level.map:addEffect(self,
 			self.x, self.y, t.getDuration(self, t),
-			DamageType.WAVE, {dam=t.getDamage(self, t), x=self.x, y=self.y, apply_wet=5},
+			DamageType.WAVE, {dam=t.getDamage(self, t), x=self.x, y=self.y, apply_wet=5, power=self:combatSpellpower()},
 			1,
 			5, nil,
 			MapEffect.new{color_br=30, color_bg=60, color_bb=200, effect_shader="shader_images/water_effect1.png"},
@@ -156,11 +156,11 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[A wall of water rushes out from the caster with an initial radius of 1, increasing by 1 per turn to a maximum radius of %d, doing %0.2f cold damage and %0.2f physical damage to all inside, as well as knocking back targets each turn.
+		return ([[A wall of water rushes out from the caster with an initial radius of 1, increasing by 1 per turn to a maximum radius of %d, doing %0.2f cold damage and %0.2f physical damage to all inside, as well as knocking back targets each turn %s.
 		The tidal wave lasts for %d turns.
-		All creatures hit gain the wet effect, which reduces their stun/freeze immunity by half and interacts with other cold spells.
+		All creatures hit gain the wet effect %s, which reduces their stun/freeze immunity by half and interacts with other cold spells.
 		The damage and duration will increase with your Spellpower.]]):
-		tformat(radius, damDesc(self, DamageType.COLD, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2), duration)
+		tformat(radius, damDesc(self, DamageType.COLD, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2), Desc.vs"sp", duration, Desc.vs())
 	end,
 }
 
@@ -228,7 +228,7 @@ newTalent{
 		self:callTalent(self.T_ENERGY_ALTERATION, "forceActivate", DamageType.COLD)
 		game.level.map:addEffect(self,
 			self.x, self.y, t.getDuration(self, t),
-			DamageType.ICE_STORM, t.getDamage(self, t),
+			DamageType.ICE_STORM, {dam=t.getDamage(self, t),apply_power=self:combatSpellpower()},
 			3,
 			5, nil,
 			{type="icestorm", only_one=true},
@@ -247,8 +247,8 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		return ([[A furious ice storm rages around the caster, doing %0.2f cold damage in a radius of 3 each turn for %d turns.
-		It has a 25%% chance to freeze damaged targets.
+		It has a 25%% chance to freeze damaged targets %s.
 		If the target is wet the damage increases by 30%% and the freeze chance increases to 50%%.
-		The damage and duration will increase with your Spellpower.]]):tformat(damDesc(self, DamageType.COLD, damage), duration)
+		The damage and duration will increase with your Spellpower.]]):tformat(damDesc(self, DamageType.COLD, damage), duration, Desc.vs"sp")
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/wildfire.lua b/game/modules/tome/data/talents/spells/wildfire.lua
index f453efe30fefeddefe408f786a1f590eec00375d..3ed58245de18b7117fd83ff2585745d699a43df5 100644
--- a/game/modules/tome/data/talents/spells/wildfire.lua
+++ b/game/modules/tome/data/talents/spells/wildfire.lua
@@ -58,8 +58,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[A wave of fire emanates from you with a radius of %d, knocking back anything caught inside and setting them ablaze, doing %0.2f fire damage over 3 turns.
-		The damage will increase with your Spellpower.]]):tformat(radius, damDesc(self, DamageType.FIRE, damage))
+		return ([[A wave of fire emanates from you with a radius of %d, knocking back anything caught inside %s and setting them ablaze, doing %0.2f fire damage over 3 turns.
+		The damage will increase with your Spellpower.]]):tformat(radius, Desc.vs"sp", damDesc(self, DamageType.FIRE, damage))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/2h-assault.lua b/game/modules/tome/data/talents/techniques/2h-assault.lua
index a58ebb05a078ffbfefbeb686257e3a44f3fab23e..78b0673ef722f3a9a75b1ec373bf024c0461d49a 100644
--- a/game/modules/tome/data/talents/techniques/2h-assault.lua
+++ b/game/modules/tome/data/talents/techniques/2h-assault.lua
@@ -55,9 +55,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hit the target twice with your two-handed weapon, doing %d%% damage. Each hit will try to stun the target for %d turns.
-		The stun chance increases with your Physical Power.]])
-		:tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 0.7), t.getDuration(self, t))
+		return ([[Hit the target twice with your two-handed weapon, doing %d%% damage. Each hit will try to stun the target for %d turns %s.]])
+		:tformat(100 * self:combatTalentWeaponDamage(t, 0.5, 0.7), t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
@@ -157,7 +156,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Spin around, extending your weapon in radius %d and damaging all targets around you for %d%% weapon damage.
-		At level 3 all damage done will also make the targets bleed for an additional %d%% damage over 5 turns]]):tformat(self:getTalentRadius(t), 100 * self:combatTalentWeaponDamage(t, 1.4, 2.1), t.getBleed(self, t) * 100)
+		At level 3 all damage done will also make the targets bleed for an additional %d%% damage over 5 turns %s.]]):tformat(self:getTalentRadius(t), 100 * self:combatTalentWeaponDamage(t, 1.4, 2.1), t.getBleed(self, t) * 100, Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/2hweapon.lua b/game/modules/tome/data/talents/techniques/2hweapon.lua
index dcf1003d1705d56d76cc47f33b27bbcab01ad821..8b5122d1e2338163f439b3c6dbef5c40d95a48c5 100644
--- a/game/modules/tome/data/talents/techniques/2hweapon.lua
+++ b/game/modules/tome/data/talents/techniques/2hweapon.lua
@@ -145,8 +145,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Shout your warcry in a frontal cone of radius %d. Any targets caught inside will be confused (power %d%%) for %d turns.]]):
-		tformat(self:getTalentRadius(t),t.getConfusion(self, t), t.getDuration(self, t))
+		return ([[Shout your warcry in a frontal cone of radius %d. Any targets caught inside will be confused (power %d%%) for %d turns %s.]]):
+		tformat(self:getTalentRadius(t),t.getConfusion(self, t), t.getDuration(self, t), Desc.vs"pm")
 	end,
 }
 
@@ -201,9 +201,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Tries to perform a killing blow, doing %d%% weapon damage and dealing an automatic critical hit. If the target ends up with low enough life (<20%%), it might be instantly killed.
-		At level 4, it drains half your remaining stamina, and uses it to increase the blow damage by 100%% of it.
-		The chance to instantly kill will increase with your Physical Power.]]):tformat(100 * self:combatTalentWeaponDamage(t, 0.8, 1.3))
+		return ([[Tries to perform a killing blow, doing %d%% weapon damage and dealing an automatic critical hit. If the target ends up with low enough life (<20%%), it might be instantly killed %s.
+		At level 4, it drains half your remaining stamina, and uses it to increase the blow damage by 100%% of it.]]):tformat(100 * self:combatTalentWeaponDamage(t, 0.8, 1.3), Desc.vs"pp")
 	end,
 }
 
@@ -249,9 +248,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target is stunned for %d turns.
-		The stun chance increases with your Physical Power.]])
-		:tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.5), t.getDuration(self, t))
+		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target is stunned for %d turns. %s]])
+		:tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.5), t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
@@ -314,10 +312,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target's armour and saves are reduced by %d for %d turns.
-		Also if the target is protected by any temporary magical or psionic damage absorbing shields there is %d%% chance to shatter one random shield.
-		Armor reduction chance increases with your Physical Power.]])
-		:tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.5),t.getArmorReduc(self, t), t.getDuration(self, t), t.getShatter(self, t))
+		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target's armour and saves are reduced by %d for %d turns %s.
+		Also if the target is protected by any temporary magical or psionic damage absorbing shields there is %d%% chance to shatter one random shield.]])
+		:tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.5),t.getArmorReduc(self, t), t.getDuration(self, t), Desc.vs"pp", t.getShatter(self, t))
 	end,
 }
 
@@ -356,10 +353,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target's Accuracy is reduced by %d for %d turns.
-		Accuracy reduction chance increases with your Physical Power.]])
+		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target's Accuracy is reduced by %d for %d turns %s.]])
 		:tformat(
-			100 * self:combatTalentWeaponDamage(t, 1, 1.5), 3 * self:getTalentLevel(t), t.getDuration(self, t))
+			100 * self:combatTalentWeaponDamage(t, 1, 1.5), 3 * self:getTalentLevel(t), t.getDuration(self, t), Desc.vs"pp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/agility.lua b/game/modules/tome/data/talents/techniques/agility.lua
index 60189146c698d7dbc8ffc9368b962142f3ce6aa0..03de2ec3ade28b8f223125aa2b161cac70726b45 100644
--- a/game/modules/tome/data/talents/techniques/agility.lua
+++ b/game/modules/tome/data/talents/techniques/agility.lua
@@ -163,10 +163,10 @@ newTalent{
 	info = function(self, t)
 		local dam = t.getDamage(self, t) * 100
 		local range = t.getDist(self, t)
-		return ([[Leap onto an adjacent target with your shield, striking them for %d%% damage and dazing them for 2 turns, then using them as a springboard to leap to a tile within range %d.
+		return ([[Leap onto an adjacent target with your shield, striking them for %d%% damage and dazing them for 2 turns %s, then using them as a springboard to leap to a tile within range %d.
 The shield bash will use Dexterity instead of Strength for the shield's bonus damage.
 At talent level 5, you will immediately enter a blocking stance on landing.]])
-		:tformat(dam, range)
+		:tformat(dam, Desc.vs"pp", range)
 	end,
 }
 
@@ -238,10 +238,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You rush toward your foe, readying your shot. If you reach the enemy, you release the shot, imbuing it with great power.
-		The shot does %d%% weapon damage and knocks back your target by %d.
+		The shot does %d%% weapon damage and knocks back your target by %d %s.
 		The cooldown of this talent is reduced by 1 each time you move.
 		This requires a sling to use.]]):
-		tformat(t.getDamage(self,t)*100, t.getDist(self, t))
+		tformat(t.getDamage(self,t)*100, t.getDist(self, t), Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/archery.lua b/game/modules/tome/data/talents/techniques/archery.lua
index 8329ffb39c8d6f119ee91a96de754716b8f757a8..49c08f52606e41611106e9833af3d5721e4e6fbf 100644
--- a/game/modules/tome/data/talents/techniques/archery.lua
+++ b/game/modules/tome/data/talents/techniques/archery.lua
@@ -211,9 +211,9 @@ newTalent{
 	info = function(self, t)
 		local dam = t.getDamage(self,t)*100
 		local chance = t.getChance(self,t)
-		return ([[Fire a steady shot, doing %d%% damage with a %d%% chance to mark the target.
+		return ([[Fire a steady shot, doing %d%% damage with a %d%% chance to mark the target %s.
 If Steady Shot is not on cooldown, this talent will automatically replace your normal attacks (and trigger the cooldown).]]):
-		tformat(dam, chance)
+		tformat(dam, chance, Desc.vs())
 	end,
 }
 
@@ -231,7 +231,6 @@ newTalent{
 	requires_target = true,
 	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.0, 1.4) end,
 	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 5)) end,
-	getMarkChance = function(self, t) return math.floor(self:combatTalentScale(t, 5, 20)) end,
 	on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
 	getChance = function(self,t) 
 		local chance = 20
@@ -261,12 +260,10 @@ newTalent{
 	info = function(self, t)
 		local dam = t.getDamage(self,t)*100
 		local dur = t.getDuration(self,t)
-		local mark = t.getMarkChance(self,t)
 		local chance = t.getChance(self,t)
-		return ([[You fire a shot for %d%% damage that attempts to pin your target to the ground for %d turns, as well as giving your next Steady Shot or Shoot 100%% increased chance to critically hit and mark (regardless of whether the pin succeeds).
-		This shot has a 20%% chance to mark the target.
-		The chance to pin increases with your Accuracy.]]):
-		tformat(dam, dur, mark, chance)
+		return ([[You fire a shot for %d%% damage that attempts to pin %s your target to the ground for %d turns, as well as giving your next Steady Shot or Shoot 100%% increased chance to critically hit and mark (regardless of whether the pin succeeds) %s.
+		This shot has a %d%% chance to mark the target %s.]]):
+		tformat(dam, Desc.vs"ap", dur, Desc.vs(), chance, Desc.vs())
 	end,
 }
 
@@ -318,10 +315,9 @@ newTalent{
 		local dur = t.getDuration(self,t)
 		local speed = t.getSpeedPenalty(self,t)*100
 		local chance = t.getChance(self,t)
-		return ([[Fires a shot that explodes into a radius %d ball of razor sharp fragments on impact, dealing %d%% weapon damage and leaving targets crippled for %d turns, reducing their attack, spell and mind speed by %d%%.
-		Each target struck has a %d%% chance to be marked.
-		The status chance increases with your Accuracy.]])
-		:tformat(rad, dam, dur, speed, chance)
+		return ([[Fires a shot that explodes into a radius %d ball of razor sharp fragments on impact, dealing %d%% weapon damage and leaving targets crippled for %d turns %s, reducing their attack, spell and mind speed by %d%%.
+		Each target struck has a %d%% chance to be marked %s.]])
+		:tformat(rad, dam, dur, Desc.vs"ap", speed, chance, Desc.vs())
 	end,
 }
 
@@ -406,10 +402,9 @@ newTalent{
 		local dam = t.getDamage(self,t)*100
 		local dur = t.getDuration(self,t)
 		local chance = t.getChance(self,t)
-		return ([[Fires a wave of projectiles in a radius %d cone, dealing %d%% weapon damage. All targets struck by this will be knocked back to the maximum range of the cone and stunned for %d turns.
-		Each target struck has a %d%% chance to be marked.
-		The chance to knockback and stun increases with your Accuracy.]])
-		:tformat(rad, dam, dur, chance)
+		return ([[Fires a wave of projectiles in a radius %d cone, dealing %d%% weapon damage. All targets struck by this will be knocked back to the maximum range of the cone and stunned for %d turns. %s
+		Each target struck has a %d%% chance to be marked %s.]])
+		:tformat(rad, dam, dur, Desc.vs"ap", chance, Desc.vs())
 	end,
 }
 
@@ -654,10 +649,10 @@ newTalent{
 	info = function(self, t)
 		local dam = t.getDamage(self,t)*100
 		local dur = t.getDuration(self,t)
-		return ([[You fire a disabling shot at a target's throat (or equivalent), dealing %d%% weapon damage and silencing them for %d turns.
-If the target is marked, you consume the mark to fire two secondary shots at their arms and legs (or other appendages) dealing %d%% damage, reducing their movement speed by 50%% and disarming them for the duration.
-The status chance increases with your Accuracy.]]):
-		tformat(dam, dur, dam*0.25)
+		return ([[You fire a disabling shot at a target's throat (or equivalent), dealing %d%% weapon damage and silencing them for %d turns %s.
+If the target is marked, you consume the mark to fire two secondary shots at their arms and legs (or other appendages) dealing %d%% damage, reducing their movement speed by 50%% %s and disarming them for the duration %s.
+]]):
+		tformat(dam, dur, Desc.vs"am", dam*0.25, Desc.vs"ap", Desc.vs"ap")
 	end,
 }
 
@@ -794,8 +789,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You fire a pinning shot, doing %d%% damage and pinning your target to the ground for %d turns.
-		The pinning chance increases with your Dexterity.]])
+		return ([[You fire a pinning shot, doing %d%% damage and pinning your target to the ground for %d turns.]])
 		:tformat(self:combatTalentWeaponDamage(t, 1, 1.4) * 100,
 		t.getDur(self, t))
 	end,
diff --git a/game/modules/tome/data/talents/techniques/assassination.lua b/game/modules/tome/data/talents/techniques/assassination.lua
index 6ea844316f4a477fa36f4fc263da587b89b719c1..5fe7a5c453db84ae96edaf573b3763de6067ba2c 100644
--- a/game/modules/tome/data/talents/techniques/assassination.lua
+++ b/game/modules/tome/data/talents/techniques/assassination.lua
@@ -30,7 +30,6 @@ newTalent{
 	stamina = 24,
 	require = techs_dex_req_high1,
 	getDamage = function (self, t) return self:combatTalentWeaponDamage(t, 1.0, 1.5) end,
-	getPercent = function(self, t) return self:combatTalentLimit(t, 0.3, 0.1, 0.25) end,
 	target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end,
 	range = 1,
 	requires_target = true,
@@ -78,11 +77,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		dam = t.getDamage(self,t)*100
-		perc = t.getPercent(self,t)*100
-		return ([[Attempt to finish off a wounded enemy, striking them with both weapons for %d%% increased by 50%% if their life is below 30%%.  A target brought below 20%% of its maximum life must make a physical save against your Accuracy or be instantly slain.
+		local dam = t.getDamage(self,t)*100
+		return ([[Attempt to finish off a wounded enemy, striking them with both weapons for %d%% increased by 50%% if their life is below 30%%.  A target brought below 20%% of its maximum life may be instantly slain %s.
 		You may take advantage of finishing your foe this way to activate stealth (if known).]]):
-		tformat(dam, perc)
+		tformat(dam, Desc.vs"ap")
 	end,
 }
 
@@ -106,9 +104,8 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		local duration = t.getDuration(self,t)
 		return ([[When you exit stealth, you reveal yourself dramatically, intimidating foes around you. 
-		All foes within radius %d that witness you leaving stealth will be stricken with terror, which randomly inflicts stun, slow (40%% power), or confusion (50%% power) for %d turns.
-		The chance to terrorize improves with your combat accuracy.]])
-		:tformat(radius, duration)
+		All foes within radius %d that witness you leaving stealth will be stricken with terror, which randomly inflicts stun, slow (40%% power), or confusion (50%% power) for %d turns %s.]])
+		:tformat(radius, duration, Desc.vs"am")
 	end,
 }
 
@@ -146,10 +143,10 @@ newTalent{
 		local damage = t.getDamage(self, t)*100
 		local dur = t.getDuration(self,t)
 		local sdur = math.ceil(t.getDuration(self,t)/2)
-		return ([[When attacking from stealth, you slip a garrote over the target’s neck (or other vulnerable part).  This strangles for %d turns and silences for %d turns.  Strangled targets are pinned and suffer an automatic unarmed attack for %d%% damage each turn. 
-		Your chance to apply the garrote increases with your Accuracy and you must stay adjacent to your target to maintain it.
+		return ([[When attacking from stealth, you slip a garrote over the target's neck (or other vulnerable part) %s.  This strangles for %d turns and silences for %d turns.  Strangled targets are pinned and suffer an automatic unarmed attack for %d%% damage each turn.
+		You must stay adjacent to your target to maintain the garrote.
 		This talent has a cooldown.]])
-		:tformat(dur, sdur, damage)
+		:tformat(Desc.vs"ap", dur, sdur, damage)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/battle-tactics.lua b/game/modules/tome/data/talents/techniques/battle-tactics.lua
index 3c80ee93fc99e50299687884fafdc0e7270f6bf6..e7ce409bee7c1d56b3882638340ade48042054fa 100644
--- a/game/modules/tome/data/talents/techniques/battle-tactics.lua
+++ b/game/modules/tome/data/talents/techniques/battle-tactics.lua
@@ -92,8 +92,8 @@ newTalent{
 	info = function(self, t)
 		local heal = t.healloss(self,t)
 		return ([[Lashes at the target, doing %d%% weapon damage.
-		If the attack hits, the target will bleed for %d%% weapon damage over 7 turns, and all healing will be reduced by %d%%.]]):
-		tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.7), 100 * self:combatTalentWeaponDamage(t, 2, 3.2), heal)
+		If the attack hits, the target will bleed %s for %d%% weapon damage over 7 turns, and all healing will be reduced by %d%%.]]):
+		tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.7), Desc.vs"ap", 100 * self:combatTalentWeaponDamage(t, 2, 3.2), heal)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/bloodthirst.lua b/game/modules/tome/data/talents/techniques/bloodthirst.lua
index f7dfac02b6100061130ebb21107b65ba56586bf5..87fd61e6c54d77d45363c8b51b1c9cacea28848c 100644
--- a/game/modules/tome/data/talents/techniques/bloodthirst.lua
+++ b/game/modules/tome/data/talents/techniques/bloodthirst.lua
@@ -44,10 +44,9 @@ newTalent{
 		self:talentTemporaryValue(p, "combat_physcrit", t.getCrit(self, t))
 	end,
 	info = function(self, t)
-		return ([[Your mighty blows inspire utter terror on your foes. Any melee strike you do that deals more than %d%% of the target's total life puts them in a mortal terror, dazing them for 5 turns.
-		Your critical strike chance also increase by %d%%.
-		The daze chance increase with your Physical Power.]]):
-		tformat(t.threshold(self, t), t.getCrit(self, t))
+		return ([[Your mighty blows inspire utter terror on your foes. Any melee strike you do that deals more than %d%% of the target's total life puts them in a mortal terror, dazing %s them for 5 turns.
+		Your critical strike chance also increase by %d%%.]]):
+		tformat(t.threshold(self, t), Desc.vs"pp", t.getCrit(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/buckler-training.lua b/game/modules/tome/data/talents/techniques/buckler-training.lua
index f6e3f4f04574241b832a8e8aa6fbd7641fdbffc1..65338f96d20d6a6bb0fae341003c935eb7c999a6 100644
--- a/game/modules/tome/data/talents/techniques/buckler-training.lua
+++ b/game/modules/tome/data/talents/techniques/buckler-training.lua
@@ -164,8 +164,8 @@ newTalent {
 		local shieldMult = t.getShieldMult(self, t) * 100
 		local tiles = t.getDist(self, t)
 		local slingMult = t.getSlingMult(self, t) * 100
-		return ([[Bash an enemy in melee range with your shield (twice for talent level 5 or more), doing %d%% damage and knocking them back %d squares. You may then follow with a deadly short-range sling attack, dealing %d%% damage. The shield bash will use Dexterity instead of Strength for the shield's bonus damage.]])
-		:tformat(shieldMult, tiles, slingMult)
+		return ([[Bash an enemy in melee range with your shield (twice for talent level 5 or more), doing %d%% damage and knocking them back %d squares %s. You may then follow with a deadly short-range sling attack, dealing %d%% damage. The shield bash will use Dexterity instead of Strength for the shield's bonus damage.]])
+		:tformat(shieldMult, tiles, Desc.vs(), slingMult)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/combat-techniques.lua b/game/modules/tome/data/talents/techniques/combat-techniques.lua
index d26fc9fb46cf4409b63c6682ab483275bca38da8..598a05a1b3a3489e40ea45856fb544701795ae0b 100644
--- a/game/modules/tome/data/talents/techniques/combat-techniques.lua
+++ b/game/modules/tome/data/talents/techniques/combat-techniques.lua
@@ -85,8 +85,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Rush toward a target enemy with incredible speed and perform a melee attack for 120%% weapon damage that can daze the target for 3 turns if it hits.
-		You must rush from at least 2 tiles away.]]):tformat()
+		return ([[Rush toward a target enemy with incredible speed and perform a melee attack for 120%% weapon damage that can daze %s the target for 3 turns if it hits.
+		You must rush from at least 2 tiles away.]]):tformat(Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/dualweapon.lua b/game/modules/tome/data/talents/techniques/dualweapon.lua
index 53af6e9d252f5e1a142d7e44e97e0ed6beeba2ae..1b50e95f66be8d6fdc291915e5bf1c4b15240303 100644
--- a/game/modules/tome/data/talents/techniques/dualweapon.lua
+++ b/game/modules/tome/data/talents/techniques/dualweapon.lua
@@ -203,9 +203,8 @@ newTalent{
 	info = function(self, t)
 		local dam = 100 * t.getDamage(self, t)
 		return ([[With a quick shift of your momentum, you execute a surprise unarmed strike in place of your normal offhand attack.
-		This allows you to attack with your mainhand weapon for %d%% damage and unarmed for %d%% damage.  If the unarmed attack hits, the target is confused (%d%% power) for %d turns.
-		The chance to confuse increases with your Accuracy.]])
-		:tformat(dam, dam*1.25, t.getConfusePower(self, t), t.getConfuseDuration(self, t))
+		This allows you to attack with your mainhand weapon for %d%% damage and unarmed for %d%% damage.  If the unarmed attack hits, the target is confused (%d%% power) for %d turns %s.]])
+		:tformat(dam, dam*1.25, t.getConfusePower(self, t), t.getConfuseDuration(self, t), Desc.vs"am")
 	end,
 }
 
@@ -255,9 +254,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Attack with your offhand weapon for %d%% damage. If the attack hits, the target is stunned for %d turns, and you hit it with your mainhand weapon doing %d%% damage.
-		The stun chance increases with your Accuracy.]])
-		:tformat(100 * self:combatTalentWeaponDamage(t, 0.7, 1.5), t.getStunDuration(self, t), 100 * self:combatTalentWeaponDamage(t, 0.7, 1.5))
+		return ([[Attack with your offhand weapon for %d%% damage. If the attack hits, the target is stunned for %d turns %s, and you hit it with your mainhand weapon doing %d%% damage.
+		]])
+		:tformat(100 * self:combatTalentWeaponDamage(t, 0.7, 1.5), t.getStunDuration(self, t), Desc.vs"ap", 100 * self:combatTalentWeaponDamage(t, 0.7, 1.5))
 	end,
 }
 
@@ -450,8 +449,8 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local range = self:getTalentRange(t)
-		return ([[You quickly move up to %d tiles to arrive adjacent to a target location you can see, leaping around or over anyone in your way.  During your movement, you attack all foes within one grid of your path with both weapons for %d%% weapon damage, causing those struck to bleed for 50%% of the damage dealt over 5 turns.]]):
-		tformat(range, damage*100)
+		return ([[You quickly move up to %d tiles to arrive adjacent to a target location you can see, leaping around or over anyone in your way.  During your movement, you attack all foes within one grid of your path with both weapons for %d%% weapon damage, causing those struck to bleed %s for 50%% of the damage dealt over 5 turns.]]):
+		tformat(range, damage*100, Desc.vs"pp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/duelist.lua b/game/modules/tome/data/talents/techniques/duelist.lua
index 923588efee4d887e9cca6dde65cb6c0b279916c3..f57baea9b3d5e95260b6fb9ee6ff49774fe66856 100644
--- a/game/modules/tome/data/talents/techniques/duelist.lua
+++ b/game/modules/tome/data/talents/techniques/duelist.lua
@@ -176,10 +176,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Make a cunning feint that tricks your target into swapping places with you.  While moving, you take the opportunity to trip them, pinning and dazing them for 2 turns.
+		return ([[Make a cunning feint that tricks your target into swapping places with you.  While moving, you take the opportunity to trip them, pinning and dazing them for 2 turns %s.
 		Switching places distracts your foes and allows you to improve your defenses:  For %d turns, Dual Weapon Mastery yields one extra parry each turn and you are %d%% less likely to miss your parry opportunities.
-		The chance to pin and to daze increases with your Accuracy]]):
-		tformat(t.getDuration(self, t), t.getParryEfficiency(self, t))
+		]]):
+		tformat(Desc.vs"ap", t.getDuration(self, t), t.getParryEfficiency(self, t))
 	end,
 }
 
@@ -229,9 +229,9 @@ newTalent{
 	info = function(self, t)
 		local dam = t.getDamage(self, t)
 		local dur = t.getDuration(self,t)
-		return ([[Exploiting a gap in your target's defenses, you make a lethal strike with your offhand weapon for %d%% damage that causes them to drop their weapon, disarming them for %d turns.
+		return ([[Exploiting a gap in your target's defenses, you make a lethal strike with your offhand weapon for %d%% damage that causes them to drop their weapon, disarming them for %d turns %s.
 		Tempo will reduce the cooldown of this talent by 1 turn each time it is triggered defensively.
-		The chance to disarm increases with your Accuracy.]]):
-		tformat(dam*100, dur)
+		]]):
+		tformat(dam*100, dur, Desc.vs"ap")
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/techniques/excellence.lua b/game/modules/tome/data/talents/techniques/excellence.lua
index bb5e891b28f83ae98f9a0581e6a54b005dbe2a41..1936307f80d12b676538d6df1c9e905145c05c98 100644
--- a/game/modules/tome/data/talents/techniques/excellence.lua
+++ b/game/modules/tome/data/talents/techniques/excellence.lua
@@ -213,8 +213,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You fire a shot at your target's throat, mouth, or equivalent body part, doing %d%% damage and silencing it for %d turns.
-		The silence chance increases with your Accuracy.]])
-		:tformat(self:combatTalentWeaponDamage(t, 0.9, 1.7) * 100, t.getDur(self,t))
+		return ([[You fire a shot at your target's throat, mouth, or equivalent body part, doing %d%% damage and silencing it for %d turns %s.]])
+		:tformat(self:combatTalentWeaponDamage(t, 0.9, 1.7) * 100, t.getDur(self,t), Desc.vs"am")
 	end,
 }
diff --git a/game/modules/tome/data/talents/techniques/field-control.lua b/game/modules/tome/data/talents/techniques/field-control.lua
index 153ba4075b8401809f61e7c642dbc34099a9756c..2a6056d4f39ac055148721e4377e5bcaf1dca970 100644
--- a/game/modules/tome/data/talents/techniques/field-control.lua
+++ b/game/modules/tome/data/talents/techniques/field-control.lua
@@ -108,10 +108,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[A mighty kick that pushes your target away %d grids.
-		If another creature is in the way, it will also be pushed away.
-		The Knockback chance increases with your Accuracy or your Physical Power, whichever is greater.]])
-		:tformat(t.getDist(self, t))
+		return ([[A mighty kick that pushes your target away %d grids %s.
+		If another creature is in the way, it will also be pushed away.]])
+		:tformat(t.getDist(self, t), Desc.vs(Desc.max("acc", "pp"), "ps"))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/finishing-moves.lua b/game/modules/tome/data/talents/techniques/finishing-moves.lua
index f50490ab527d128e5952335cc456e7fda7c150fc..b7cb476e7993704dedbbea69aa20c0a76641c4e4 100644
--- a/game/modules/tome/data/talents/techniques/finishing-moves.lua
+++ b/game/modules/tome/data/talents/techniques/finishing-moves.lua
@@ -65,10 +65,9 @@ newTalent{
 		local damage = t.getDamage(self, t) * 100
 		local stun = t.getDuration(self, t, 0)
 		local stunmax = t.getDuration(self, t, 5)
-		return ([[A finishing uppercut that deals %d%% damage, and attempts to stun your target for %d to %d turns, depending on the amount of combo points you've accumulated.
-		The stun chance will improve with your Physical Power.
+		return ([[A finishing uppercut that deals %d%% damage, and attempts to stun your target for %d to %d turns %s, depending on the amount of combo points you've accumulated.
 		Using this talent removes your combo points.]])
-		:tformat(damage, stun, stunmax)
+		:tformat(damage, stun, stunmax, Desc.vs"pp")
 	end,
 }
 
@@ -259,9 +258,9 @@ newTalent{
 		local maxDamage = damage * 2
 		local stamina = t.getStamina(self, t, 0)/self.max_stamina*100
 		local staminamax = t.getStamina(self, t, 5)/self.max_stamina*100
-		return ([[A vicious finishing strike that deals %d%% damage increased by 20%% per combo point you have up to a max of %d%%. If the target ends up with low enough life (<20%%), it might be instantly killed.
+		return ([[A vicious finishing strike that deals %d%% damage increased by 20%% per combo point you have up to a max of %d%%. If the target ends up with low enough life (<20%%), it might be instantly killed %s.
 		Killing a target with Haymaker will instantly restore %d%% to %d%% of your maximum stamina, depending on the amount of combo points you've accumulated.
 		Using this talent removes your combo points.]])
-		:tformat(damage, maxDamage, stamina, staminamax)
+		:tformat(damage, maxDamage, Desc.vs"pp", stamina, staminamax)
 	end,
 }
diff --git a/game/modules/tome/data/talents/techniques/grappling.lua b/game/modules/tome/data/talents/techniques/grappling.lua
index a7647755116874f5294a5fa281618a0a6932dbe6..658fe9185e91d9e9daf2ec36ae5c4cb6f84e3d58 100644
--- a/game/modules/tome/data/talents/techniques/grappling.lua
+++ b/game/modules/tome/data/talents/techniques/grappling.lua
@@ -101,10 +101,10 @@ newTalent{
 		local drain = t.getDrain(self, t)
 		local share = t.getSharePct(self, t)*100
 		local damage = t.getDamage(self, t)*100
-		return ([[Make a melee attack for %d%% damage and then attempt to grapple a target up to one size category larger than yourself for %d turns. A grappled opponent will be unable to move, take %d damage each turn, and %d%% of the damage you receive from any source will be redirected to them as physical damage.
+		return ([[Make a melee attack for %d%% damage and then attempt to grapple %s a target up to one size category larger than yourself for %d turns. A grappled opponent will be unable to move, take %d damage each turn, and %d%% of the damage you receive from any source will be redirected to them as physical damage.
 		Any movement from the target or you will break the grapple. Maintaining a grapple drains %d stamina per turn.
 		You may only grapple a single target at a time, and using any targeted unarmed talent on a target that you're not grappling will break the grapple.]])
-		:tformat(damage, duration, power, share, drain)
+		:tformat(damage, Desc.vs"pp", duration, power, share, drain)
 	end,
 }
 
@@ -141,7 +141,7 @@ newTalent{
 		local reduction = t.getDamageReduction(self, t)
 		local slow = t.getSlow(self, t)
 
-		return ([[Enhances your grapples with additional effects. All additional effects will apply to every grapple with no additional save or resist check.
+		return ([[Enhances your grapples with additional effects. All additional effects will apply to every grapple with no additional save check.
 		#RED#Talent Level 1:  Reduces physical power by %d
 		Talent Level 3:  Silences
 		Talent Level 5:  Reduces global action speed by %d%%]])
@@ -239,9 +239,9 @@ newTalent{
 	info = function(self, t)
 		local takedown = t.getDamage(self, t)*100
 		local slam = t.getSlam(self, t)
-		return ([[Rushes forward and attempts to take the target to the ground, making a melee attack for %d%% damage then attempting to grapple them. If you're already grappling the target you'll instead slam them into the ground creating a radius 5 shockwave for %d physical damage and breaking your grapple.
+		return ([[Rushes forward and attempts to take the target to the ground, making a melee attack for %d%% damage then attempting to grapple them %s. If you're already grappling the target you'll instead slam them into the ground creating a radius 5 shockwave for %d physical damage and breaking your grapple.
 		The grapple effects and duration will be based off your grapple talent, if you have it, and the damage will scale with your Physical Power.]])
-		:tformat(damDesc(self, DamageType.PHYSICAL, (takedown)), damDesc(self, DamageType.PHYSICAL, (slam)))
+		:tformat(damDesc(self, DamageType.PHYSICAL, (takedown)), Desc.vs(), damDesc(self, DamageType.PHYSICAL, (slam)))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/marksmanship.lua b/game/modules/tome/data/talents/techniques/marksmanship.lua
index 31b21f3a1b15211bea312710c30ce6722c45ef53..5db32242738de20a7998c5356fb3622cbac95ca2 100644
--- a/game/modules/tome/data/talents/techniques/marksmanship.lua
+++ b/game/modules/tome/data/talents/techniques/marksmanship.lua
@@ -47,9 +47,9 @@ newTalent{
 		local reload = t.getReload(self,t)
 		local chance = t.getChance(self,t)
 		return ([[Increases weapon damage by %d%% and physical power by 30 when using bows or slings, as well as your reload rate by %d.
-		In addition, your Shoot has a %d%% chance to mark targets on hit.
+		In addition, your Shoot has a %d%% chance to mark targets on hit %s.
 The mark lasts for 5 turns, grants you visibility of the target (even through walls and other concealment), and causes them to become vulnerable to Headshot, Volley and Called Shots.]]):
-tformat(inc * 100, reload, chance)
+tformat(inc * 100, reload, chance, Desc.vs())
 	end,
 }
 
@@ -64,9 +64,9 @@ newTalent{
 	info = function(self, t)
 		local bleed = t.getBleed(self,t)*100
 		local sta = t.getStamina(self,t)
-		return ([[You take advantage of unwary foes (those at or above 90%% life). Against these targets, Shoot, Steady Shot and Headshot bleed targets for %d%% additional damage over 5 turns and have a 50%% increased chance to mark (if capable of marking).
+		return ([[You take advantage of unwary foes (those at or above 90%% life). Against these targets, Shoot, Steady Shot and Headshot bleed targets for %d%% additional damage over 5 turns %s and have a 50%% increased chance to mark (if capable of marking) %s.
 In addition, your Steady Shot, Shoot and Headshot now restore %0.1f stamina on hit.]])
-		:tformat(bleed, sta)
+		:tformat(bleed, Desc.vs"pp", Desc.vs(), sta)
 	end,
 }
 
@@ -113,9 +113,9 @@ newTalent{
 		local rad = self:getTalentRadius(t)
 		local dur = t.getDuration(self,t)
 		local def = t.getDefensePenalty(self,t)
-		return ([[Fire a shot at the target tile that blinds enemies for %d turns, marks them for 2 turns and illuminates the area within radius %d for %d turns. Enemies within the illuminated area lose %d defence and stealth power and cannot benefit from concealment.
-		The status chance increases with your Accuracy, and the defense reduction with your Dexterity.]])
-		:tformat(blind, rad, dur, def)
+		return ([[Fire a shot at the target tile that blinds enemies for %d turns %s, marks them for 2 turns and illuminates the area within radius %d for %d turns. Enemies within the illuminated area lose %d defence and stealth power and cannot benefit from concealment.
+		The defense reduction increases with your Dexterity.]])
+		:tformat(blind, Desc.vs"ap", rad, dur, def)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/pugilism.lua b/game/modules/tome/data/talents/techniques/pugilism.lua
index fe6e245d2be46e8fa975a7412496020a24e25a1b..42d0dc9eba6a41c1e6cb69b37e60e56db3e3b3f2 100644
--- a/game/modules/tome/data/talents/techniques/pugilism.lua
+++ b/game/modules/tome/data/talents/techniques/pugilism.lua
@@ -314,9 +314,9 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t) * 100
-		return ([[Deliver a devastating axe kick dealing %d%% damage. If the blow connects your target is brain damaged, causing all talents to fail for %d turns and earning 2 combo points.
+		return ([[Deliver a devastating axe kick dealing %d%% damage. If the blow connects your target is brain damaged, causing all talents to fail for %d turns %s and earning 2 combo points.
 		This effect cannot be saved against, though it can be dodged and checks confusion immunity.]])
-		:tformat(damage, t.getDuration(self, t))
+		:tformat(damage, t.getDuration(self, t), Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/sling.lua b/game/modules/tome/data/talents/techniques/sling.lua
index a013c24a941a4a1eb559badc41b5972e6c18bbcf..b7aa528f676ac00243976b63e386b1449f20f571 100644
--- a/game/modules/tome/data/talents/techniques/sling.lua
+++ b/game/modules/tome/data/talents/techniques/sling.lua
@@ -69,9 +69,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You fire a shot into your target's eyes, blinding it for %d turns and doing %d%% damage.
-		The blind chance increases with your Accuracy.]])
-		:tformat(t.getBlindDur(self, t),	100 * self:combatTalentWeaponDamage(t, 1, 1.5))
+		return ([[You fire a shot into your target's eyes, blinding it for %d turns %s and doing %d%% damage.]])
+		:tformat(t.getBlindDur(self, t), Desc.vs"ap", 100 * self:combatTalentWeaponDamage(t, 1, 1.5))
 	end,
 }
 
@@ -105,8 +104,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You fire a mighty shot at your target, doing %d%% damage and knocking it back.
-		The knockback chance increases with your Accuracy.]]):tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.5))
+		return ([[You fire a mighty shot at your target, doing %d%% damage and knocking it back %s.]]):tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.5), Desc.vs"ap")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/sniper.lua b/game/modules/tome/data/talents/techniques/sniper.lua
index bffe94456d67802fe94e0369ab470566aa23b400..56d8a26ef1a940584566a46d5cd5f77da86d0bcb 100644
--- a/game/modules/tome/data/talents/techniques/sniper.lua
+++ b/game/modules/tome/data/talents/techniques/sniper.lua
@@ -143,10 +143,10 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		local sight = t.getSightLoss(self,t)
 		local cooldown = t.getCooldownReduction(self,t)
-		return ([[Fire an arrow tipped with a smoke bomb inflicting %d%% damage and creating a radius %d cloud of thick, disorientating smoke. Those caught within will have their vision range reduced by %d for 5 turns.
+		return ([[Fire an arrow tipped with a smoke bomb inflicting %d%% damage and creating a radius %d cloud of thick, disorientating smoke. Those caught within will have their vision range reduced by %d for 5 turns %s.
 The distraction caused by this effect reduces the cooldown of your Concealment by %d turns. If the cooldown is reduced to 0, you instantly activate Concealment regardless of whether foes are too close.
-The chance for the smoke bomb to affect your targets increases with your Accuracy. This requires a bow to use.]]):
-		tformat(dam, radius, sight, cooldown)
+This requires a bow to use.]]):
+		tformat(dam, radius, sight, Desc.vs"ap", cooldown)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/strength-of-the-berserker.lua b/game/modules/tome/data/talents/techniques/strength-of-the-berserker.lua
index e4978ff3b964185dd0e15dc4cb678b54e5b5f5e4..c129c3c273a14ba13da06eaff8f56c2b1e313ad2 100644
--- a/game/modules/tome/data/talents/techniques/strength-of-the-berserker.lua
+++ b/game/modules/tome/data/talents/techniques/strength-of-the-berserker.lua
@@ -52,8 +52,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Shout your warcry in a frontal cone of radius %d. Any targets caught inside will be confused (50%% confusion power) for %d turns.]]):
-		tformat(self:getTalentRadius(t), t.getDuration(self, t))
+		return ([[Shout your warcry in a frontal cone of radius %d. Any targets caught inside will be confused (50%% confusion power) %s for %d turns.]]):
+		tformat(self:getTalentRadius(t), Desc.vs"pm", t.getDuration(self, t))
 	end,
 }
 
@@ -198,10 +198,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target's armour and saves are reduced by %d for %d turns.
-		Also if the target is protected by any temporary magical or psionic damage absorbing shields there is %d%% chance to shatter a random shield.
-		Armor reduction chance increases with your Physical Power.]])
-		:tformat(100 * self:combatTalentWeaponDamage(t, 0.8, 1.5), t.getArmorReduc(self, t), t.getDuration(self, t), t.getShatter(self, t))
+		return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target's armour and saves are reduced by %d for %d turns %s.
+		Also if the target is protected by any temporary magical or psionic damage absorbing shields there is %d%% chance to shatter a random shield %s.]])
+		:tformat(100 * self:combatTalentWeaponDamage(t, 0.8, 1.5), t.getArmorReduc(self, t), t.getDuration(self, t), Desc.vs"pp", t.getShatter(self, t), Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/superiority.lua b/game/modules/tome/data/talents/techniques/superiority.lua
index 84318c48803268025f8a5dbb02d3164a7859e323..34b78719641a1b4ccd2c440275f386429a270954 100644
--- a/game/modules/tome/data/talents/techniques/superiority.lua
+++ b/game/modules/tome/data/talents/techniques/superiority.lua
@@ -65,9 +65,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Take an offensive stance. As you attack your foes, you knock your target and foes adjacent to them in a frontal arc back (up to %d grids).
+		return ([[Take an offensive stance. As you attack your foes, you knock %s your target and foes adjacent to them in a frontal arc back (up to %d grids).
 		This consumes stamina rapidly (-1 stamina/turn).]]):
-		tformat(t.range(self, t))
+		tformat(Desc.vs"ap", t.range(self, t))
 	end,
 }
 
@@ -102,7 +102,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Call all foes in a radius of %d around you into battle, getting them into melee range in an instant.]]):tformat(t.radius(self,t))
+		return ([[Call all foes in a radius of %d around you into battle, getting them into melee range in an instant %s.]]):tformat(t.radius(self,t), Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/throwing-knives.lua b/game/modules/tome/data/talents/techniques/throwing-knives.lua
index ba33d8e373f13397d15164402ed8ce8aab4bd7f5..b9bc1adcdb1de3f7169132922799fffa5bf6bd38 100644
--- a/game/modules/tome/data/talents/techniques/throwing-knives.lua
+++ b/game/modules/tome/data/talents/techniques/throwing-knives.lua
@@ -290,8 +290,8 @@ newTalent{
 		local power = t.getCritPower(self,t)
 		local chance = t.getChance(self,t)
 		return ([[You are able to target your throwing knives with pinpoint accuracy, increasing their critical strike chance by %d%% and critical strike damage by %d%%. 
-In addition, your critical strikes with throwing knives have a %d%% chance to randomly disable your target, possibly disarming, silencing or pinning them for 2 turns.]])
-		:tformat(crit, power, chance)
+In addition, your critical strikes with throwing knives have a %d%% chance to randomly disable your target, possibly disarming, silencing or pinning them for 2 turns. %s]])
+		:tformat(crit, power, chance, Desc.vs"ap")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/thuggery.lua b/game/modules/tome/data/talents/techniques/thuggery.lua
index 42770426c2204217e20dbde35fe61918277d1475..487cb296d56f88f34269ee7f5c70e9885aecf2a8 100644
--- a/game/modules/tome/data/talents/techniques/thuggery.lua
+++ b/game/modules/tome/data/talents/techniques/thuggery.lua
@@ -72,10 +72,10 @@ newTalent{
 		local dam = damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t))
 		local duration = t.getDuration(self, t)
 		return ([[You smack your forehead against your enemy's head (or whatever sensitive part you can find), causing %0.1f Physical damage.
-		If the attack hits, the target is confused (%d%% effect) for %d turns.
+		If the attack hits, the target is confused (%d%% effect) for %d turns %s.
 		Damage done increases with the quality of your headgear, your Strength, and your physical damage bonuses.
-		Confusion power increases with your Dexterity, and chance increases with Accuracy.]]):
-		tformat(dam, t.getConfusion(self, t), duration)
+		Confusion power increases with your Dexterity.]]):
+		tformat(dam, t.getConfusion(self, t), duration, Desc.vs"am")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/warcries.lua b/game/modules/tome/data/talents/techniques/warcries.lua
index 848ec200bc5136f457832d7cb483905565394c6b..b8144d1bc9aaad064c0d520b15b1bb47272f2941 100644
--- a/game/modules/tome/data/talents/techniques/warcries.lua
+++ b/game/modules/tome/data/talents/techniques/warcries.lua
@@ -126,9 +126,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Your battle cry shatters the will of your foes within a radius of %d, lowering their Defense by %d for 7 turns, making them easier to hit.
-		All evasion and concealment bonuses are also disabled.
-		The chance to hit increases with your Physical Power.]]):
-		tformat(self:getTalentRadius(t), 7 * self:getTalentLevel(t))
+		return ([[Your battle cry shatters the will of your foes within a radius of %d, lowering their Defense by %d for 7 turns %s, making them easier to hit.
+		All evasion and concealment bonuses are also disabled.]]):
+		tformat(self:getTalentRadius(t), 7 * self:getTalentLevel(t), Desc.vs"pm")
 	end,
 }
diff --git a/game/modules/tome/data/talents/techniques/weaponshield.lua b/game/modules/tome/data/talents/techniques/weaponshield.lua
index 4e5919275ec2ecdcce6c69e210d403e851f76ee9..fe95f60bbb01de731ac9cb313863303a452994e0 100644
--- a/game/modules/tome/data/talents/techniques/weaponshield.lua
+++ b/game/modules/tome/data/talents/techniques/weaponshield.lua
@@ -62,11 +62,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hits the target with two shield strikes, doing %d%% and %d%% shield damage. If it hits a second time, it stuns the target for %d turns.
-		The stun chance increases with your Accuracy and your Strength.]])
+		return ([[Hits the target with two shield strikes, doing %d%% and %d%% shield damage. If it hits a second time, it stuns the target for %d turns %s.]])
 		:tformat(100 * self:combatTalentWeaponDamage(t, 1, 1.7, self:getTalentLevel(self.T_SHIELD_EXPERTISE)),
 		100 * self:combatTalentWeaponDamage(t, 1.2, 2.1, self:getTalentLevel(self.T_SHIELD_EXPERTISE)),
-		t.getStunDuration(self, t))
+		t.getStunDuration(self, t),
+		Desc.vs(_t"Accuracy(Str)", "ps"))
 	end,
 }
 
@@ -281,10 +281,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Smash your shield into the face of all adjacent foes dealing %d%% shield damage and knocking them back %d grids.
-		In addition, all creatures knocked back will also be dazed for %d turns.
+		return ([[Smash your shield into the face of all adjacent foes dealing %d%% shield damage and knocking them back %d grids %s.
+		In addition, all creatures knocked back will also be dazed for %d turns %s.
 		If known, activating this talent will refresh your Rush cooldown if the attack hits.
-		The distance increases with your talent level, and the Daze duration with your Strength.]]):tformat(t.getShieldDamage(self, t)*100, t.getDist(self, t), t.getDuration(self, t))
+		The distance increases with your talent level, and the Daze duration with your Strength.]]):tformat(t.getShieldDamage(self, t)*100, t.getDist(self, t), Desc.vs"ap", t.getDuration(self, t), Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/uber/const.lua b/game/modules/tome/data/talents/uber/const.lua
index 80f92f896822a6ffb6eb2e472a256d852abe125b..104a1ac81788a053f98bd2ec53fa2cbdb4d0b44a 100644
--- a/game/modules/tome/data/talents/uber/const.lua
+++ b/game/modules/tome/data/talents/uber/const.lua
@@ -69,9 +69,9 @@ uberTalent{
 		
 	end,
 	info = function(self, t)
-		return ([[When a single blow deals more than 15%% of your total life, a torrent of blood gushes from your body, creating a bloody tidal wave for 4 turns that deals %0.2f blight damage, heals you for 50%% of the damage done, and knocks foes back.
+		return ([[When a single blow deals more than 15%% of your total life, a torrent of blood gushes from your body, creating a bloody tidal wave for 4 turns that deals %0.2f blight damage, heals you for 50%% of the damage done, and knocks foes back %s.
 		The damage increases with your Constitution.]])
-		:tformat(100 + self:getCon() * 3)
+		:tformat(100 + self:getCon() * 3, Desc.vs"sp")
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/uber/dex.lua b/game/modules/tome/data/talents/uber/dex.lua
index a89e756de94b03469077f47969b35fb88d4dea19..0c7fec729fedc553cc57af632a4393cfa9e50c8b 100644
--- a/game/modules/tome/data/talents/uber/dex.lua
+++ b/game/modules/tome/data/talents/uber/dex.lua
@@ -276,7 +276,7 @@ uberTalent{
 	end,
 	info = function(self, t)
 		return ([[You fire a shot straight at your enemy's vital areas, wounding them terribly.
-		Enemies hit by this shot will take 450%% weapon damage and will be stunned and crippled (losing 50%% physical, magical and mental attack speeds) for five turns due to the devastating impact of the shot.
-		The stun and cripple chances increase with your Accuracy.]]):tformat()
+		Enemies hit by this shot will take 450%% weapon damage and will be stunned and crippled (losing 50%% physical, magical and mental attack speeds) for five turns due to the devastating impact of the shot. %s
+		]]):tformat(Desc.vs"ap")
 	end,
 }
diff --git a/game/modules/tome/data/talents/uber/str.lua b/game/modules/tome/data/talents/uber/str.lua
index f97dd16ebb34099748e68681b88282c7874f1b92..6814a66eda846d90c2efd97f20f3300a584624b0 100644
--- a/game/modules/tome/data/talents/uber/str.lua
+++ b/game/modules/tome/data/talents/uber/str.lua
@@ -73,9 +73,9 @@ uberTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You accurately jump to the target and deal 200%% weapon damage to all foes within radius 1 on impact as well as dazing them for 3 turns.
+		return ([[You accurately jump to the target and deal 200%% weapon damage to all foes within radius 1 on impact as well as dazing them for 3 turns %s.
 		When you jump you free yourself from any stun, daze and pinning effects.]])
-		:tformat()
+		:tformat(Desc.vs())
 	end,
 }
 
diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua
index 85b3c22fc217598275608b9f4695f248bef9fbf9..b5c32cd39d35ec84472c79df9f9b9cca75febf2d 100644
--- a/game/modules/tome/data/timed_effects/magical.lua
+++ b/game/modules/tome/data/timed_effects/magical.lua
@@ -2202,7 +2202,7 @@ newEffect{
 newEffect{
 	name = "SPELLSHOCKED",
 	desc = _t"Spellshocked",
-	long_desc = function(self, eff) return ("Overwhelming magic has temporarily interfered with all damage resistances, lowering them by %d%%."):tformat(eff.power) end,
+	long_desc = function(self, eff) return ("Overwhelming magic has temporarily interfered with all damage resistances, lowering them by %d%%. This is a special cross-tier effect, may be applied if the attacker's power is on higher tier (every 20 points counts as a tier) than your spell save in a save check."):tformat(eff.power) end,
 	type = "magical",
 	subtype = { ["cross tier"]=true },
 	status = "detrimental",
diff --git a/game/modules/tome/data/timed_effects/mental.lua b/game/modules/tome/data/timed_effects/mental.lua
index 881c04f8a5eeb0a4672afa581f3eb121d075a828..3eee04bdf6e48348cbf4586e9bbb51d96b7293ad 100644
--- a/game/modules/tome/data/timed_effects/mental.lua
+++ b/game/modules/tome/data/timed_effects/mental.lua
@@ -2036,7 +2036,7 @@ newEffect{
 newEffect{
 	name = "BRAINLOCKED",
 	desc = _t"Brainlocked",
-	long_desc = function(self, eff) return ("Renders a random talent unavailable. Talent cooldown is halved until the effect has worn off."):tformat() end,
+	long_desc = function(self, eff) return ("Renders a random talent unavailable. Talent cooldown is halved until the effect has worn off. This is a special cross-tier effect, may be applied if the attacker's power is on higher tier (every 20 points counts as a tier) than your mental save in a save check."):tformat() end,
 	type = "mental",
 	subtype = { ["cross tier"]=true },
 	status = "detrimental",
diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua
index 857c345c3d028868fdc552369bd3e03f6f475576..76792610a29cf9a541586b90536fe3b625a21164 100644
--- a/game/modules/tome/data/timed_effects/physical.lua
+++ b/game/modules/tome/data/timed_effects/physical.lua
@@ -1969,7 +1969,7 @@ newEffect{
 newEffect{
 	name = "OFFBALANCE",
 	desc = _t"Off-balance",
-	long_desc = function(self, eff) return (_t"Badly off balance. Global damage is reduced by 15%.") end,
+	long_desc = function(self, eff) return (_t"Badly off balance. Global damage is reduced by 15%. This is a special cross-tier effect, may be applied if the attacker's power is on higher tier (every 20 points counts as a tier) than your physical save in a save check.") end,
 	type = "physical",
 	subtype = { ["cross tier"]=true },
 	status = "detrimental",