diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index b50bf1dddb5d752941f3200c2f19ef4c814333c5..996c837f33e6f44ae760be1c09b49b65c9493145 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -32,7 +32,6 @@ require "mod.class.interface.PartyDeath"
 local Map = require "engine.Map"
 local Dialog = require "engine.ui.Dialog"
 local ActorTalents = require "engine.interface.ActorTalents"
-local LevelupDialog = require "mod.dialogs.LevelupDialog"
 
 --- Defines the player for ToME
 -- It is a normal actor, with some redefined methods to handle user interaction.<br/>
@@ -1138,6 +1137,9 @@ function _M:playerCheckSustains()
 end
 
 function _M:playerLevelup(on_finish, on_birth)
+	package.loaded["mod.dialogs.LevelupDialog"] = nil
+	package.loaded["mod.dialogs.elements.TalentTrees"] = nil
+	local LevelupDialog = require "mod.dialogs.LevelupDialog"
 	local ds = LevelupDialog.new(self, on_finish, on_birth)
 	game:registerDialog(ds)
 end
diff --git a/game/modules/tome/class/uiset/Minimalist.lua b/game/modules/tome/class/uiset/Minimalist.lua
index 07e3c01ae3a22bb81a442f7296669303ecc45a13..b3acacb658eca46fd793b519741c9aa577af4d4b 100644
--- a/game/modules/tome/class/uiset/Minimalist.lua
+++ b/game/modules/tome/class/uiset/Minimalist.lua
@@ -1843,9 +1843,11 @@ function _M:setupMouse(mouse)
 
 		local str = tstring{}
 		for i, e in ipairs(sub_es) do
-			str:merge(e:tooltip():toTString())
-			if i < #sub_es then str:add(true, "---", true)
-			else str:add(true) end
+			if e.tooltip then
+				str:merge(e:tooltip():toTString())
+				if i < #sub_es then str:add(true, "---", true)
+				else str:add(true) end
+			end
 		end
 
 		local extra = {}
diff --git a/game/modules/tome/dialogs/LevelupDialog.lua b/game/modules/tome/dialogs/LevelupDialog.lua
index 69a092702d823be6133cfbde6feeb68a1f286df4..b69a9438032dabef831e0bbd863650ac9f081514 100644
--- a/game/modules/tome/dialogs/LevelupDialog.lua
+++ b/game/modules/tome/dialogs/LevelupDialog.lua
@@ -21,6 +21,7 @@ require "engine.class"
 require "mod.class.interface.TooltipsData"
 
 local Dialog = require "engine.ui.Dialog"
+local Button = require "engine.ui.Button"
 local Textzone = require "engine.ui.Textzone"
 local TextzoneList = require "engine.ui.TextzoneList"
 local TalentTrees = require "mod.dialogs.elements.TalentTrees"
@@ -427,7 +428,8 @@ function _M:generateList()
 	self.actor.__show_special_talents = self.actor.__show_special_talents or {}
 
 	-- Makes up the list
-	local tree = {}
+	local ctree = {}
+	local gtree = {}
 	self.talents_deps = {}
 	for i, tt in ipairs(self.actor.talents_types_def) do
 		if not tt.hide and not (self.actor.talents_types[tt.type] == nil) then
@@ -437,7 +439,7 @@ function _M:generateList()
 			local tshown = (self.actor.__hidden_talent_types[tt.type] == nil and ttknown) or (self.actor.__hidden_talent_types[tt.type] ~= nil and not self.actor.__hidden_talent_types[tt.type])
 			local node = {
 				name=function(item) return tstring{{"font", "bold"}, cat:capitalize().." / "..tt.name:capitalize() ..(" (%s)"):format((isgeneric and "generic" or "class")), {"font", "normal"}} end,
-				rawname=function(item) return cat:capitalize().." / "..tt.name:capitalize() ..(" (%s, mastery %.2f)"):format((isgeneric and "generic" or "class"), self.actor:getTalentTypeMastery(item.type)) end,
+				rawname=function(item) return cat:capitalize().." / "..tt.name:capitalize() ..(" (x%.2f)"):format(self.actor:getTalentTypeMastery(item.type)) end,
 				type=tt.type,
 				color=function(item) return ((self.actor:knowTalentType(item.type) ~= self.actor_dup:knowTalentType(item.type)) or ((self.actor.__increased_talent_types[item.type] or 0) ~= (self.actor_dup.__increased_talent_types[item.type] or 0))) and {255, 215, 0} or self.actor:knowTalentType(item.type) and {0,200,0} or {175,175,175} end,
 				shown = tshown,
@@ -446,7 +448,8 @@ function _M:generateList()
 				isgeneric = isgeneric and 0 or 1,
 				order_id = i,
 			}
-			tree[#tree+1] = node
+			if isgeneric then gtree[#gtree+1] = node
+			else ctree[#ctree+1] = node end
 
 			local list = node.nodes
 
@@ -462,9 +465,10 @@ function _M:generateList()
 					list[#list+1] = {
 						__id=t.id,
 						name=t.name:toTString(),
-						rawname=t.name..(isgeneric and " (generic talent)" or " (class talent)"),
+						rawname=t.name,
 						entity=t.display_entity,
 						talent=t.id,
+						isgeneric=isgeneric and 0 or 1,
 						_type=tt.type,
 						color=function(item)
 							if ((self.actor.talents[item.talent] or 0) ~= (self.actor_dup.talents[item.talent] or 0)) then return {255, 215, 0}
@@ -491,29 +495,25 @@ function _M:generateList()
 			end
 		end
 	end
-	table.sort(tree, function(a, b)
-		if a.isgeneric == b.isgeneric then
-			return a.order_id < b.order_id
-		else
-			return a.isgeneric < b.isgeneric
-		end
+	table.sort(ctree, function(a, b)
+		return a.order_id < b.order_id
 	end)
-	self.tree = tree
+	self.ctree = ctree
+	table.sort(gtree, function(a, b)
+		return a.order_id < b.order_id
+	end)
+	self.gtree = gtree
 
 	-- Makes up the stats list
-	local phys, mind = {}, {}
-	self.tree_stats = {
-		{shown=true, nodes=phys, name="Physical Stats", type_stat=true, desc=self.TOOLTIP_STRDEXCON},
-		{shown=true, nodes=mind, name="Mental Stats", type_stat=true, desc=TOOLTIP_MAGWILCUN}
-	}
+	local stats = {}
+	self.tree_stats = stats
 
 	for i, sid in ipairs{self.actor.STAT_STR, self.actor.STAT_DEX, self.actor.STAT_CON, self.actor.STAT_MAG, self.actor.STAT_WIL, self.actor.STAT_CUN } do
 		local s = self.actor.stats_def[sid]
 		local e = engine.Entity.new{image="stats/"..s.name:lower()..".png", is_stat=true}
 		e:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1)
 
-		local stats = (i <= 3) and phys or mind
-		stats[#stats+1] = {
+		stats[#stats+1] = {shown=true, nodes={{
 			name=s.name,
 			rawname=s.name,
 			entity=e,
@@ -537,7 +537,7 @@ function _M:generateList()
 					return tstring{{"color", 0x00, 0xFF, 0x00}, tostring(self.actor:getStat(sid))}
 				end
 			end,
-		}
+		}}}	
 	end
 end
 
@@ -552,12 +552,33 @@ Class talent points left: #00FF00#%d#LAST#
 Generic talent points left: #00FF00#%d#LAST#]]
 
 function _M:createDisplay()
-	self.c_tree = TalentTrees.new{
+	self.c_ctree = TalentTrees.new{
+		font = core.display.newFont("/data/font/DroidSans.ttf", 14),
 		tiles=game.uiset.hotkeys_display_icons,
-		tree=self.tree,
-		width=530, height=self.ih-10,
+		tree=self.ctree,
+		width=320, height=self.ih-50,
 		tooltip=function(item)
-			local x = self.display_x + self.uis[3].x - game.tooltip.max
+			local x = self.display_x + self.uis[5].x - game.tooltip.max
+			if self.display_x + self.w + game.tooltip.max <= game.w then x = self.display_x + self.w end
+			local ret = self:getTalentDesc(item), x, nil
+			if self.no_tooltip then
+				self.c_desc:erase()
+				self.c_desc:switchItem(ret, ret)
+			end
+			return ret
+		end,
+		on_use = function(item, inc) self:onUseTalent(item, inc) end,
+		on_expand = function(item) self.actor.__hidden_talent_types[item.type] = not item.shown end,
+		scrollbar = true, no_tooltip = self.no_tooltip,
+	}
+
+	self.c_gtree = TalentTrees.new{
+		font = core.display.newFont("/data/font/DroidSans.ttf", 14),
+		tiles=game.uiset.hotkeys_display_icons,
+		tree=self.gtree,
+		width=320, height=self.ih-50,
+		tooltip=function(item)
+			local x = self.display_x + self.uis[8].x - game.tooltip.max
 			if self.display_x + self.w + game.tooltip.max <= game.w then x = self.display_x + self.w end
 			local ret = self:getTalentDesc(item), x, nil
 			if self.no_tooltip then
@@ -572,12 +593,13 @@ function _M:createDisplay()
 	}
 
 	self.c_stat = TalentTrees.new{
+		font = core.display.newFont("/data/font/DroidSans.ttf", 14),
 		tiles=game.uiset.hotkeys_display_icons,
 		tree=self.tree_stats, no_cross = true,
-		width=200, height=210,
+		width=50, height=self.ih,
 		dont_select_top = true,
 		tooltip=function(item)
-			local x = self.display_x + self.uis[1].x + self.uis[1].ui.w
+			local x = self.display_x + self.uis[2].x + self.uis[2].ui.w
 			if self.display_x + self.w + game.tooltip.max <= game.w then x = self.display_x + self.w end
 			local ret = self:getStatDesc(item), x, nil
 			if self.no_tooltip then
@@ -595,26 +617,40 @@ function _M:createDisplay()
 		text=_points_left:format(self.actor.unused_stats, self.actor.unused_talents_types, self.actor.unused_talents, self.actor.unused_generics)
 	}
 
-	local vsep = Separator.new{dir="horizontal", size=self.ih - 20}
+	local vsep1 = Separator.new{dir="horizontal", size=self.ih - 20}
+	local vsep2 = Separator.new{dir="horizontal", size=self.ih - 20}
 	local hsep = Separator.new{dir="vertical", size=180}
 
+	self.b_stat = Button.new{text="Stats: "..self.actor.unused_stats, fct=function() end}
+	self.b_class = Button.new{text="Class points: "..self.actor.unused_talents, fct=function() end}
+	self.b_generic = Button.new{text="Generic points: "..self.actor.unused_generics, fct=function() end}
+	self.b_types = Button.new{text="Category points: "..self.actor.unused_talents_types, fct=function() end}
+
 	local ret = {
-		{left=0, top=0, ui=self.c_stat},
-		{left=self.c_stat, top=10, ui=vsep},
-		{left=vsep, top=0, ui=self.c_tree},
+		{left=-10, top=0, ui=self.b_stat},
+		{left=0, top=self.b_stat.h+10, ui=self.c_stat},
+
+		{left=self.c_stat, top=40, ui=vsep1},
+
+		{left=vsep1, top=0, ui=self.b_class},
+		{left=vsep1, top=self.b_class, ui=self.c_ctree},
+
+		{left=self.c_ctree, top=40, ui=vsep2},
+
+		{left=580, top=0, ui=self.b_generic},
+		{left=vsep2, top=self.b_generic, ui=self.c_gtree},
 
-		{left=10, top=210, ui=hsep},
-		{left=0, top=hsep, ui=self.c_points},
+		{left=330, top=0, ui=self.b_types},
 	}
 
 	if self.no_tooltip then
-		local vsep2 = Separator.new{dir="horizontal", size=self.ih - 20}
+		local vsep3 = Separator.new{dir="horizontal", size=self.ih - 20}
 		self.c_desc = TextzoneList.new{
 			width=self.iw - 200 - 530 - 40, height = self.ih,
 			scrollbar = true,
 		}
 		ret[#ret+1] = {right=0, top=0, ui=self.c_desc}
-		ret[#ret+1] = {right=self.c_desc.w, top=0, ui=vsep2}
+		ret[#ret+1] = {right=self.c_desc.w, top=0, ui=vsep3}
 	end
 
 	return ret
@@ -744,21 +780,31 @@ function _M:onUseTalent(item, inc)
 	if item.type then
 		self:learnType(item.type, inc)
 		item.shown = (self.actor.__hidden_talent_types[item.type] == nil and self.actor:knowTalentType(item.type)) or (self.actor.__hidden_talent_types[item.type] ~= nil and not self.actor.__hidden_talent_types[item.type])
-		self.c_tree:redrawAllItems()
+		local t = (item.isgeneric==0 and self.c_gtree or self.c_ctree)
+		t:redrawAllItems()
 	elseif item.talent then
 		self:learnTalent(item.talent, inc)
-		self.c_tree:redrawAllItems()
+		local t = (item.isgeneric==0 and self.c_gtree or self.c_ctree)
+		t:redrawAllItems()
 	elseif item.stat then
 		self:incStat(item.stat, inc and 1 or -1)
 		self.c_stat:redrawAllItems()
-		self.c_tree:redrawAllItems()
+		self.c_ctree:redrawAllItems()
+		self.c_gtree:redrawAllItems()
 	end
 
-	self.c_points.text = _points_left:format(self.actor.unused_stats, self.actor.unused_talents_types, self.actor.unused_talents, self.actor.unused_generics)
-	self.c_points:generate()
+	self.b_stat.text = "Stats: "..self.actor.unused_stats
+	self.b_stat:generate()
+	self.b_class.text = "Class points: "..self.actor.unused_talents
+	self.b_class:generate()
+	self.b_generic.text = "Generic points: "..self.actor.unused_generics
+	self.b_generic:generate()
+	self.b_types.text = "Category points: "..self.actor.unused_talents_types
+	self.b_types:generate()
 end
 
 function _M:updateTooltip()
-	self.c_tree:updateTooltip()
+	self.c_gtree:updateTooltip()
+	self.c_ctree:updateTooltip()
 	self.c_stat:updateTooltip()
 end