diff --git a/game/engines/default/engine/Birther.lua b/game/engines/default/engine/Birther.lua
index 6205e6f13104d1e8fd825c935224323d7f58896e..c3bd715aa93d859066d69b2e62e2405b428c287e 100644
--- a/game/engines/default/engine/Birther.lua
+++ b/game/engines/default/engine/Birther.lua
@@ -363,6 +363,7 @@ function _M:apply()
 			self.actor.body = d.body
 			self.actor:initBody()
 		end
+		if self.applyingDescriptor then self:applyingDescriptor(i, d) end
 	end
 
 	-- Apply stats now to not be overridden by other things
diff --git a/game/modules/tome/class/GameState.lua b/game/modules/tome/class/GameState.lua
index c7fab1fa4d474ec55bd51bc45d555a1c077f5c21..1f5432faafe79685e3d059ed9bad1abc5f03841c 100644
--- a/game/modules/tome/class/GameState.lua
+++ b/game/modules/tome/class/GameState.lua
@@ -1376,6 +1376,7 @@ function _M:createRandomBoss(base, data)
 
 		-- Add talent categories
 		for tt, d in pairs(class.talents_types or {}) do b:learnTalentType(tt, true) b:setTalentTypeMastery(tt, (b:getTalentTypeMastery(tt) or 1) + d[2]) end
+		for tt, d in pairs(class.unlockable_talents_types or {}) do b:learnTalentType(tt, true) b:setTalentTypeMastery(tt, (b:getTalentTypeMastery(tt) or 1) + d[2]) end
 
 		-- Add starting equipment
 		for k, resolver in pairs(class.copy or {}) do
diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua
index 71e770f44ba1ebbbf044f0fa018c7a48b4a5e60c..35ac8d5d7af9a79ec50760102092a078373128ff 100644
--- a/game/modules/tome/data/birth/classes/mage.lua
+++ b/game/modules/tome/data/birth/classes/mage.lua
@@ -70,6 +70,12 @@ newBirthDescriptor{
 		["spell/aegis"]={true, 0.3},
 		["cunning/survival"]={false, -0.1},
 	},
+	unlockable_talents_types = {
+		["spell/wildfire"]={false, 0.3, "mage_pyromancer"},
+		["spell/ice"]={false, 0.3, "mage_cryomancer"},
+		["spell/stone"]={false, 0.3, "mage_geomancer"},
+		["spell/storm"]={false, 0.3, "mage_tempest"},
+	},
 	birth_example_particles = "arcane_power",
 	talents = {
 		[ActorTalents.T_ARCANE_POWER] = 1,
@@ -97,12 +103,6 @@ newBirthDescriptor{
 			{type="weapon", subtype="staff", name="elm staff", autoreq=true, ego_chance=-1000},
 			{type="armor", subtype="cloth", name="linen robe", autoreq=true, ego_chance=-1000},
 		},
-		resolvers.generic(function(self)
-			if profile.mod.allow_build.mage_pyromancer then self:learnTalentType("spell/wildfire", false) self:setTalentTypeMastery("spell/wildfire", 1.3) end
-			if profile.mod.allow_build.mage_cryomancer then self:learnTalentType("spell/ice", false) self:setTalentTypeMastery("spell/ice", 1.3) end
-			if profile.mod.allow_build.mage_geomancer then self:learnTalentType("spell/stone", false) self:setTalentTypeMastery("spell/stone", 1.3) end
-			if profile.mod.allow_build.mage_tempest then self:learnTalentType("spell/storm", false) self:setTalentTypeMastery("spell/storm", 1.3) end
-		end),
 	},
 	copy_add = {
 		life_rating = -4,
diff --git a/game/modules/tome/data/birth/classes/rogue.lua b/game/modules/tome/data/birth/classes/rogue.lua
index 283950bfa53cf2e72004272c30e24caea491ef4c..f7663e3089f8d3bfa58f8b62b59542b13258845f 100644
--- a/game/modules/tome/data/birth/classes/rogue.lua
+++ b/game/modules/tome/data/birth/classes/rogue.lua
@@ -67,17 +67,15 @@ newBirthDescriptor{
 		["cunning/lethality"]={true, 0.3},
 		["cunning/survival"]={true, 0.3},
 	},
+	unlockable_talents_types = {
+		["cunning/poisons"]={false, 0.3, "rogue_poisons"},
+	},
 	talents = {
 		[ActorTalents.T_STEALTH] = 1,
 		[ActorTalents.T_TRAP_MASTERY] = 1,
 		[ActorTalents.T_LETHALITY] = 1,
 		[ActorTalents.T_DUAL_STRIKE] = 1,
 	},
-	copy = {
-		resolvers.generic(function(self)
-			if profile.mod.allow_build.rogue_poisons then self:learnTalentType("cunning/poisons", false) self:setTalentTypeMastery("cunning/poisons", 1.3) end
-		end),
-	},
 }
 
 newBirthDescriptor{
diff --git a/game/modules/tome/dialogs/Birther.lua b/game/modules/tome/dialogs/Birther.lua
index 6201c998bdbfc2d790308086fffc8094b93af6fa..f5c0d465af397a79831c0a09c9dd151ddd706f0c 100644
--- a/game/modules/tome/dialogs/Birther.lua
+++ b/game/modules/tome/dialogs/Birther.lua
@@ -174,6 +174,23 @@ function _M:checkNew(fct)
 	end
 end
 
+function _M:applyingDescriptor(i, d)
+	if d.unlockable_talents_types then
+		for t, v in pairs(d.unlockable_talents_types) do
+			if profile.mod.allow_build[v[3]] then
+				local mastery
+				if type(v) == "table" then
+					v, mastery = v[1], v[2]
+				else
+					v, mastery = v, 0
+				end
+				self.actor:learnTalentType(t, v)
+				self.actor.talents_types_mastery[t] = (self.actor.talents_types_mastery[t] or 1) + mastery
+			end
+		end
+	end
+end
+
 function _M:atEnd(v)
 	if v == "created" and not self.ui_by_ui[self.c_ok].hidden then
 		self:checkNew(function()