diff --git a/game/engine/Object.lua b/game/engine/Object.lua
index 7a5f942eb102938b2332d2d142600d03b04c4f8e..1e2ae81b584694cb0225f8323b1bbbb9528454f6 100644
--- a/game/engine/Object.lua
+++ b/game/engine/Object.lua
@@ -16,6 +16,13 @@ end
 --- Resolves the object
 -- This will call the entities resolver and then add to the game entities list
 function _M:resolve(t)
+	if not t then
+		-- Handle ided if possible
+		if self.resolveIdentify then
+			self:resolveIdentify()
+		end
+	end
+
 	engine.Entity.resolve(self, t)
 
 	if not t then
diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua
index bf7a4a8e6ca5ace50bd359c32d795b7b7e08325c..f4f1d0eb2fc22531c3506e7c111411bd3d818b91 100644
--- a/game/engine/Zone.lua
+++ b/game/engine/Zone.lua
@@ -187,6 +187,7 @@ function _M:finishEntity(level, type, e, ego_chance)
 				newname = e.name .. ego.name
 			end
 			print("applying ego", ego.name, "to ", e.name, "::", newname)
+			ego.unided_name = nil
 			table.merge(e, ego, true)
 			e.name = newname
 			e.egoed = true
diff --git a/game/engine/interface/ObjectIdentify.lua b/game/engine/interface/ObjectIdentify.lua
new file mode 100644
index 0000000000000000000000000000000000000000..173905ba6e719455c9db0ec942d91234076c3f55
--- /dev/null
+++ b/game/engine/interface/ObjectIdentify.lua
@@ -0,0 +1,50 @@
+require "engine.class"
+
+--- Handles unidentified objects, and their identification
+module(..., package.seeall, class.make)
+
+function _M:init(t)
+	if t.identified ~= nil then
+		self.identified = t.identified
+	else
+		self.identified = false
+	end
+end
+
+--- Defines the default ided status
+function _M:resolveIdentify()
+	if not self.unided_name then
+		self.unided_name = self.name
+	end
+end
+
+--- Can this object be identified at all ?
+-- Defaults to true, you can overload it
+function _M:canIdentify()
+	return true
+end
+
+--- Is the object identified ?
+function _M:isIdentified()
+	-- Auto id by type ?
+	if game.object_known_types and game.object_known_types[self.type] and game.object_known_types[self.type][self.subtype] then
+		self.identified = game.object_known_types[self.type][self.subtype]
+	end
+
+	return self.identified
+end
+
+--- Identify the object
+function _M:identify(id)
+	self.identified = id
+	if self.id_by_type then
+		game.object_known_types = game.object_known_types or {}
+		game.object_known_types[self.type] = game.object_known_types[self.type] or {}
+		game.object_known_types[self.type][self.subtype] = id
+	end
+end
+
+--- Get the unided name
+function _M:getUnidentifiedName()
+	return self.unided_name
+end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index d2fd92178aa19b4e51707be9139ae890efc035d3..d350399c7b0e435578678d6671559a16aa8d8e19 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -217,7 +217,6 @@ function _M:display()
 					if game.level.map:checkEntity(lx, ly, engine.Map.TERRAIN, "block_sense") then return true end
 				end, function(map, lx, ly)
 					local ok = false
-					print(game.player:attr("detect_actor"), game.level.map(lx, ly, game.level.map.ACTOR), "::", lx, ly)
 					if game.player:attr("detect_actor") and game.level.map(lx, ly, game.level.map.ACTOR) then ok = true end
 					if game.player:attr("detect_object") and game.level.map(lx, ly, game.level.map.OBJECT) then ok = true end
 --					if game.player:attr("detect_trap") and game.level.map(lx, ly, game.level.map.ACTOR) then ok = true end
diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua
index bcc4d5e40e817db85f3216ae256dc68b36f39c08..6ad547040561bc050acbaf043d7637fa9c7c9535 100644
--- a/game/modules/tome/class/Object.lua
+++ b/game/modules/tome/class/Object.lua
@@ -1,16 +1,22 @@
 require "engine.class"
 require "engine.Object"
 require "engine.interface.ObjectActivable"
+require "engine.interface.ObjectIdentify"
 
 local Stats = require("engine.interface.ActorStats")
 local Talents = require("engine.interface.ActorTalents")
 local DamageType = require("engine.DamageType")
 
-module(..., package.seeall, class.inherit(engine.Object, engine.interface.ObjectActivable))
+module(..., package.seeall, class.inherit(
+	engine.Object,
+	engine.interface.ObjectActivable,
+	engine.interface.ObjectIdentify
+))
 
 function _M:init(t, no_default)
 	engine.Object.init(self, t, no_default)
 	engine.interface.ObjectActivable.init(self, t)
+	engine.interface.ObjectIdentify.init(self, t)
 end
 
 --- Can this object act at all
@@ -46,12 +52,32 @@ function _M:tooltip()
 	return self:getDesc()
 end
 
+--- Describes an attribute, to expand object name
+function _M:descAttribute(attr)
+	if attr == "MASTERY" then
+		local tms = {}
+		for ttn, i in pairs(self.wielder.talents_types_mastery) do
+			local tt = Talents.talents_types_def[ttn]
+			local cat = tt.type:gsub("/.*", "")
+			local name = cat:capitalize().." / "..tt.name:capitalize()
+			tms[#tms+1] = ("%0.2f %s"):format(i, name)
+		end
+		return table.concat(tms, ",")
+	elseif attr == "COMBAT" then
+	end
+end
+
 --- Gets the full name of the object
 function _M:getName()
 	local qty = 1
 	local name = self.name
+
+	if not self:isIdentified() and self:getUnidentifiedName() then name = self:getUnidentifiedName() end
+
 	-- To extend later
-	name = name:gsub("~", ""):gsub("#[1-9]#", ""):gsub("&", "a")
+	name = name:gsub("~", ""):gsub("&", "a"):gsub("#([^#]+)#", function(attr)
+		return self:descAttribute(attr)
+	end)
 	return name
 end
 
@@ -72,6 +98,10 @@ function _M:getDesc()
 		desc[#desc+1] = ("#67AD00#%0.2f Encumberance."):format(self.encumber)
 	end
 
+	-- Stop here if unided
+	if not self:isIdentified() then return table.concat(desc, "\n") end
+
+
 	if self.combat then
 		local dm = {}
 		for stat, i in pairs(self.combat.dammod or {}) do
diff --git a/game/modules/tome/data/general/objects/egos/amulets.lua b/game/modules/tome/data/general/objects/egos/amulets.lua
index 9cbcde650dd68abca624945d52c6ace89bf7b444..ee15f45f5ddaf5bb91c70915cebf87f3c8de24b0 100644
--- a/game/modules/tome/data/general/objects/egos/amulets.lua
+++ b/game/modules/tome/data/general/objects/egos/amulets.lua
@@ -20,7 +20,7 @@ newEntity{
 	},
 }
 newEntity{
-	name = " of mastery",
+	name = " of mastery (#MASTERY#)",
 	level_range = {1, 50},
 	rarity = 3,
 	cost = 2,
diff --git a/game/modules/tome/data/general/objects/jewelry.lua b/game/modules/tome/data/general/objects/jewelry.lua
index 37be932e93dd679c4e875e7ef2c15d8d0a0487c4..7ed46610a016a3c9c4b029b79c654f4c605f50f6 100644
--- a/game/modules/tome/data/general/objects/jewelry.lua
+++ b/game/modules/tome/data/general/objects/jewelry.lua
@@ -22,52 +22,62 @@ newEntity{
 
 newEntity{ base = "BASE_RING",
 	name = "copper ring", color = colors.UMBER,
+	unided_name = "copper ring",
 	level_range = {1, 10},
 	cost = 1,
 }
 newEntity{ base = "BASE_RING",
 	name = "steel ring", color = colors.SLATE,
+	unided_name = "steel ring",
 	level_range = {10, 20},
 	cost = 1,
 }
 newEntity{ base = "BASE_RING",
 	name = "gold ring", color = colors.YELLOW,
+	unided_name = "gold ring",
 	level_range = {20, 30},
 	cost = 1,
 }
 newEntity{ base = "BASE_RING",
 	name = "galvorn ring", color = {r=50, g=50, b=50},
+	unided_name = "galvorn ring",
 	level_range = {30, 40},
 	cost = 1,
 }
 newEntity{ base = "BASE_RING",
 	name = "mithril ring", color = colors.WHITE,
+	unided_name = "mithril ring",
 	level_range = {40, 50},
 	cost = 1,
 }
 
 newEntity{ base = "BASE_AMULET",
 	name = "copper amulet", color = colors.UMBER,
+	unided_name = "copper amulet",
 	level_range = {1, 10},
 	cost = 1,
 }
 newEntity{ base = "BASE_AMULET",
 	name = "steel amulet", color = colors.SLATE,
+	unided_name = "steel amulet",
 	level_range = {10, 20},
 	cost = 1,
 }
 newEntity{ base = "BASE_AMULET",
 	name = "gold amulet", color = colors.YELLOW,
+	unided_name = "gold amulet",
 	level_range = {20, 30},
 	cost = 1,
 }
 newEntity{ base = "BASE_AMULET",
 	name = "galvorn amulet", color = {r=50, g=50, b=50},
+	unided_name = "galvorn amulet",
 	level_range = {30, 40},
 	cost = 1,
 }
 newEntity{ base = "BASE_AMULET",
 	name = "mithril amulet", color = colors.WHITE,
+	unided_name = "mithril amulet",
 	level_range = {40, 50},
 	cost = 1,
 }
diff --git a/game/modules/tome/data/general/objects/potions.lua b/game/modules/tome/data/general/objects/potions.lua
index 254eaf90a29195d2675980df2242d563e59db7e6..df5b880c9490cfa9c42cc67a964f74419776a2e6 100644
--- a/game/modules/tome/data/general/objects/potions.lua
+++ b/game/modules/tome/data/general/objects/potions.lua
@@ -1,6 +1,7 @@
 newEntity{
 	define_as = "BASE_POTION",
 	type = "potion", subtype="potion",
+	unided_name = "potion", id_by_type = true,
 	display = "!", color=colors.WHITE, image="object/potion-0x0.png",
 	encumber = 0.2,
 	stacking = true,
diff --git a/game/modules/tome/data/general/objects/quest-artifacts.lua b/game/modules/tome/data/general/objects/quest-artifacts.lua
index 514d7ff8458ef05bb92a783b3e86371e5a185366..afd6f45bb4651559f6f9bcd8d4c6ecfb955baa14 100644
--- a/game/modules/tome/data/general/objects/quest-artifacts.lua
+++ b/game/modules/tome/data/general/objects/quest-artifacts.lua
@@ -4,6 +4,7 @@ newEntity{
 	unique = true, quest=true,
 	slot = "MAINHAND",
 	type = "weapon", subtype="staff",
+	unided_name = "dark runed staff",
 	name = "Staff of Absorption",
 	level_range = {30, 30},
 	display = "\\", color=colors.VIOLET,
diff --git a/game/modules/tome/data/general/objects/scrolls.lua b/game/modules/tome/data/general/objects/scrolls.lua
index fb20d000b547d2482f89f9713680cfd741561825..aed384c9c69c17c3739b1754a36f933c3fec082b 100644
--- a/game/modules/tome/data/general/objects/scrolls.lua
+++ b/game/modules/tome/data/general/objects/scrolls.lua
@@ -1,6 +1,7 @@
 newEntity{
 	define_as = "BASE_SCROLL",
 	type = "scroll", subtype="scroll",
+	unided_name = "potion",
 	display = "?", color=colors.WHITE, image="object/scroll-0x0.png",
 	encumber = 0.1,
 	stacking = true,
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index 7983052843e3dc57532297c0b0f407aa077a56c9..7dd82e0ee00c3edfd5f02d924cc766159511641c 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -4,6 +4,7 @@ newEntity{
 	slot = "MAINHAND",
 	type = "weapon", subtype="staff",
 	name = "Staff of Destruction",
+	unided_name = "ash staff",
 	level_range = {20, 25},
 	display = "\\", color=colors.VIOLET,
 	encumber = 6,
@@ -28,6 +29,7 @@ newEntity{
 	slot = "LITE",
 	type = "jewelry", subtype="lite",
 	name = "Phial of Galadriel",
+	unided_name = "glowing phial",
 	level_range = {1, 10},
 	display = "~", color=colors.YELLOW,
 	encumber = 1,
@@ -45,6 +47,7 @@ newEntity{
 	slot = "LITE",
 	type = "jewlery", subtype="lite",
 	name = "Arkenstone of Thrain",
+	unided_name = "great jewel",
 	level_range = {20, 30},
 	display = "~", color=colors.YELLOW,
 	encumber = 1,
@@ -61,6 +64,7 @@ newEntity{
 	unique = true,
 	type = "potion", subtype="potion",
 	name = "Ever Refilling Potion of Healing",
+	unided_name = "strange potion",
 	level_range = {35, 40},
 	display = '!', color=colors.VIOLET,
 	encumber = 0.4,
diff --git a/game/modules/tome/data/talents/spells/divination.lua b/game/modules/tome/data/talents/spells/divination.lua
index d88efd61c5e1d13b99c3180615326fa9cc8fb355..195e9b3f1436a5d63512357051ce268c9069bf90 100644
--- a/game/modules/tome/data/talents/spells/divination.lua
+++ b/game/modules/tome/data/talents/spells/divination.lua
@@ -32,9 +32,30 @@ newTalent{
 	require = spells_req2,
 	points = 5,
 	mana = 20,
-	cooldown = 20,
 	action = function(self, t)
 		local rad = math.floor(0 + (self:getTalentLevel(t) - 4))
+
+		if self:getTalentLevel(t) < 3 then
+			self:showInventory("Identify object", self:getInven(self.INVEN_INVEN), nil, function(o, item)
+				o:identify(true)
+			end)
+			return true
+		end
+
+		if self:getTalentLevel(t) >= 3 then
+			for i, o in ipairs(self:getInven("INVEN")) do
+				o:identify(true)
+			end
+		end
+
+		if self:getTalentLevel(t) >= 4 then
+			while true do
+				local o = game.level.map:getObject(self.x, self.y, idx)
+				if not o then break end
+				o:identify(true)
+			end
+		end
+
 		return true
 	end,
 	info = function(self, t)
diff --git a/game/modules/tome/data/zones/trollshaws/zone.lua b/game/modules/tome/data/zones/trollshaws/zone.lua
index 1e64bfae787e5929de86d8a8425b0b0c9d054bf0..77297d9281196d41778eda18b8aa2d22919b6946 100644
--- a/game/modules/tome/data/zones/trollshaws/zone.lua
+++ b/game/modules/tome/data/zones/trollshaws/zone.lua
@@ -27,10 +27,10 @@ return {
 		},
 		object = {
 			class = "engine.generator.object.Random",
-			nb_object = {4, 6},
-			filters = { {type="potion" }, {type="potion" }, {type="potion" }, {type="scroll" }, {}, {} }
---			nb_object = {400, 600},
---			filters = { {type="jewelry", subtype="amulet" }, }
+--			nb_object = {4, 6},
+			filters = { {type="potion" }, {type="potion" }, {type="potion" }, {type="scroll" }, {}, {} },
+			nb_object = {400, 600},
+--			filters = { {type="jewelry", subtype="amulet" }, },
 		},
 	},
 	levels =
diff --git a/ideas/spells.ods b/ideas/spells.ods
index 089b68acf359356577742b9661584516879e9727..8279b4933e879a4eb461636a55bfafe052a81904 100644
Binary files a/ideas/spells.ods and b/ideas/spells.ods differ