diff --git a/game/engines/default/engine/utils.lua b/game/engines/default/engine/utils.lua
index aa73293149be0677f888d17e5fb26c49ef3250cb..11434f1bedebe536c82f1483cfe7a06054d13f91 100644
--- a/game/engines/default/engine/utils.lua
+++ b/game/engines/default/engine/utils.lua
@@ -1210,6 +1210,48 @@ function string.fromTable(src, recurse, offset, prefix, suffix, sort, key_recurs
 	return prefix..table.concat(tt, offset)..suffix, tt
 end
 
+--- Returns the Levenshtein distance between the two given strings
+function string.levenshtein_distance(str1, str2)
+	local len1 = string.len(str1)
+	local len2 = string.len(str2)
+	local matrix = {}
+	local cost = 0
+	
+        -- quick cut-offs to save time
+	if (len1 == 0) then
+		return len2
+	elseif (len2 == 0) then
+		return len1
+	elseif (str1 == str2) then
+		return 0
+	end
+	
+        -- initialise the base matrix values
+	for i = 0, len1, 1 do
+		matrix[i] = {}
+		matrix[i][0] = i
+	end
+	for j = 0, len2, 1 do
+		matrix[0][j] = j
+	end
+	
+        -- actual Levenshtein algorithm
+	for i = 1, len1, 1 do
+		for j = 1, len2, 1 do
+			if (str1:byte(i) == str2:byte(j)) then
+				cost = 0
+			else
+				cost = 1
+			end
+			
+			matrix[i][j] = math.min(matrix[i-1][j] + 1, matrix[i][j-1] + 1, matrix[i-1][j-1] + cost)
+		end
+	end
+	
+        -- return the last value - this is the Levenshtein distance
+	return matrix[len1][len2]
+end
+
 -- Split a string by the given character(s)
 function string.split(str, char, keep_separator)
 	char = lpeg.P(char)
diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua
index 5f17b376978b83f3f4c2993d7713221a2c37d37c..e3f40ba78b2b96bcb8c62216dd3b2e1cb1413ae3 100644
--- a/game/modules/tome/data/birth/classes/mage.lua
+++ b/game/modules/tome/data/birth/classes/mage.lua
@@ -255,20 +255,22 @@ newBirthDescriptor{
 	power_source = {arcane=true},
 	stats = { mag=5, wil=3, cun=1, },
 	talents_types = {
-		["spell/conveyance"]={true, 0.3},
-		["spell/divination"]={true, 0.3},
-		["spell/necrotic-minions"]={true, 0.3},
-		["spell/advanced-necrotic-minions"]={false, 0.3},
-		["spell/shades"]={false, 0.3},
-		["spell/necrosis"]={true, 0.3},
-		["spell/nightfall"]={true, 0.3},
+		["spell/master-of-bones"]={true, 0.3},
+		["spell/master-of-flesh"]={true, 0.3},
+		["spell/master-necromancer"]={true, 0.3},
 		["spell/grave"]={true, 0.3},
+		["spell/glacial-waste"]={true, 0.3},
+		["spell/rime-wraith"]={true, 0.3},
+		["spell/nightfall"]={true, 0.3},
+		["spell/dreadmaster"]={true, 0.3},
+		["spell/age-of-dusk"]={true, 0.3},
+		["spell/death"]={true, 0.3},
 		["spell/animus"]={true, 0.3},
+		["spell/eradication"]={true, 0.3},
+		["spell/spectre"]={true, 0.3},
+		["spell/necrosis"]={true, 0.3},
 		["cunning/survival"]={true, 0.0},
 	},
-	unlockable_talents_types = {
-		["spell/ice"]={false, 0.2, "mage_cryomancer"},
-	},
 	birth_example_particles = {
 		"necrotic-aura",
 		function(actor)
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 9e2f4e22ecbf08f5aeb5d1c3040ba124a796adb5..4c4f721e9277c40b1cda352168c129b1f7e51d24 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -4281,3 +4281,15 @@ newDamageType{
 		return (realdam1 or 0) + (realdam2 or 0)
 	end,
 }
+
+-- Cold/Darkness damage
+newDamageType{
+	name = "frostdusk", type = "FROSTDUSK", text_color = "#BLUE#",
+	damdesc_split = { {DamageType.TEMPORAL, 0.5}, {DamageType.DARKNESS, 0.5} },
+	projector = function(src, x, y, type, dam, state)
+		state = initState(state)
+		useImplicitCrit(src, state)
+		DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.COLD, dam / 2, state)
+		DamageType:get(DamageType.DARKNESS).projector(src, x, y, DamageType.DARKNESS, dam / 2, state)
+	end,
+}
diff --git a/game/modules/tome/data/talents.lua b/game/modules/tome/data/talents.lua
index 6193069422a8d54ccd400cf7e5329ac43fe896ed..e6acabc27d26a186a041f88cb0cdf4f9e4cb8bba 100644
--- a/game/modules/tome/data/talents.lua
+++ b/game/modules/tome/data/talents.lua
@@ -93,8 +93,27 @@ damDesc = function(self, type, dam)
 
 	-- Increases damage
 	if self.inc_damage then
-		local inc = self:combatGetDamageIncrease(type)
-		dam = dam + (dam * inc / 100)
+		if _G.type(type) == "string" then
+			local dt = DamageType:get(type)
+			if dt.damdesc_split then
+				if _G.type(dt.damdesc_split) == "function" then
+					type = dt.damdesc_split(self, type, dam)
+				else
+					type = dt.damdesc_split
+				end
+			end
+		end
+
+		if _G.type(type) == "table" then
+			local basedam = dam
+			for _, ds in ipairs(type) do
+				local inc = self:combatGetDamageIncrease(ds[1])
+				dam = dam + (basedam * inc / 100) * ds[2]
+			end
+		else
+			local inc = self:combatGetDamageIncrease(type)
+			dam = dam + (dam * inc / 100)
+		end
 	end
 	return dam
 end