diff --git a/game/engine/Entity.lua b/game/engine/Entity.lua
index 1d210d9167afe8d8eeaea3e9b50379fa38b0e1e7..a45ff5672f858d99b06d4bb1839e7b1ce1205a8c 100644
--- a/game/engine/Entity.lua
+++ b/game/engine/Entity.lua
@@ -157,11 +157,11 @@ function _M:loadList(file, no_default)
 			if t.define_as then res[t.define_as] = e end
 		end,
 		load = function(f)
-			local ret = self:loadList(f)
+			local ret = self:loadList(f, no_default)
 			for i, e in ipairs(ret) do res[#res+1] = e end
 		end,
 		loadList = function(f)
-			return self:loadList(f)
+			return self:loadList(f, no_default)
 		end,
 	}, {__index=_G}))
 	f()
diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua
index d2d234992b40177a913596bffeb7cc77dd6ef82a..575f2971fddec32d3c950106c9cf7bf68259289a 100644
--- a/game/engine/Zone.lua
+++ b/game/engine/Zone.lua
@@ -34,17 +34,17 @@ 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(list, level, ood, filter)
+function _M:computeRarities(type, list, level, ood, filter)
 	local r = { total=0 }
-	print("******************", level)
+	print("******************", level.level)
 	for i, e in ipairs(list) do
 		if e.rarity and e.level_range and (not filter or filter(e)) then
 --			print("computing rarity of", e.name)
-			local lev = level
+			local lev = level.level
 			-- Out of Depth chance
 --			if ood and rng.percent(ood.chance) then
---				lev = level + rng.range(ood.range[1], ood.range[2])
---				print("OOD Entity !", e.name, ":=:", level, "to", lev)
+--				lev = level.level + rng.range(ood.range[1], ood.range[2])
+--				print("OOD Entity !", e.name, ":=:", level.level, "to", lev)
 --			end
 
 			local max = 100
@@ -54,8 +54,17 @@ function _M:computeRarities(list, level, ood, filter)
 			local genprob = max / e.rarity
 			print("prob", e.name, math.floor(genprob), "max", math.floor(max), e.level_range[1], e.level_range[2], lev, "egoable", e.egos and #e.egos)
 
+			-- Generate and store egos list if needed
+			if e.egos and not level:getEntitiesList(type.."/"..e.egos) then
+				local egos = self:getEgosList(level, type, e.egos, e.__CLASSNAME)
+				if egos then
+					egos = self:computeRarities(type, egos, level, ood, filter)
+					level:setEntitiesList(type.."/"..e.egos, egos)
+				end
+			end
+
 			r.total = r.total + genprob
-			r[#r+1] = { e=e, genprob=r.total + genprob, level_diff = lev - level }
+			r[#r+1] = { e=e, genprob=r.total + genprob, level_diff = lev - level.level }
 		end
 	end
 	table.sort(r, function(a, b) return a.genprob < b.genprob end)
@@ -97,7 +106,7 @@ function _M:makeEntity(level, type)
 	-- Add "ego" properties
 	if e.egos then
 		local egos = self:getEgosList(level, type, e.egos, e.__CLASSNAME)
-		local ego = egos[rng.range(1, #egos)]
+		local ego = self:pickEntity(egos)
 		if ego then
 			print("ego", ego.__CLASSNAME, ego.name, getmetatable(ego))
 			ego = ego:clone()
diff --git a/game/engine/generator/actor/Random.lua b/game/engine/generator/actor/Random.lua
index 11f48b780b650e578bf96ce26ae13852fdef4150..d23e0f0e91828de198691ab56a07578315e2319f 100644
--- a/game/engine/generator/actor/Random.lua
+++ b/game/engine/generator/actor/Random.lua
@@ -9,7 +9,7 @@ function _M:init(zone, map, level)
 	local data = level.data.generator.actor
 
 	-- Setup the entities list
-	level:setEntitiesList("actor", zone:computeRarities(zone.npc_list, level.level, data.ood, nil))
+	level:setEntitiesList("actor", zone:computeRarities("actor", zone.npc_list, level, data.ood, nil))
 
 	if data.adjust_level_to_player and game:getPlayer() then
 		self.adjust_level_to_player = {base=game:getPlayer().level, min=data.adjust_level_to_player[1], max=data.adjust_level_to_player[2]}
diff --git a/game/engine/generator/object/Random.lua b/game/engine/generator/object/Random.lua
index 4dc974907fc462104cb8b891f2742b5ee459e39d..d27c99e3f687cb688e923761aefc235154c423ec 100644
--- a/game/engine/generator/object/Random.lua
+++ b/game/engine/generator/object/Random.lua
@@ -9,7 +9,7 @@ function _M:init(zone, map, level)
 	local data = level.data.generator.object
 
 	-- Setup the entities list
-	level:setEntitiesList("object", zone:computeRarities(zone.object_list, level.level, data.ood, nil))
+	level:setEntitiesList("object", zone:computeRarities("object", zone.object_list, level, data.ood, nil))
 
 	if data.adjust_level_to_player and game:getPlayer() then
 		self.adjust_level_to_player = {base=game:getPlayer().level, min=data.adjust_level_to_player[1], max=data.adjust_level_to_player[2]}