diff --git a/game/engines/default/engine/class.lua b/game/engines/default/engine/class.lua
index 65c0cd01db68940613ac858d56043e247474b519..69c6b2e70839d3b5c85411438d4ccb732846b3ec 100644
--- a/game/engines/default/engine/class.lua
+++ b/game/engines/default/engine/class.lua
@@ -92,6 +92,8 @@ local skip_key = {init=true, _NAME=true, _M=true, _PACKAGE=true, new=true, _BASE
 -- @return function(c)
 function inherit(...)
 	local bases = {...}
+	local basenames = {}
+	for _, b in ipairs(bases) do if b._NAME then basenames[b._NAME] = true end end
 	return function(c)
 		c._BASES = bases
 		-- Recursive inheritance caching
@@ -172,13 +174,25 @@ function _M:importInterface(base)
 end
 
 function _M:getClassName()
-	return self.__CLASSNAME
+	return self.__CLASSNAME or self._NAME
 end
 
 function _M:getClass()
 	return getmetatable(self).__index
 end
 
+function _M:isClassName(name)
+	if self.__CLASSNAME == name then return true end
+	if self._NAME == name then return true end
+	if self._BASES then
+		for _, b in ipairs(self._BASES) do
+			if b._NAME == name then return true end
+			if b:isClassName(name) then return true end
+		end
+	end
+	return false
+end
+
 function _M:runInherited()
 	for _, f in ipairs(run_inherited) do
 		f()
diff --git a/game/engines/default/engine/ui/Base.lua b/game/engines/default/engine/ui/Base.lua
index b812facfd79ec44d490c994c6d175fcbe9da3c82..e8b11719cc856819cf97a8656c386102965cb48a 100644
--- a/game/engines/default/engine/ui/Base.lua
+++ b/game/engines/default/engine/ui/Base.lua
@@ -60,6 +60,16 @@ function _M:uiExists(ui)
 	return self.ui_conf[ui]
 end
 
+function _M:changeDefault(ui)
+	if not self:uiExists(ui) then return end
+	self.ui = ui
+	for name, c in pairs(package.loaded) do
+		if type(c) == "table" and c.isClassName and c:isClassName(self._NAME) then
+			c.ui = ui
+		end
+	end
+end
+
 function _M:inherited(base)
 	if base._NAME == "engine.ui.Base" then
 		self.font = base.font
diff --git a/game/engines/default/modules/boot/load.lua b/game/engines/default/modules/boot/load.lua
index 9c1a2285b6df4e70a67eea3cbe4d50934195a3c0..ec6eea32a745b7beeae7eedf956d6f725b9eec43 100644
--- a/game/engines/default/modules/boot/load.lua
+++ b/game/engines/default/modules/boot/load.lua
@@ -45,9 +45,6 @@ UIBase.font_mono_h = UIBase.font_mono:lineSkip()+2
 local n = core.noise.new(2)
 _2DNoise = n:makeTexture2D(64, 64)
 
-if config.settings.tome and config.settings.tome.ui_theme3 and UIBase:uiExists(config.settings.tome.ui_theme3) then
-	UIBase.ui = config.settings.tome.ui_theme3
-end
 UIBase:setTextShadow(0.6)
 
 -- Usefull keybinds
@@ -81,5 +78,8 @@ Birther:loadDefinition("/data/birth/descriptors.lua")
 core.game.setRealtime(8)
 
 class:triggerHook{"Boot:load"}
+if config.settings.tome and config.settings.tome.ui_theme3 then
+	UIBase:changeDefault(config.settings.tome.ui_theme3)
+end
 
 return {require "mod.class.Game" }
diff --git a/game/modules/tome/load.lua b/game/modules/tome/load.lua
index 7f5a9751b341fa9e410204e753fa6f0b4355d0e1..c032cf29082e62ec13a03fcd111666ef40d2717d 100644
--- a/game/modules/tome/load.lua
+++ b/game/modules/tome/load.lua
@@ -44,7 +44,7 @@ Map.faction_danger_check = function(self, e, max) return (not max and e.rank > 3
 Level.remove_old_entity_on_duplicate = true
 
 -- Dialog UI
-UIBase.ui = config.settings.tome.ui_theme3
+UIBase:changeDefault(config.settings.tome.ui_theme3)
 UIBase:setTextShadow(0.6)
 
 -- Dialogs fonts