diff --git a/game/engines/default/engine/Actor.lua b/game/engines/default/engine/Actor.lua
index 77fa99951e06e313ab30715e75c59f514ec4a2b7..5b5f092f283e0aa5b1b65978456dfeb7dc33264f 100644
--- a/game/engines/default/engine/Actor.lua
+++ b/game/engines/default/engine/Actor.lua
@@ -510,3 +510,8 @@ end
 function _M:getEntityKind()
 	return "actor"
 end
+
+function _M:he_she() return string.he_she(self) end
+function _M:his_her() return string.his_her(self) end
+function _M:him_her() return string.him_her(self) end
+function _M:his_her_self() return string.his_her_self(self) end
diff --git a/game/engines/default/engine/utils.lua b/game/engines/default/engine/utils.lua
index 578a387908c001e107fcf57121e962fc9f62ca82..a03aea0dafaf7ced05dd7cf5f84e96a4afc4d7b1 100644
--- a/game/engines/default/engine/utils.lua
+++ b/game/engines/default/engine/utils.lua
@@ -586,6 +586,13 @@ function string.a_an(str)
 	else return "a "..str end
 end
 
+function string.he_she(actor)
+	if actor.female then return "she"
+	elseif actor.neuter then return "it"
+	else return "he"
+	end
+end
+
 function string.his_her(actor)
 	if actor.female then return "her"
 	elseif actor.neuter then return "it"
@@ -593,6 +600,13 @@ function string.his_her(actor)
 	end
 end
 
+function string.him_her(actor)
+	if actor.female then return "her"
+	elseif actor.neuter then return "it"
+	else return "him"
+	end
+end
+
 function string.his_her_self(actor)
 	if actor.female then return "herself"
 	elseif actor.neuter then return "itself"
diff --git a/game/modules/tome/class/interface/PartyLore.lua b/game/modules/tome/class/interface/PartyLore.lua
index 2852e7a4b3c7ce95642141dc10db1102b34283f0..21aadb85f4c5441ce3fd138cbafac803642ee7a0 100644
--- a/game/modules/tome/class/interface/PartyLore.lua
+++ b/game/modules/tome/class/interface/PartyLore.lua
@@ -20,6 +20,7 @@
 require "engine.class"
 local Dialog = require "engine.ui.Dialog"
 local LorePopup = require "mod.dialogs.LorePopup"
+local slt2 = require "slt2"
 
 module(..., package.seeall, class.make)
 
@@ -65,7 +66,14 @@ function _M:getLore(lore, silent)
 	self.lore_known = self.lore_known or {}
 	self.additional_lore = self.additional_lore or {}
 	if not silent then assert(self.lore_defs[lore] or self.additional_lore[lore], "bad lore id "..lore) end
-	return self.lore_defs[lore] or self.additional_lore[lore]
+	local l = table.clone(self.lore_defs[lore] or self.additional_lore[lore])
+
+	if l.template then
+		local tpl = slt2.loadstring(l.lore)
+		l.lore = slt2.render(tpl, {player=self:findMember{main=true}, self=self})
+	end
+
+	return l
 end
 
 function _M:additionalLore(id, name, category, lore)