diff --git a/game/engines/default/engine/generator/map/Forest.lua b/game/engines/default/engine/generator/map/Forest.lua
index 57b67c80407a5ae5d5579d92742a176db74b026f..2f13be61d86c74d8a71f0918f5d1efb196a53302 100644
--- a/game/engines/default/engine/generator/map/Forest.lua
+++ b/game/engines/default/engine/generator/map/Forest.lua
@@ -20,7 +20,8 @@
 require "engine.class"
 local Map = require "engine.Map"
 require "engine.Generator"
-module(..., package.seeall, class.inherit(engine.Generator))
+local RoomsLoader = require "engine.generator.map.RoomsLoader"
+module(..., package.seeall, class.inherit(engine.Generator, RoomsLoader))
 
 function _M:init(zone, map, level, data)
 	engine.Generator.init(self, zone, map, level)
@@ -40,6 +41,8 @@ function _M:init(zone, map, level, data)
 		self.do_ponds.hurst = self.do_ponds.hurst or nil
 		self.do_ponds.lacunarity = self.do_ponds.lacunarity or nil
 	end
+
+	RoomsLoader.init(self, data)
 end
 
 function _M:addPond(x, y, spots)
@@ -114,6 +117,7 @@ function _M:generate(lev, old_lev)
 	end
 
 	local spots = {}
+	self.spots = spots
 
 	if self.do_ponds then
 		for i = 1, rng.range(self.do_ponds.nb[1], self.do_ponds.nb[2]) do
@@ -121,6 +125,24 @@ function _M:generate(lev, old_lev)
 		end
 	end
 
+	local nb_room = util.getval(self.data.nb_rooms or 0)
+	local rooms = {}
+	while nb_room > 0 do
+		local rroom
+		while true do
+			rroom = self.rooms[rng.range(1, #self.rooms)]
+			if type(rroom) == "table" and rroom.chance_room then
+				if rng.percent(rroom.chance_room) then rroom = rroom[1] break end
+			else
+				break
+			end
+		end
+
+		local r = self:roomAlloc(rroom, #rooms+1, lev, old_lev)
+		if r then rooms[#rooms+1] = r end
+		nb_room = nb_room - 1
+	end
+
 	local ux, uy, dx, dy
 	if self.data.edge_entrances then
 		ux, uy, dx, dy, spots = self:makeStairsSides(lev, old_lev, self.data.edge_entrances, spots)
diff --git a/game/engines/default/engine/generator/map/Roomer.lua b/game/engines/default/engine/generator/map/Roomer.lua
index ca6e01448f86e025f90799696d67c75103223061..75cb2fe919487d378f7ec3d2b7c70bfaa54d2d4d 100644
--- a/game/engines/default/engine/generator/map/Roomer.lua
+++ b/game/engines/default/engine/generator/map/Roomer.lua
@@ -20,7 +20,8 @@
 require "engine.class"
 local Map = require "engine.Map"
 require "engine.Generator"
-module(..., package.seeall, class.inherit(engine.Generator))
+local RoomsLoader = require "engine.generator.map.RoomsLoader"
+module(..., package.seeall, class.inherit(engine.Generator, RoomsLoader))
 
 function _M:init(zone, map, level, data)
 	engine.Generator.init(self, zone, map, level)
@@ -31,102 +32,7 @@ function _M:init(zone, map, level, data)
 	self.data.lite_room_chance = self.data.lite_room_chance or 25
 	self.grid_list = zone.grid_list
 
-	self.rooms = {}
-	for i, file in ipairs(data.rooms) do
-		if type(file) == "table" then
-			table.insert(self.rooms, {self:loadRoom(file[1]), chance_room=file[2]})
-		else
-			table.insert(self.rooms, self:loadRoom(file))
-		end
-	end
-end
-
-function _M:loadRoom(file)
-	local f, err = loadfile("/data/rooms/"..file..".lua")
-	if not f and err then error(err) end
-	setfenv(f, setmetatable({
-		Map = require("engine.Map"),
-	}, {__index=_G}))
-	local ret, err = f()
-	if not ret and err then error(err) end
-
-	-- We got a room generator function, save it for later
-	if type(ret) == "function" then
-		print("loaded room generator",file,ret)
-		return ret
-	end
-
-	-- Init the room with name and size
-	local t = { name=file, w=ret[1]:len(), h=#ret }
-
-	-- Read the room map
-	for j, line in ipairs(ret) do
-		local i = 1
-		for c in line:gmatch(".") do
-			t[i] = t[i] or {}
-			t[i][j] = c
-			i = i + 1
-		end
-	end
-	print("loaded room",file,t.w,t.h)
-
-	return t
-end
-
---- Make up a room
-function _M:roomAlloc(room, id, lev, old_lev)
-	if type(room) == 'function' then
-		print("room generator", room, "is making a room")
-		room = room(self, id, lev, old_lev)
-	end
-	print("alloc", room.name)
-	-- Sanity check
-	if self.map.w - 2 - room.w < 2 or self.map.h - 2 - room.h < 2 then return false end
-
-	local tries = 100
-	while tries > 0 do
-		local ok = true
-		local x, y = rng.range(1, self.map.w - 2 - room.w), rng.range(1, self.map.h - 2 - room.h)
-
-		-- Do we stomp ?
-		for i = 1, room.w do
-			for j = 1, room.h do
-				if self.map.room_map[i-1+x][j-1+y].room then ok = false break end
-			end
-			if not ok then break end
-		end
-
-		if ok then
-			local is_lit = rng.percent(self.data.lite_room_chance)
-
-			-- ok alloc it using the default generator or a specific one
-			local cx, cy
-			if room.generator then
-				cx, cy = room:generator(x, y, is_lit)
-			else
-				for i = 1, room.w do
-					for j = 1, room.h do
-						self.map.room_map[i-1+x][j-1+y].room = id
-						local c = room[i][j]
-						if c == '!' then
-							self.map.room_map[i-1+x][j-1+y].room = nil
-							self.map.room_map[i-1+x][j-1+y].can_open = true
-							self.map(i-1+x, j-1+y, Map.TERRAIN, self:resolve('#'))
-						else
-							self.map(i-1+x, j-1+y, Map.TERRAIN, self:resolve(c))
-						end
-						if is_lit then self.map.lites(i-1+x, j-1+y, true) end
-					end
-				end
-			end
-			print("room allocated at", x, y,"with center",math.floor(x+(room.w-1)/2), math.floor(y+(room.h-1)/2))
-			cx = cx or math.floor(x+(room.w-1)/2)
-			cy = cy or math.floor(y+(room.h-1)/2)
-			return { id=id, x=x, y=y, cx=cx, cy=cy, room=room }
-		end
-		tries = tries - 1
-	end
-	return false
+	RoomsLoader.init(self, data)
 end
 
 --- Random tunnel dir
@@ -336,17 +242,14 @@ function _M:generate(lev, old_lev)
 	local spots = {}
 	self.spots = spots
 
-	local nb_room = self.data.nb_rooms or 10
+	local nb_room = util.getval(self.data.nb_rooms or 10)
 	local rooms = {}
 	while nb_room > 0 do
 		local rroom
 		while true do
 			rroom = self.rooms[rng.range(1, #self.rooms)]
 			if type(rroom) == "table" and rroom.chance_room then
-				if rng.percent(rroom.chance_room) then
-					rroom = rroom[1]
-					break
-				end
+				if rng.percent(rroom.chance_room) then rroom = rroom[1] break end
 			else
 				break
 			end
diff --git a/game/engines/default/engine/generator/map/RoomsLoader.lua b/game/engines/default/engine/generator/map/RoomsLoader.lua
new file mode 100644
index 0000000000000000000000000000000000000000..4146ed4e9580cc055e43bbd1e8e5667a8f2aeb6a
--- /dev/null
+++ b/game/engines/default/engine/generator/map/RoomsLoader.lua
@@ -0,0 +1,126 @@
+-- TE4 - T-Engine 4
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+require "engine.class"
+local Map = require "engine.Map"
+
+--- Generator interface that can use rooms
+module(..., package.seeall, class.make)
+
+function _M:init(data)
+	self.rooms = {}
+
+	if not data.rooms then return end
+
+	for i, file in ipairs(data.rooms) do
+		if type(file) == "table" then
+			table.insert(self.rooms, {self:loadRoom(file[1]), chance_room=file[2]})
+		else
+			table.insert(self.rooms, self:loadRoom(file))
+		end
+	end
+end
+
+function _M:loadRoom(file)
+	local f, err = loadfile("/data/rooms/"..file..".lua")
+	if not f and err then error(err) end
+	setfenv(f, setmetatable({
+		Map = require("engine.Map"),
+	}, {__index=_G}))
+	local ret, err = f()
+	if not ret and err then error(err) end
+
+	-- We got a room generator function, save it for later
+	if type(ret) == "function" then
+		print("loaded room generator",file,ret)
+		return ret
+	end
+
+	-- Init the room with name and size
+	local t = { name=file, w=ret[1]:len(), h=#ret }
+
+	-- Read the room map
+	for j, line in ipairs(ret) do
+		local i = 1
+		for c in line:gmatch(".") do
+			t[i] = t[i] or {}
+			t[i][j] = c
+			i = i + 1
+		end
+	end
+	print("loaded room",file,t.w,t.h)
+
+	return t
+end
+
+--- Make up a room
+function _M:roomAlloc(room, id, lev, old_lev)
+	if type(room) == 'function' then
+		print("room generator", room, "is making a room")
+		room = room(self, id, lev, old_lev)
+	end
+	print("alloc", room.name)
+	-- Sanity check
+	if self.map.w - 2 - room.w < 2 or self.map.h - 2 - room.h < 2 then return false end
+
+	local tries = 100
+	while tries > 0 do
+		local ok = true
+		local x, y = rng.range(1, self.map.w - 2 - room.w), rng.range(1, self.map.h - 2 - room.h)
+
+		-- Do we stomp ?
+		for i = 1, room.w do
+			for j = 1, room.h do
+				if self.map.room_map[i-1+x][j-1+y].room then ok = false break end
+			end
+			if not ok then break end
+		end
+
+		if ok then
+			local is_lit = rng.percent(self.data.lite_room_chance)
+
+			-- ok alloc it using the default generator or a specific one
+			local cx, cy
+			if room.generator then
+				cx, cy = room:generator(x, y, is_lit)
+			else
+				for i = 1, room.w do
+					for j = 1, room.h do
+						self.map.room_map[i-1+x][j-1+y].room = id
+						local c = room[i][j]
+						if c == '!' then
+							self.map.room_map[i-1+x][j-1+y].room = nil
+							self.map.room_map[i-1+x][j-1+y].can_open = true
+							self.map(i-1+x, j-1+y, Map.TERRAIN, self:resolve('#'))
+						else
+							self.map(i-1+x, j-1+y, Map.TERRAIN, self:resolve(c))
+						end
+						if is_lit then self.map.lites(i-1+x, j-1+y, true) end
+					end
+				end
+			end
+			print("room allocated at", x, y,"with center",math.floor(x+(room.w-1)/2), math.floor(y+(room.h-1)/2))
+			cx = cx or math.floor(x+(room.w-1)/2)
+			cy = cy or math.floor(y+(room.h-1)/2)
+			return { id=id, x=x, y=y, cx=cx, cy=cy, room=room }
+		end
+		tries = tries - 1
+	end
+	return false
+end
diff --git a/game/engines/default/engine/generator/map/Static.lua b/game/engines/default/engine/generator/map/Static.lua
index 02f6e751de09d99d153b17f9aa84ddd857d7a278..6ab1afa3b070c9b04f4d663e7eb634af8c821511 100644
--- a/game/engines/default/engine/generator/map/Static.lua
+++ b/game/engines/default/engine/generator/map/Static.lua
@@ -85,11 +85,21 @@ function _M:loadMap(file)
 	local m = { w=ret[1]:len(), h=#ret }
 
 	-- Read the map
+	local rotate = util.getval(g.rotates or "default")
 	for j, line in ipairs(ret) do
 		local i = 1
 		for c in line:gmatch(".") do
-			m[i] = m[i] or {}
-			m[i][j] = c
+			local ii, jj = i, j
+
+			if rotate == "flipx" then ii, jj = m.w - i + 1, j
+			elseif rotate == "flipy" then ii, jj = i, m.h - j + 1
+			elseif rotate == "90" then ii, jj = j, m.w - i + 1
+			elseif rotate == "180" then ii, jj = m.w - i + 1, m.h - j + 1
+			elseif rotate == "270" then ii, jj = m.h - j + 1, i
+			end
+
+			m[ii] = m[ii] or {}
+			m[ii][jj] = c
 			i = i + 1
 		end
 	end
@@ -99,6 +109,25 @@ function _M:loadMap(file)
 	m.endx = g.endx or math.floor(m.w / 2)
 	m.endy = g.endy or math.floor(m.h / 2)
 
+	if rotate == "flipx" then
+		m.startx = m.w - m.startx + 1
+		m.endx   = m.w - m.endx   + 1
+	elseif rotate == "flipy" then
+		m.starty = m.h - m.starty + 1
+		m.endy   = m.h - m.endy   + 1
+	elseif rotate == "90" then
+		m.startx, m.starty = m.starty, m.w - m.startx + 1
+		m.endx,   m.endy   = m.endy,   m.w - m.endx   + 1
+		m.w, m.h = m.h, m.w
+	elseif rotate == "180" then
+		m.startx, m.starty = m.w - m.startx + 1, m.h - m.starty + 1
+		m.endx,   m.endy   = m.w - m.endx   + 1, m.h - m.endy   + 1
+	elseif rotate == "270" then
+		m.startx, m.starty = m.h - m.starty + 1, m.startx
+		m.endx,   m.endy   = m.h - m.endy   + 1, m.endx
+		m.w, m.h = m.h, m.w
+	end
+
 	self.gen_map = m
 	self.tiles = t
 
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 6ab1cca73b959a41a800e4e63559c6b43c669766..949b56b43bdbb4f9663c7d4315b0dfd935ceb7de 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -524,7 +524,7 @@ function _M:setupCommands()
 		end,
 		[{"_g","ctrl"}] = function()
 			if config.settings.tome.cheat then
-				self:changeLevel(1, "infinite-dungeon")
+				self:changeLevel(1, "eruan")
 --				self.player:grantQuest("test")
 			end
 		end,
diff --git a/game/modules/tome/data/general/grids/forest.lua b/game/modules/tome/data/general/grids/forest.lua
index b9e3c16d0871cfde293826aacdc7b5f212a496c7..c307298a424405558dfa4473f50e63b7775a85ad 100644
--- a/game/modules/tome/data/general/grids/forest.lua
+++ b/game/modules/tome/data/general/grids/forest.lua
@@ -38,6 +38,21 @@ newEntity{
 }
 end
 
+for i = 1, 20 do
+newEntity{
+	define_as = "HARDTREE"..(i > 1 and i or ""),
+	name = "tall thick tree",
+	image = "terrain/grass.png",
+	add_displays = class:makeTrees("terrain/tree_alpha"),
+	display = '#', color=colors.LIGHT_GREEN, back_color={r=44,g=95,b=43},
+	always_remember = true,
+	does_block_move = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+}
+end
+
 newEntity{
 	define_as = "GRASS_DARK1",
 	name = "grass", image = "terrain/grass_dark1.png",
@@ -59,8 +74,51 @@ newEntity{
 }
 end
 
+for i = 1, 20 do
+newEntity{
+	define_as = "HARDTREE_DARK"..i,
+	name = "tall thick tree", image = "terrain/grass_dark1.png",
+	force_clone = true,
+	add_displays = class:makeTrees("terrain/tree_alpha"),
+	display = '#', color=colors.GREEN, back_color={r=44,g=95,b=43},
+	always_remember = true,
+	does_block_move = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+}
+end
+
 newEntity{
 	define_as = "FLOWER",
 	name = "flower", image = "terrain/grass_flower3.png",
 	display = ';', color=colors.YELLOW, back_color={r=44,g=95,b=43},
 }
+
+newEntity{
+	define_as = "ROCK_VAULT",
+	name = "huge lose rock", image = "terrain/rock_grass.png",
+	display = '+', color=colors.GREY, back_color={r=44,g=95,b=43},
+	notice = true,
+	always_remember = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+	door_player_check = "This rock is loose, you think you can move it away.",
+	door_opened = "GRASS",
+	dig = "GRASS",
+}
+
+newEntity{
+	define_as = "ROCK_VAULT_DARK",
+	name = "huge lose rock", image = "terrain/rock_grass_dark.png",
+	display = '+', color=colors.GREY, back_color={r=44,g=95,b=43},
+	notice = true,
+	always_remember = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+	door_player_check = "This rock is loose, you think you can move it away.",
+	door_opened = "GRASS_DARK1",
+	dig = "GRASS_DARK1",
+}
diff --git a/game/modules/tome/data/general/grids/mountain.lua b/game/modules/tome/data/general/grids/mountain.lua
index 3141d9a7d587e86ce8d6a0ac4d33ee7dcf5abe8b..8bbe4ae2e95c58e34d360926ab430e04e56145a0 100644
--- a/game/modules/tome/data/general/grids/mountain.lua
+++ b/game/modules/tome/data/general/grids/mountain.lua
@@ -45,3 +45,15 @@ newEntity{
 	block_sight = true,
 	dig = "ROCKY_GROUND",
 }
+
+newEntity{
+	define_as = "HARDMOUNTAIN_WALL",
+	name = "hard rocky mountain", image = "terrain/rocky_mountain.png",
+	display = '#', color=colors.UMBER, back_color=colors.LIGHT_UMBER,
+	always_remember = true,
+	does_block_move = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+	air_level = -20,
+}
diff --git a/game/modules/tome/data/gfx/terrain/rock_grass.png b/game/modules/tome/data/gfx/terrain/rock_grass.png
new file mode 100644
index 0000000000000000000000000000000000000000..92a096890d22a41a03cb55ed8b47fc7a25ea216f
Binary files /dev/null and b/game/modules/tome/data/gfx/terrain/rock_grass.png differ
diff --git a/game/modules/tome/data/gfx/terrain/rock_grass_dark.png b/game/modules/tome/data/gfx/terrain/rock_grass_dark.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f085d3c81627a0e47f51ef16a5f5cbccd92f4a6
Binary files /dev/null and b/game/modules/tome/data/gfx/terrain/rock_grass_dark.png differ
diff --git a/game/modules/tome/data/maps/vaults/dragon_lair.lua b/game/modules/tome/data/maps/vaults/dragon_lair.lua
new file mode 100644
index 0000000000000000000000000000000000000000..93718ed3b3093a4814e1a248017f541fc5861690
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/dragon_lair.lua
@@ -0,0 +1,45 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+startx = 25
+starty = 6
+
+defineTile('!', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=false, can_open=true}})
+defineTile(' ', "SAND")
+defineTile('X', "HARDMOUNTAIN_WALL")
+defineTile('$', "SAND", {random_filter={add_levels=15}})
+defineTile('D', "SAND", {random_filter={add_levels=20}}, {random_filter={name="greater multi-hued wyrm", add_levels=50}})
+defineTile('d', "SAND", nil, {random_filter={name="multi-hued drake hatchling", add_levels=20}})
+
+rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+
+return {
+[[  XXXXXXX X X XXX    X    ]],
+[[ XXXd  XXXXXXXXdXX XXXXXX ]],
+[[XXXXXXX     XXXX XXX   XXX]],
+[[XdXXX   $$$   Xd XXX X  XX]],
+[[XX     $$$$$  dXXX   XX XX]],
+[[Xd    $$$D$$$      XXXX!XX]],
+[[XX     $$$$$   XXXXXXXX   ]],
+[[XXXXX   $$$   XXXXXXXXXXXX]],
+[[  XXX X     XXX XXXXXXXXX ]],
+[[ XXXX XXXXXX ddXXXXXX     ]],
+[[ XXXdXX  XXXXXXXXXXXXX    ]],
+[[  XXXX     XXXXXXXX       ]],
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/honey_glade.lua b/game/modules/tome/data/maps/vaults/honey_glade.lua
new file mode 100644
index 0000000000000000000000000000000000000000..7981db199624eb2a71688018e21f3e50bde788c6
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/honey_glade.lua
@@ -0,0 +1,44 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+defineTile('!', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=false, can_open=true}})
+defineTile(' ', "GRASS")
+defineTile('+', "DOOR")
+defineTile('X', {"HARDTREE","HARDTREE2","HARDTREE3","HARDTREE4","HARDTREE5","HARDTREE6","HARDTREE7","HARDTREE8","HARDTREE9","HARDTREE10","HARDTREE11","HARDTREE12","HARDTREE13","HARDTREE14","HARDTREE15","HARDTREE16","HARDTREE17","HARDTREE18","HARDTREE19","HARDTREE20"})
+defineTile('^', "GRASS", nil, nil, {random_filter={add_levels=5}})
+defineTile('#', "GRASS", nil, {random_filter={name="honey tree"}})
+defineTile('q', "GRASS", {random_filter={add_levels=10}}, {random_filter={name="brown bear", add_levels=10}})
+defineTile('Q', "GRASS", {random_filter={add_levels=20}}, {random_filter={name="grizzly bear", add_levels=20}})
+
+startx = 2
+starty = 10
+
+return {
+[[XXXXXXXXXX]],
+[[XXX   XXXX]],
+[[XX #q# XXX]],
+[[XX qQq XXX]],
+[[XX #q# XXX]],
+[[XXX   XXXX]],
+[[XXXX XXXXX]],
+[[XXXX   XXX]],
+[[XXXXXX!XXX]],
+[[XX^^^^ XXX]],
+[[XX XXXXXXX]],
+}
diff --git a/game/modules/tome/data/maps/vaults/honey_glade_dark.lua b/game/modules/tome/data/maps/vaults/honey_glade_dark.lua
new file mode 100644
index 0000000000000000000000000000000000000000..0aad549239358e2f1e343eaa3fe582cb246e62a2
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/honey_glade_dark.lua
@@ -0,0 +1,44 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+defineTile('!', "ROCK_VAULT_DARK", nil, nil, nil, {room_map={special=false, room=false, can_open=true}})
+defineTile(' ', "GRASS_DARK1")
+defineTile('+', "DOOR")
+defineTile('X', {"HARDTREE_DARK1","HARDTREE_DARK2","HARDTREE_DARK3","HARDTREE_DARK4","HARDTREE_DARK5","HARDTREE_DARK6","HARDTREE_DARK7","HARDTREE_DARK8","HARDTREE_DARK9","HARDTREE_DARK10","HARDTREE_DARK11","HARDTREE_DARK12","HARDTREE_DARK13","HARDTREE_DARK14","HARDTREE_DARK15","HARDTREE_DARK16","HARDTREE_DARK17","HARDTREE_DARK18","HARDTREE_DARK19","HARDTREE_DARK20"})
+defineTile('^', "GRASS_DARK1", nil, nil, {random_filter={add_levels=5}})
+defineTile('#', "GRASS_DARK1", nil, {random_filter={name="honey tree"}})
+defineTile('q', "GRASS_DARK1", {random_filter={add_levels=10}}, {random_filter={name="brown bear", add_levels=10}})
+defineTile('Q', "GRASS_DARK1", {random_filter={add_levels=20}}, {random_filter={name="grizzly bear", add_levels=20}})
+
+startx = 2
+starty = 10
+
+return {
+[[XXXXXXXXXX]],
+[[XXX   XXXX]],
+[[XX #q# XXX]],
+[[XX qQq XXX]],
+[[XX #q# XXX]],
+[[XXX   XXXX]],
+[[XXXX XXXXX]],
+[[XXXX   XXX]],
+[[XXXXXX!XXX]],
+[[XX^^^^ XXX]],
+[[XX XXXXXXX]],
+}
diff --git a/game/modules/tome/data/rooms/greater_vault.lua b/game/modules/tome/data/rooms/greater_vault.lua
index 3a7a73e901bed7fc99729c8a4c13bdb21b98e2f0..7fbe26d6c69aa0bfe2d7102d2a29d9fab90b1040 100644
--- a/game/modules/tome/data/rooms/greater_vault.lua
+++ b/game/modules/tome/data/rooms/greater_vault.lua
@@ -23,7 +23,7 @@ local list = {
 }
 
 return function(gen, id, lev, old_lev)
-	local vaultid = rng.table(gen.data.vaults_list or list)
+	local vaultid = rng.table(gen.data.greater_vaults_list or list)
 	local vault_map = engine.Map.new(max_w, max_h)
 	local Static = require("engine.generator.map.Static")
 	local data = table.clone(gen.data)
diff --git a/game/modules/tome/data/rooms/lesser_vault.lua b/game/modules/tome/data/rooms/lesser_vault.lua
new file mode 100644
index 0000000000000000000000000000000000000000..d1a5c0cf81c0ee4806d1da14a6d076c232a3d135
--- /dev/null
+++ b/game/modules/tome/data/rooms/lesser_vault.lua
@@ -0,0 +1,56 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+local max_w, max_h = 50, 50
+local list = {
+	"honey_glade",
+}
+
+return function(gen, id, lev, old_lev)
+	local vaultid = rng.table(gen.data.lesser_vaults_list or list)
+	local vault_map = engine.Map.new(max_w, max_h)
+	local Static = require("engine.generator.map.Static")
+	local data = table.clone(gen.data)
+	data.map = "vaults/"..vaultid
+
+	local old_map = gen.level.map
+	local old_game_level = game.level
+	game.level = gen.level
+	gen.level.map = vault_map
+	local vault = Static.new(gen.zone, vault_map, gen.level, data)
+	vault:generate(lev, old_lev)
+	game.level = old_game_level
+	gen.level.map = old_map
+
+	local w = vault_map.w
+	local h = vault_map.h
+	return { name="lesser_vault-"..vaultid.."-"..w.."x"..h, w=w, h=h, generator = function(self, x, y, is_lit)
+		gen.map:import(vault_map, x, y)
+		vault_map:close()
+		-- Make it a room, and make it special so that we do not tunnel through
+		for i = x, x + w - 1 do for j = y, y + h - 1 do
+			gen.map.room_map[i][j].special = true
+			gen.map.room_map[i][j].room = id
+		end end
+		if vault.gen_map.startx and vault.gen_map.starty then
+			gen.spots[#gen.spots+1] = {x=vault.gen_map.startx + x, y=vault.gen_map.starty + y, check_connectivity="entrance", type="vault", subtype="lesser"}
+			return vault.gen_map.startx + x, vault.gen_map.starty + y
+		end
+	end}
+end
diff --git a/game/modules/tome/data/zones/eruan/grids.lua b/game/modules/tome/data/zones/eruan/grids.lua
index 42797611be60aea25b7ba1043b87a2ab4ba4ebc6..cab6da50e5772de3495d0abc57feb8a0c8ede7e6 100644
--- a/game/modules/tome/data/zones/eruan/grids.lua
+++ b/game/modules/tome/data/zones/eruan/grids.lua
@@ -19,7 +19,9 @@
 
 load("/data/general/grids/basic.lua")
 load("/data/general/grids/water.lua")
+load("/data/general/grids/forest.lua")
 load("/data/general/grids/sand.lua")
+load("/data/general/grids/mountain.lua")
 
 newEntity{
 	define_as = "MOUNT_DOOM_PORTAL",
diff --git a/game/modules/tome/data/zones/eruan/zone.lua b/game/modules/tome/data/zones/eruan/zone.lua
index 7695e69820df3ddc34b35d7939aaa1a609ba6a45..f8e108d01822f480368e5b379c39d6709d7203a4 100644
--- a/game/modules/tome/data/zones/eruan/zone.lua
+++ b/game/modules/tome/data/zones/eruan/zone.lua
@@ -25,7 +25,7 @@ return {
 	decay = {300, 800},
 	actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2) end,
 	width = 50, height = 50,
---	all_remembered = true,
+	all_remembered = true,
 	all_lited = true,
 	persistant = "zone",
 	ambiant_music = "Bazaar of Tal-Mashad.ogg",
@@ -45,6 +45,11 @@ return {
 				size = {w=25, h=25},
 				pond = {{0.6, "DEEP_WATER"}, {0.8, "SHALLOW_WATER"}},
 			},
+
+			nb_rooms = {1,2},
+			rooms = {"greater_vault"},
+			greater_vaults_list = {"dragon_lair"},
+			lite_room_chance = 100,
 		},
 		actor = {
 			class = "engine.generator.actor.Random",
diff --git a/game/modules/tome/data/zones/infinite-dungeon/zone.lua b/game/modules/tome/data/zones/infinite-dungeon/zone.lua
index 43ffed920284145aeb4dec9e52e5abdd48adf4f3..7ec6a03f35d50a8c6ebbf358f8c5fa6c889f1c24 100644
--- a/game/modules/tome/data/zones/infinite-dungeon/zone.lua
+++ b/game/modules/tome/data/zones/infinite-dungeon/zone.lua
@@ -36,7 +36,7 @@ return {
 --			rooms = {"simple", "pilar", {"money_vault",5}},
 			rooms = {"simple", "greater_vault"},
 			rooms_config = {pit={filters={{type="undead"}}}},
-			vaults_list = {"double-t","crypt","treasure1","diggers"},
+			greater_vaults_list = {"double-t","crypt","treasure1","diggers"},
 			lite_room_chance = 50,
 			['.'] = "FLOOR",
 			['#'] = "WALL",
diff --git a/game/modules/tome/data/zones/old-forest/zone.lua b/game/modules/tome/data/zones/old-forest/zone.lua
index 00e54e30ffb2fc9019e33559215972408feb0f4b..e5d4fabe68f1e5bea8dabcbdfdb4a659c7cb75a7 100644
--- a/game/modules/tome/data/zones/old-forest/zone.lua
+++ b/game/modules/tome/data/zones/old-forest/zone.lua
@@ -34,8 +34,9 @@ return {
 			class = "engine.generator.map.Roomer",
 			nb_rooms = 10,
 			edge_entrances = {6,4},
-			rooms = {"forest_clearing"},
+			rooms = {"forest_clearing", {"lesser_vault",8}},
 			rooms_config = {forest_clearing={pit_chance=5, filters={{type="insect", subtype="ant"}, {type="insect"}, {type="animal", subtype="snake"}, {type="animal", subtype="canine"}}}},
+			lesser_vaults_list = {"honey_glade_dark"},
 			['.'] = "GRASS_DARK1",
 			['#'] = {"TREE_DARK1","TREE_DARK2","TREE_DARK3","TREE_DARK4","TREE_DARK5","TREE_DARK6","TREE_DARK7","TREE_DARK8","TREE_DARK9","TREE_DARK10","TREE_DARK11","TREE_DARK12","TREE_DARK13","TREE_DARK14","TREE_DARK15","TREE_DARK16","TREE_DARK17","TREE_DARK18","TREE_DARK19","TREE_DARK20",},
 			up = "UP",
diff --git a/game/modules/tome/data/zones/tol-falas/zone.lua b/game/modules/tome/data/zones/tol-falas/zone.lua
index f175ede5e4e494ffca3fe8382f1407fac236bbf2..a2847f8e146b81218a89264dfff0ad92614363c0 100644
--- a/game/modules/tome/data/zones/tol-falas/zone.lua
+++ b/game/modules/tome/data/zones/tol-falas/zone.lua
@@ -35,7 +35,7 @@ return {
 			nb_rooms = 10,
 			rooms = {"simple", "pilar", {"money_vault",5}, {"pit",7}, {"greater_vault",8}},
 			rooms_config = {pit={filters={{type="undead"}}}},
-			vaults_list = {"double-t","crypt","treasure1","diggers"},
+			greater_vaults_list = {"double-t","crypt","treasure1","diggers"},
 			lite_room_chance = 100,
 			['.'] = "FLOOR",
 			['#'] = "WALL",
@@ -45,7 +45,7 @@ return {
 		},
 		actor = {
 			class = "engine.generator.actor.Random",
-			nb_npc = {0, 0},
+			nb_npc = {20, 30},
 			guardian = "THE_MASTER",
 		},
 		object = {
diff --git a/game/modules/tome/data/zones/trollshaws/zone.lua b/game/modules/tome/data/zones/trollshaws/zone.lua
index 3aa79d4782b3e89a831e16a6d7bcda694e7d1f41..8fcd3153a4477c26cf71ce8a51b8ff7238f95075 100644
--- a/game/modules/tome/data/zones/trollshaws/zone.lua
+++ b/game/modules/tome/data/zones/trollshaws/zone.lua
@@ -45,6 +45,11 @@ return {
 				size = {w=25, h=25},
 				pond = {{0.6, "DEEP_WATER"}, {0.8, "SHALLOW_WATER"}},
 			},
+
+			nb_rooms = {0,0,0,0,1},
+			rooms = {"lesser_vault"},
+			greater_vaults_list = {"honey_tree"},
+			lite_room_chance = 100,
 		},
 		actor = {
 			class = "engine.generator.actor.Random",