diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua
index ab6aa129b2033f7d16c7e524092dc78e0807cfe5..1c280cd10bbde29707feb20610c3d47db926bfe0 100644
--- a/game/engine/Zone.lua
+++ b/game/engine/Zone.lua
@@ -297,6 +297,12 @@ function _M:newLevel(level_data, lev, old_lev, game)
 	level:setEntitiesList("object", self:computeRarities("object", self.object_list, level, nil))
 	level:setEntitiesList("trap", self:computeRarities("trap", self.trap_list, level, nil))
 
+	-- Save level data
+	level.data = level_data
+
+	-- Setup the level in the game
+	game:setLevel(level)
+
 	-- Generate the map
 	local generator = require(level_data.generator.map.class).new(
 		self,
@@ -311,12 +317,6 @@ function _M:newLevel(level_data, lev, old_lev, game)
 	level.downs = {{x=dx, y=dy}}
 	level.spots = spots
 
-	-- Save level data
-	level.data = level_data
-
-	-- Setup the level in the game
-	game:setLevel(level)
-
 	-- Generate objects
 	if level_data.generator.object then
 		local generator = require(level_data.generator.object.class).new(
diff --git a/game/engine/generator/map/Roomer.lua b/game/engine/generator/map/Roomer.lua
index f5cde30ad64b95b571f576d394dbce9bb9488066..9d2cee6d6abf3b13d25653cb5646be56604f12d5 100644
--- a/game/engine/generator/map/Roomer.lua
+++ b/game/engine/generator/map/Roomer.lua
@@ -3,7 +3,7 @@ local Map = require "engine.Map"
 require "engine.Generator"
 module(..., package.seeall, class.inherit(engine.Generator))
 
-function _M:init(zone, map, grid_list, data)
+function _M:init(zone, map, level, data)
 	engine.Generator.init(self, zone, map, level)
 	self.data = data
 	self.data.tunnel_change = self.data.tunnel_change or 30
@@ -14,7 +14,11 @@ function _M:init(zone, map, grid_list, data)
 
 	self.rooms = {}
 	for i, file in ipairs(data.rooms) do
-		table.insert(self.rooms, self:loadRoom(file))
+		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
 
@@ -307,7 +311,20 @@ function _M:generate(lev, old_lev)
 	local nb_room = self.data.nb_rooms or 10
 	local rooms = {}
 	while nb_room > 0 do
-		local r = self:roomAlloc(self.rooms[rng.range(1, #self.rooms)], #rooms+1, lev, old_lev)
+		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
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index e098fa6278af7009bebea17b22968461da1fe325..a67572a2a823defe0ff808266bf5a5cffdc5e313 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -99,10 +99,9 @@ function _M:onTakeHit(value, src)
 	self:runStop("taken damage")
 	self:restStop("taken damage")
 	local ret = mod.class.Actor.onTakeHit(self, value, src)
-	if self.life < self.max_life * 0.3 and (not self.last_life_warning or self.last_life_warning < game.turn) then
+	if self.life < self.max_life * 0.3 then
 		local sx, sy = game.level.map:getTileToScreen(self.x, self.y)
 		game.flyers:add(sx, sy, 30, (rng.range(0,2)-1) * 0.5, 2, "LOW HEALTH!", {255,0,0}, true)
-		self.last_life_warning = game.turn
 	end
 	return ret
 end
diff --git a/game/modules/tome/data/rooms/money_vault.lua b/game/modules/tome/data/rooms/money_vault.lua
new file mode 100644
index 0000000000000000000000000000000000000000..67c53d527e1408449cf8adb64336b537799ecfa4
--- /dev/null
+++ b/game/modules/tome/data/rooms/money_vault.lua
@@ -0,0 +1,33 @@
+return function(gen, id)
+	local w = 5
+	local h = 5
+	return { name="money_vault"..w.."x"..h, w=w, h=h, generator = function(self, x, y, is_lit)
+		for i = 1, self.w do
+			for j = 1, self.h do
+				if i == 1 or i == self.w or j == 1 or j == self.h then
+					gen.map.room_map[i-1+x][j-1+y].can_open = true
+					gen.map(i-1+x, j-1+y, Map.TERRAIN, gen.grid_list[gen:resolve('#')])
+				else
+					gen.map.room_map[i-1+x][j-1+y].room = id
+					gen.map(i-1+x, j-1+y, Map.TERRAIN, gen.grid_list[gen:resolve('.')])
+
+					-- Add money
+					local e = gen.zone:makeEntity(gen.level, "object", {type="money"})
+					if e then
+						gen.map(i-1+x, j-1+y, Map.OBJECT, e)
+					end
+					-- Add guardians
+					if rng.percent(50) then
+						e = gen.zone:makeEntity(gen.level, "actor")
+						if e then
+							e:move(i-1+x, j-1+y, true)
+							gen.level:addEntity(e)
+							e:added()
+						end
+					end
+				end
+				if is_lit then gen.map.lites(i-1+x, j-1+y, true) end
+			end
+		end
+	end}
+end
diff --git a/game/modules/tome/data/zones/tol-falas/zone.lua b/game/modules/tome/data/zones/tol-falas/zone.lua
index e59a911921fc9e0010659cdf2654f8eac83fb01f..bb2415b0fc71c40d6a9124e6f1f316e585dcb62a 100644
--- a/game/modules/tome/data/zones/tol-falas/zone.lua
+++ b/game/modules/tome/data/zones/tol-falas/zone.lua
@@ -11,7 +11,7 @@ return {
 		map = {
 			class = "engine.generator.map.Roomer",
 			nb_rooms = 10,
-			rooms = {"simple", "pilar"},
+			rooms = {"simple", "pilar", {"money_vault",5}},
 			lite_room_chance = 100,
 			['.'] = "FLOOR",
 			['#'] = "WALL",
diff --git a/game/modules/tome/data/zones/tower-amon-sul/zone.lua b/game/modules/tome/data/zones/tower-amon-sul/zone.lua
index 24d8340c5966799872aabfd4fe437bf3b20448ae..7c81dfd219129a86f54e90549ddc3af8219e8709 100644
--- a/game/modules/tome/data/zones/tower-amon-sul/zone.lua
+++ b/game/modules/tome/data/zones/tower-amon-sul/zone.lua
@@ -11,7 +11,7 @@ return {
 		map = {
 			class = "engine.generator.map.Roomer",
 			nb_rooms = 10,
-			rooms = {"simple", "pilar"},
+			rooms = {"simple", "pilar", {"money_vault",5}},
 			lite_room_chance = 100,
 			['.'] = "FLOOR",
 			['#'] = "WALL",