diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua
index 786c80a8b80daf44587c87a948366f9b0116511d..4962e47b7391f252e0717321ac0f51a72b520577 100644
--- a/game/engine/Zone.lua
+++ b/game/engine/Zone.lua
@@ -21,7 +21,7 @@ require "engine.class"
 local Savefile = require "engine.Savefile"
 local Map = require "engine.Map"
 local Astar = require "engine.Astar"
-local print = function() end
+--local print = function() end
 
 --- Defines a zone: a set of levels, with depth, nps, objects, level generator, ...
 module(..., package.seeall, class.make)
@@ -85,11 +85,12 @@ end
 --- Parses the npc/objects list and compute rarities for random generation
 -- ONLY entities with a rarity properties will be considered.<br/>
 -- This means that to get a never-random entity you simply do not put a rarity property on it.
-function _M:computeRarities(type, list, level, filter, add_level)
+function _M:computeRarities(type, list, level, filter, add_level, rarity_field)
+	rarity_field = rarity_field or "rarity"
 	local r = { total=0 }
 	print("******************", level.level)
 	for i, e in ipairs(list) do
-		if e.rarity and e.level_range and (not filter or filter(e)) then
+		if e[rarity_field] and e.level_range and (not filter or filter(e)) then
 --			print("computing rarity of", e.name)
 			local lev = self.base_level + (level.level - 1) + (add_level or 0)
 
@@ -97,8 +98,8 @@ function _M:computeRarities(type, list, level, filter, add_level)
 			if lev < e.level_range[1] then max = 10000 / (3 * (e.level_range[1] - lev))
 			elseif e.level_range[2] and lev > e.level_range[2] then max = 10000 / (lev - e.level_range[2])
 			end
-			local genprob = math.floor(max / e.rarity)
-			print(("Entity(%30s) got %3d (=%3d / %3d) chance to generate. Level range(%2d-%2s), current %2d"):format(e.name, math.floor(genprob), math.floor(max), e.rarity, e.level_range[1], e.level_range[2] or "--", lev))
+			local genprob = math.floor(max / e[rarity_field])
+			print(("Entity(%30s) got %3d (=%3d / %3d) chance to generate. Level range(%2d-%2s), current %2d"):format(e.name, math.floor(genprob), math.floor(max), e[rarity_field], e.level_range[1], e.level_range[2] or "--", lev))
 
 			-- Generate and store egos list if needed
 			if e.egos and e.egos_chance then
diff --git a/game/modules/tome/data/general/npcs/naga.lua b/game/modules/tome/data/general/npcs/naga.lua
index 07e11bc32a1056776e74163c10664440b5eb91e9..87410aec799872f0df6ab588605e98d5344a5c46 100644
--- a/game/modules/tome/data/general/npcs/naga.lua
+++ b/game/modules/tome/data/general/npcs/naga.lua
@@ -52,7 +52,7 @@ Myrmidons are the most devoted warriors, following the orders of Maglor whatever
 	rarity = 1,
 	max_life = resolvers.rngavg(120,150), life_rating = 16,
 	resolvers.equip{
-		{type="weapon", subtype="trident", autoreq=true},
+		{type="weapon", subtype="trident", autoreq=true, special_rarity="trident_rarity"},
 	},
 	combat_armor = 20, combat_def = 10,
 	resolvers.talents{
@@ -100,7 +100,7 @@ Psyrens are dangerous naga that can directly assault your mind.]],
 	female = true,
 	max_life = resolvers.rngavg(100,110), life_rating = 11,
 	resolvers.equip{
-		{type="weapon", subtype="trident", autoreq=true},
+		{type="weapon", subtype="trident", autoreq=true, special_rarity="trident_rarity"},
 	},
 	combat_armor = 5, combat_def = 10,
 	autolevel = "wildcaster",
diff --git a/game/modules/tome/data/general/objects/2htridents.lua b/game/modules/tome/data/general/objects/2htridents.lua
index 9e1ef64a69dfe8c89496055c98085fca6e1fa56e..912d9122a460638f31f1bc14931efd7bf3869e0f 100644
--- a/game/modules/tome/data/general/objects/2htridents.lua
+++ b/game/modules/tome/data/general/objects/2htridents.lua
@@ -25,7 +25,7 @@ newEntity{
 	add_name = " (#COMBAT#)",
 	display = "|", color=colors.AQUAMARINE,
 	encumber = 3,
-	rarity = 5,
+	trident_rarity = 5, -- Special rarity field, converted to "rarity" when needed
 	metallic = true,
 	no_rust = true,
 	combat = { talented = "axe", damrange = 1.6, sound = "actions/melee", sound_miss = "actions/melee_miss", },
diff --git a/game/modules/tome/data/general/objects/objects.lua b/game/modules/tome/data/general/objects/objects.lua
index e930c7abf906fa28298abe59678ed2acd8324366..a08a0b7f7fcc7cbf9f8d21074fa1dd265653ff4f 100644
--- a/game/modules/tome/data/general/objects/objects.lua
+++ b/game/modules/tome/data/general/objects/objects.lua
@@ -17,53 +17,60 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+local loadIfNot = function(f)
+	if loaded[f] then return end
+	load(f, entity_mod)
+end
+
 -- Misc
-load("/data/general/objects/money.lua")
-load("/data/general/objects/gem.lua")
-load("/data/general/objects/lites.lua")
+loadIfNot("/data/general/objects/money.lua")
+loadIfNot("/data/general/objects/gem.lua")
+loadIfNot("/data/general/objects/lites.lua")
 
 -- Usable stuff
-load("/data/general/objects/potions.lua")
-load("/data/general/objects/scrolls.lua")
-load("/data/general/objects/wands.lua")
+loadIfNot("/data/general/objects/potions.lua")
+loadIfNot("/data/general/objects/scrolls.lua")
+loadIfNot("/data/general/objects/wands.lua")
 
 -- Jewelry stuff
-load("/data/general/objects/jewelry.lua")
+loadIfNot("/data/general/objects/jewelry.lua")
 
 -- Weapons
-load("/data/general/objects/staves.lua")
-load("/data/general/objects/knifes.lua")
+loadIfNot("/data/general/objects/staves.lua")
+loadIfNot("/data/general/objects/knifes.lua")
+
+loadIfNot("/data/general/objects/swords.lua")
+loadIfNot("/data/general/objects/2hswords.lua")
 
-load("/data/general/objects/swords.lua")
-load("/data/general/objects/2hswords.lua")
+loadIfNot("/data/general/objects/maces.lua")
+loadIfNot("/data/general/objects/2hmaces.lua")
 
-load("/data/general/objects/maces.lua")
-load("/data/general/objects/2hmaces.lua")
+loadIfNot("/data/general/objects/axes.lua")
+loadIfNot("/data/general/objects/2haxes.lua")
 
-load("/data/general/objects/axes.lua")
-load("/data/general/objects/2haxes.lua")
+loadIfNot("/data/general/objects/2htridents.lua")
 
-load("/data/general/objects/bows.lua")
-load("/data/general/objects/slings.lua")
+loadIfNot("/data/general/objects/bows.lua")
+loadIfNot("/data/general/objects/slings.lua")
 
 -- Armours
-load("/data/general/objects/shields.lua")
-load("/data/general/objects/cloth-armors.lua")
-load("/data/general/objects/light-armors.lua")
-load("/data/general/objects/heavy-armors.lua")
-load("/data/general/objects/massive-armors.lua")
+loadIfNot("/data/general/objects/shields.lua")
+loadIfNot("/data/general/objects/cloth-armors.lua")
+loadIfNot("/data/general/objects/light-armors.lua")
+loadIfNot("/data/general/objects/heavy-armors.lua")
+loadIfNot("/data/general/objects/massive-armors.lua")
 
 -- Head, feet, hands, ...
-load("/data/general/objects/leather-caps.lua")
-load("/data/general/objects/helms.lua")
-load("/data/general/objects/wizard-hat.lua")
-load("/data/general/objects/leather-boots.lua")
-load("/data/general/objects/heavy-boots.lua")
---load("/data/general/objects/gloves.lua")
+loadIfNot("/data/general/objects/leather-caps.lua")
+loadIfNot("/data/general/objects/helms.lua")
+loadIfNot("/data/general/objects/wizard-hat.lua")
+loadIfNot("/data/general/objects/leather-boots.lua")
+loadIfNot("/data/general/objects/heavy-boots.lua")
+--loadIfNot("/data/general/objects/gloves.lua")
 
 -- Mounts
-load("/data/general/objects/mounts.lua")
+loadIfNot("/data/general/objects/mounts.lua")
 
 -- Artifacts
-load("/data/general/objects/world-artifacts.lua")
-load("/data/general/objects/quest-artifacts.lua")
+loadIfNot("/data/general/objects/world-artifacts.lua")
+loadIfNot("/data/general/objects/quest-artifacts.lua")
diff --git a/game/modules/tome/data/zones/caverns-osse/objects.lua b/game/modules/tome/data/zones/caverns-osse/objects.lua
index 3ce6462edbc5bd17f7326f466e64797d6e4e9cb2..0df3dc37bf9377019ee2e68c40224ace5407cfa3 100644
--- a/game/modules/tome/data/zones/caverns-osse/objects.lua
+++ b/game/modules/tome/data/zones/caverns-osse/objects.lua
@@ -17,8 +17,8 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+load("/data/general/objects/2htridents.lua", function(e) e.rarity = e.trident_rarity end)
 load("/data/general/objects/objects.lua")
-load("/data/general/objects/2htridents.lua")
 
 local Talents = require "engine.interface.ActorTalents"
 local Stats = require "engine.interface.ActorStats"
diff --git a/game/modules/tome/data/zones/flooded-cave/objects.lua b/game/modules/tome/data/zones/flooded-cave/objects.lua
index 5916651b1df7e5022f18d00bb4c241d7aefb64cc..91fe78608cbeb2a5f1844c01dcc8c2e6c6aa2436 100644
--- a/game/modules/tome/data/zones/flooded-cave/objects.lua
+++ b/game/modules/tome/data/zones/flooded-cave/objects.lua
@@ -21,8 +21,8 @@ local Talents = require "engine.interface.ActorTalents"
 local Stats = require "engine.interface.ActorStats"
 local DamageType = require "engine.DamageType"
 
+load("/data/general/objects/2htridents.lua", function(e) e.rarity = e.trident_rarity end)
 load("/data/general/objects/objects.lua")
-load("/data/general/objects/2htridents.lua")
 
 -- Artifact, droped (and used!) by Bill the Stone Troll
 
diff --git a/game/modules/tome/data/zones/high-peak/npcs.lua b/game/modules/tome/data/zones/high-peak/npcs.lua
index bd88faf808c8ff5feb0741df46b9fa779d6cf50e..57f89d275be75be46ab780187b5142d05d8e30c1 100644
--- a/game/modules/tome/data/zones/high-peak/npcs.lua
+++ b/game/modules/tome/data/zones/high-peak/npcs.lua
@@ -16,7 +16,8 @@
 --
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
-
+load("/data/general/npcs/naga.lua", rarity(6))
+--[[
 -- Orcs & trolls
 load("/data/general/npcs/orc-grushnak.lua", rarity(0))
 load("/data/general/npcs/orc-vor.lua", rarity(0))
@@ -40,7 +41,7 @@ load("/data/general/npcs/ghoul.lua", rarity(2))
 load("/data/general/npcs/skeleton.lua", rarity(3))
 
 load("/data/general/npcs/all.lua", rarity(4, 35))
-
+]]
 local Talents = require("engine.interface.ActorTalents")
 
 -- Alatar & Palando, the final bosses