diff --git a/game/modules/tome/data/maps/vaults/amon-sul-crypt.lua b/game/modules/tome/data/maps/vaults/amon-sul-crypt.lua
index c0b82948272eb270c9ad3c9796dddfc111fe8af3..ce11e654dba5746de6acde089e8a9b1e48613ebb 100644
--- a/game/modules/tome/data/maps/vaults/amon-sul-crypt.lua
+++ b/game/modules/tome/data/maps/vaults/amon-sul-crypt.lua
@@ -18,36 +18,90 @@
 -- darkgod@te4.org
 
 setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
---setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {special=false, can_open=true}}
+
 specialList("actor", {
-	"/data/general/npcs/skeleton.lua",
+   "/data/general/npcs/skeleton.lua",
+   "/data/general/npcs/ghoul.lua",
 })
 border = 0
 defineTile('.', "FLOOR")
+defineTile(',', data.floor or data['.'] or "FLOOR")
 defineTile('#', "WALL")
 defineTile('X', "HARDWALL")
 defineTile('!', "DOOR_VAULT")
 defineTile('D', "DOOR")
-defineTile('^', "FLOOR", nil, nil, {random_filter={add_levels=4}})
-defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="degenerated skeleton warrior", add_levels=4}})
-defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault"}}, nil)
-defineTile('G', "FLOOR", nil, {random_filter={name="armoured skeleton warrior", add_levels=4}})
+
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+startx = 4
+starty = 2
 
---startx, starty = 4, 13
+local version = rng.range(1, 4)
+if version == 1 then -- warriors(more or less the original)
+defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="skeleton warrior", add_levels=2}})
+defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault", add_levels=5}}, {random_filter={name="skeleton warrior", add_levels=6}})
+defineTile('G', "FLOOR", nil, {random_filter={name="armoured skeleton warrior" , add_levels=4}})
+return {
+[[,,,,,,,,,]],
+[[,,,X.X,,,]],
+[[,,XX!XX,,]],
+[[,XXX.XXX,]],
+[[,XSD.DSX,]],
+[[,XXXGXXX,]],
+[[,XSD.DAX,]],
+[[,XXX.XXX,]],
+[[,,XX!XX,,]],
+[[,,,X.X,,,]],
+[[,,,,,,,,,]],
+}
+elseif version == 2 then -- mages
+defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="skeleton mage", add_levels=2}})
+defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault", add_levels=5}}, {random_filter={name="skeleton magus", add_levels=6}})
+defineTile('G', "FLOOR", nil, {random_filter={name="skeleton mage" , add_levels=4}})
+return {
+[[,,,,,,,,,]],
+[[,,,X.X,,,]],
+[[,,XX!XX,,]],
+[[,XXX.XXX,]],
+[[,XSX.XSX,]],
+[[,X.DAD.X,]],
+[[,XSX.XGX,]],
+[[,XXX.XXX,]],
+[[,,XX!XX,,]],
+[[,,,X.X,,,]],
+[[,,,,,,,,,]],
+}
+elseif version == 3 then -- ghouls
+defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="ghoul", add_levels=2}})
+defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault", add_levels=5}}, {random_filter={name="ghast", add_levels=6}})
+defineTile('G', "FLOOR", nil, {random_filter={name="ghoul" , add_levels=4}})
+return {
+[[,,,,,,,,,]],
+[[,,,X.X,,,]],
+[[,,XX!XX,,]],
+[[,XX..,XX,]],
+[[,XS..XSX,]],
+[[,X,.A,,X,]],
+[[,XSX..GX,]],
+[[,XX..,XX,]],
+[[,,XX!XX,,]],
+[[,,,X.X,,,]],
+[[,,,,,,,,,]],
+}
+else -- archers
+defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="skeleton archer", add_levels=2}})
+defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault", add_levels=5}}, {random_filter={name="skeleton master archer", add_levels=6}})
+defineTile('G', "FLOOR", nil, {random_filter={name="skeleton archer" , add_levels=4}})
 return {
-[[.........]],
-[[...X.X...]],
-[[..XX!XX..]],
-[[.XXX^XXX.]],
-[[.XSD.DSX.]],
-[[.XXXGXXX.]],
-[[.XSD.DAX.]],
-[[.XXX^XXX.]],
-[[..XX!XX..]],
-[[...X.X...]],
-[[.........]],
-[[.#..#..#.]],
-[[.........]],
-[[.........]],
+[[,,,,,,,,,]],
+[[,,,X.X,,,]],
+[[,,XX!XX,,]],
+[[,XX..XXX,]],
+[[,X.SXXGX,]],
+[[,XX.A.XX,]],
+[[,XSXXS.X,]],
+[[,XXX..XX,]],
+[[,,XX!XX,,]],
+[[,,,X.X,,,]],
+[[,,,,,,,,,]],
 }
+end
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/auto/greater/living-weapons.lua b/game/modules/tome/data/maps/vaults/auto/greater/living-weapons.lua
new file mode 100644
index 0000000000000000000000000000000000000000..2dadf192e6ebffa757348f33abec8115d39aeb47
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/auto/greater/living-weapons.lua
@@ -0,0 +1,243 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2019 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 = 12
+starty = 10
+
+setStatusAll{no_teleport=true}
+rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+
+local Talents = require("engine.interface.ActorTalents")
+--make other requirement equipment from Cursed Sentry
+local make_req = function(el, o, subtype, slot)
+    local o2 = nil
+    if o.subtype == subtype then
+        o2 = o:clone()
+        o2.no_drop = true
+    else
+        local level = o.material_level or 1
+        -- Code from cursed aura
+        local egos = o.egos_number or (o.ego_list and #o.ego_list) or (o.egoed and 1) or 0
+        local greater = o.greater_ego or 0
+        local double_greater = (o.unique and egos == 0) or greater > 1  -- artifact or purple
+        local greater_normal = (o.unique and egos > 2) or greater == 1 and egos > 1 -- randart or blue
+        local greater = (o.unique and egos > 0) or greater == 1 and egos == 1  -- rare or blue
+        local double_ego = not o.unique and greater == 0 and egos > 1
+        local ego = not o.unique and greater == 0 and egos == 1
+        local filter = {subtype=subtype, ignore_material_restriction=true, tome={double_greater=double_greater and 1, greater_normal=greater_normal and 1,
+        greater = greater and 1, double_ego = double_ego and 1, ego = ego and 1}, special = function(e) return not e.unique and e.material_level == level end}
+        o2 = game.zone:makeEntity(game.level, "object", filter, nil, true)
+        o2.no_drop = true
+        if slot == "QUIVER" then o2.infinite = true end
+    end
+    el[#el+1] = {o2, slot or "OFFHAND"}
+end
+
+local imbueEgo = function(gem, object)
+   if not gem then return end
+   if not object then return end
+   local Entity = require("engine.Entity")
+   local ego = Entity.new{
+      fake_ego = true,
+      name = "imbued_"..gem.name,
+      keywords = {[gem.name] = true},
+      wielder = table.clone(gem.imbue_powers, true),
+      been_imbued = true,
+      egoed = true,
+   }
+   if gem.talent_on_spell then ego.talent_on_spell = table.clone(gem.talent_on_spell, true) end  -- Its really weird that this table structure is different for one property
+   game.zone:applyEgo(object, ego, "object", true)
+end
+-- A lot of elseif
+local make_poltergeist = function(type)
+    local o = nil
+    local filter = nil
+    local x_level = nil
+    if type == "greater" then
+        filter = {no_tome_drops=true, unique=true, special=function(o) return (o.slot == "MAINHAND") end}
+        x_level = math.max(15, resolvers.current_level + 10)
+    else
+        filter = {id=true, add_levels=5, force_tome_drops=true, tome_drops="store", tome_mod="gvault", special=function(o) return (o.slot == "MAINHAND") end}
+        x_level = math.max(10, resolvers.current_level + 5)
+    end
+    o = game.zone:makeEntity(game.level, "object", filter, nil, true)
+    o.no_drop = false
+    local e = mod.class.NPC.new{
+        type = "construct", subtype = "weapon",
+        display = o.display, color=o.color, image = o.image, blood_color = colors.GREY,
+        faction = "enemies",
+        body = { INVEN = 10, MAINHAND=1, OFFHAND=1, QUIVER=1,PSIONIC_FOCUS=1},
+        level_range = {x_level, nil},
+        size_category = 1,
+        ai = "tactical", ai_state = { talent_in=2, ai_move="move_astar", },
+        ai_tactic = resolvers.tactic"melee",
+        max_life = resolvers.rngavg(100,120),
+        stats = {wil= 20, cun = 20, mag = 20, con = 20},
+        resolvers.sustains_at_birth(),
+        resolvers.talents{
+            [Talents.T_WEAPON_COMBAT]={base=1, every=10, max=5},
+        }
+    }
+    local class = nil
+    local req = nil
+    local el = {}
+    if o.subtype == "staff" then
+        class = "Archmage"
+        e.autolevel = "warriormage"
+        e[#e+1] = resolvers.talents{
+            [Talents.T_CHANNEL_STAFF]={base=1, every=10, max=5},
+            [Talents.T_FLAME]={base=1, every=10, max=5},
+        }
+    elseif o.subtype == "dagger" then
+        class = "Rogue"
+        e.autolevel = "rogue"
+        e[#e+1] = resolvers.talents{
+            [Talents.T_KNIFE_MASTERY]={base=1, every=10, max=5},
+        }
+        make_req(el, o, "dagger")
+    elseif o.subtype == "longbow" then
+        class = "Archer"
+        e.autolevel = "warrior"
+        e.ai_tactic = resolvers.tactic"ranged"
+        e[#e+1] = resolvers.talents{
+            [Talents.T_MASTER_MARKSMAN] = {base=1, every=10, max=5},
+        }
+        make_req(el, o, "arrow", "QUIVER")
+    elseif o.subtype == "sling" then
+        class = "Skirmisher"
+        e.autolevel = "rogue"
+        e.ai_tactic = resolvers.tactic"ranged"
+        e[#e+1] = resolvers.talents{
+            [Talents.T_SKIRMISHER_SLING_SUPREMACY] = {base=1, every=10, max=5},
+            [Talents.T_SKIRMISHER_KNEECAPPER] = {base=1, every=10, max=5},
+            [Talents.T_SHOOT] = 1
+        }
+        make_req(el, o, "shield")
+        make_req(el, o, "shot", "QUIVER")
+    elseif o.subtype == "mindstar" then
+        class = "Mindslayer"
+        e.autolevel = "wildcaster"
+        e[#e+1] = resolvers.talents{
+            [Talents.T_PSIBLADES] = {base=1, every=10, max=5},
+            [Talents.T_TELEKINETIC_SMASH] = 1,
+        }
+        e[#e+1] = resolvers.equip{
+            {type="weapon", subtype="greatsword", autoreq=true, force_inven = "PSIONIC_FOCUS", no_drops=true},
+        }
+        make_req(el, o, "mindstar")
+    elseif o.type == "weapon" and o.slot_forbid == "OFFHAND" then
+        class = "Berserker"
+        e.autolevel = "warrior"
+        e[#e+1] = resolvers.talents{
+            [Talents.T_WEAPONS_MASTERY]={base=1, every=10, max=5},
+        }
+    elseif o.type == "weapon" and o.offslot == nil then
+        class = "Bulwark"
+        e.autolevel = "warrior"
+        e[#e+1] = resolvers.talents{
+            [Talents.T_WEAPONS_MASTERY]={base=1, every=10, max=5},
+            [Talents.T_ARMOUR_TRAINING]=2
+        }
+        make_req(el, o, "shield")
+    end
+    e[#e+1] = resolvers.auto_equip_filters(class)
+
+    if type == "greater"  then
+        e.name = "Poltergeist " .. o.name
+        e.rank = 3.5
+        e.auto_classes={
+            {class=class, start_level=10, level_rate=80},
+            {class="Cursed", start_level=20, level_rate=40}
+        }
+    else
+        e.name = "Animated " .. o.name
+        e.rank = 3
+        e.auto_classes={
+            {class=class, start_level=10, level_rate=50}
+        }
+    end
+    if type == "greater" then
+        local filter = {type="gem", ignore_material_restriction=true,special=function(ee) return ee.material_level == o.material_level end}
+        gem = game.zone:makeEntity(game.level, "object", filter, nil, true)
+        imbueEgo(gem, o)
+        o.name = "Poltergeist's " .. o.name
+    end
+    local qo = nil
+    --if class ==
+    e:resolve()
+    e:resolve(nil, true)
+    e:wearObject(o, true, false, "MAINHAND")
+    for _, v in ipairs(el) do
+        e:wearObject(v[1], true, false, v[2])
+    end
+    return e
+end
+specialList("actor", {
+    "/data/general/npcs/wight.lua",
+    "/data/general/npcs/skeleton.lua",
+    "/data/general/npcs/horror.lua",
+})
+
+
+-- Here I use a simple workaround to generate various different animated weapons.
+-- Animated weapons at different spots ('p' or 'P') will be replaced to a, b, c, d, ... etc
+-- So, I can't use characters at the start of the alphebet, and the number of animated wepons is limitted.
+defineTile('#', "WALL")
+defineTile('+', "DOOR")
+defineTile('.', "FLOOR")
+defineTile('X', "HARDWALL")
+defineTile('!', "DOOR_VAULT")
+defineTile('U', "FLOOR", {random_filter={type="armor", add_levels=5, tome_mod="gvault"}}, nil)
+defineTile('V', "FLOOR", {random_filter={type="weapon", add_levels=5, tome_mod="gvault"}}, nil)
+defineTile('Z', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}}, nil)
+defineTile('w', "FLOOR", nil, {random_filter={name='blade horror', add_levels=10}})
+defineTile('x', "FLOOR", nil, {random_filter={subtype='wight', add_levels=5}})
+defineTile('y', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}}, {random_filter={subtype='eldritch', add_levels=10}})
+defineTile('z', "FLOOR", nil, {random_filter={subtype='skeleton', add_levels=5}})
+
+local def = {
+    [[XXXXXXXXXXXXXXX]],
+    [[XU#.Vx.#....pZX]],
+    [[XP+.p..+.....pX]],
+    [[XV#.Ux.##z..y.X]],
+    [[X##+######z...X]],
+    [[Xp..#..P.##...X]],
+    [[X...#p...p##+#X]],
+    [[XU.p#.....#z.zX]],
+    [[XU..###+###.p.X]],
+    [[XpZZ+..w###...X]],
+    [[XXXXXXXXXXXX!XX]],
+   }
+local pd_small = 'a'
+local pd_big = 'A'
+for x = 1, #(def[1]) do
+    for y = 1, #def do
+        if def[y]:sub(x, x) == "p" then
+            defineTile(pd_small, "FLOOR", nil, make_poltergeist("normal"))
+            def[y] = def[y]:sub(1, x-1)..pd_small..def[y]:sub(x+1, #def[y])
+            pd_small = string.char(string.byte(pd_small) + 1)
+            print(def[y])
+        elseif def[y]:sub(x, x) == "P" then
+            defineTile(pd_big, "FLOOR", nil, make_poltergeist("greater"))
+            def[y] = def[y]:sub(1, x-1)..pd_big..def[y]:sub(x+1, #def[y])
+            pd_big = string.char(string.byte(pd_big) + 1)
+            print(def[y])
+        end
+    end
+end
+return def
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/auto/greater/sleeping-dragons.lua b/game/modules/tome/data/maps/vaults/auto/greater/sleeping-dragons.lua
new file mode 100644
index 0000000000000000000000000000000000000000..093dd1702eb25ea5c404620173097b073864b2f2
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/auto/greater/sleeping-dragons.lua
@@ -0,0 +1,142 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2019 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 = 4
+starty = 7
+
+setStatusAll{no_teleport=true}
+rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+
+defineTile('o', "WALL")
+defineTile('.', "FLOOR")
+defineTile('#', "HARDWALL")
+defineTile('X', "DOOR_VAULT")
+
+local Talents = require("engine.interface.ActorTalents")
+specialList("actor", {
+   "/data/general/npcs/cold-drake.lua",
+   "/data/general/npcs/fire-drake.lua",
+   "/data/general/npcs/storm-drake.lua",
+   "/data/general/npcs/venom-drake.lua"
+}, true)
+local wyrm_types = {
+   cold={"cold drake", "ice wyrm"},
+   fire={"fire drake", "fire wyrm"},
+   storm={"storm drake", "storm wyrm"},
+   venom={"venom drake", "venom wyrm"}
+}
+local wyrm_types_names = {"cold", "fire", "storm", "venom"}
+roomCheck(function(room, zone, level, map)
+   local wyrm_types_name = rng.table(wyrm_types_names)
+   local wyrm_type = wyrm_types[wyrm_types_name]
+   local drake_name, wyrm_name = wyrm_type[1], wyrm_type[2]
+   for i, e in ipairs(room.npc_list) do -- set up special wyrm rarity
+      if not e.wyrm_rarity and e.name == wyrm_name then
+         e.wyrm_rarity = e.rarity; e.rarity = nil
+      elseif not e.drake_rarity and e.name == drake_name then
+         e.drake_rarity = e.rarity; e.rarity = nil
+      end
+   end
+   return true
+end)
+local check_sleep = function(self)
+   if game.level.wyrm_awoken == true then
+      return true
+   end
+   if not game.level.seen_wyrm_awoken then
+      game.level.seen_wyrm_awoken = true
+      game.log("The dragons here are asleep. You may try to steal their treasure... at your own risk.")
+   end
+   if not self:hasEffect(self.EFF_SLEEP) then
+      self:setEffect(self.EFF_SLEEP, 999, {src=self, power=1, waking=0, insomnia=0, contagious=0})
+   end
+   return true
+end
+local aggro_wyrm = function()
+   if game.level.wyrm_awoken == true then
+      return false
+   end
+   game.level.wyrm_awoken = true
+   for uid, e in pairs(game.level.entities) do
+      if e.sleeping_wyrm == true then
+         e:removeEffect(e.EFF_SLEEP)
+         e:setTarget(game.player)
+      end
+   end
+   game.log("#CRIMSON#The dragons awaken from their slumber detecting their loot being stolen!")
+   return true
+end
+local aggro_wyrm_takehit = function(self, value, src)
+   aggro_wyrm()
+   return value
+end
+local aggro_wyrm_grid = function(chance)
+   local g = game.zone.grid_list.FLOOR:clone()
+   g.on_move = function(self, x, y, actor, forced)
+      if not actor.player then return end
+      if forced then return end
+      if game.level.wyrm_awoken then return end
+      if not rng.percent(chance) then return end
+      aggro_wyrm()
+   end
+   return g
+end
+defineTile('1', aggro_wyrm_grid(2), {random_filter={add_levels=25, type="money"}})
+defineTile('2', aggro_wyrm_grid(5), {random_filter={add_levels=10, tome_mod="uvault"}})
+defineTile('3', aggro_wyrm_grid(25), {random_filter={add_levels=15, tome_mod="gvault"}})
+defineTile('W', "FLOOR", nil,
+   {entity_mod=function(e)
+      e.make_escort = nil
+      e.on_seen = check_sleep
+      e.on_act = check_sleep
+      e.on_takehit = aggro_wyrm_takehit
+      e.sleeping_wyrm = true
+      return e
+   end,
+   random_filter={special_rarity="wyrm_rarity",
+      add_levels=15,
+      random_boss={name_scheme="Sleeping #rng#", force_classes={Wyrmic=true}, nb_classes=0, loot_quality="store", loot_quantity=1, rank=3.5}
+      }
+   }
+)
+defineTile('D', "FLOOR", nil,
+   {entity_mod=function(e)
+      e.make_escort = nil
+      e.on_seen = check_sleep
+      e.on_act = check_sleep
+      e.on_takehit = aggro_wyrm_takehit
+      e.sleeping_wyrm = true
+      return e
+   end,
+   random_filter={special_rarity="drake_rarity",
+      add_levels=15,
+      random_boss={name_scheme="Dozing #rng#", force_classes={Wyrmic=true}, nb_classes=0, loot_quality="store", loot_quantity=1, rank=3.5}
+      }
+   }
+)
+return {
+ [[#########]],
+ [[#...W...#]],
+ [[#..131..#]],
+ [[#..232..#]],
+ [[#D.121.D#]],
+ [[#..111..#]],
+ [[#..o.o..#]],
+ [[####X####]],
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/circle.lua b/game/modules/tome/data/maps/vaults/auto/lesser/circle.lua
index 56ff336a09cc64e5fab064b93761d6db0fe9205f..1f81f194ac552b1a9fe88a4acc7280371f18277a 100644
--- a/game/modules/tome/data/maps/vaults/auto/lesser/circle.lua
+++ b/game/modules/tome/data/maps/vaults/auto/lesser/circle.lua
@@ -30,9 +30,10 @@ defineTile('3', "FLOOR", {random_filter={add_levels=5}}, nil)
 
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
 
---startx = 5
---starty = 0
-
+startx = 5
+starty = 1
+local version = rng.range(1, 5)
+if version == 1 then
 return {
 [[,,,,,,,,,,,]],
 [[,,,XX!XX,,,]],
@@ -50,4 +51,81 @@ return {
 [[,,XX.1.XX,,]],
 [[,,,XXXXX,,,]],
 [[,,,,,,,,,,,]],
-}
\ No newline at end of file
+}
+elseif version == 2 then
+return {
+[[,,,,,,,,,,,]],
+[[,,,XX!XX,,,]],
+[[,,XX.2.XX,,]],
+[[,XXXXDXXXX,]],
+[[,X3X3.3X3X,]],
+[[,X.X...X.X,]],
+[[,XDXXDXXDX,]],
+[[,X2D.2.D2X,]],
+[[,XDXXDXXDX,]],
+[[,X.X...X.X,]],
+[[,X3X3.3X3X,]],
+[[,XXXX.XXXX,]],
+[[,XXXXDXXXX,]],
+[[,,XX.1.XX,,]],
+[[,,,XXXXX,,,]],
+[[,,,,,,,,,,,]],
+}
+elseif version == 3 then
+return {
+[[,,,,,,,,,,,]],
+[[,,,XX!XX,,,]],
+[[,,XXX2XXX,,]],
+[[,XX3D.D3XX,]],
+[[,XXDXXXDXX,]],
+[[,X..3X3..X,]],
+[[,XXDXXXDXX,]],
+[[,X..D2D..X,]],
+[[,XXXXDXXXX,]],
+[[,X32X2X23X,]],
+[[,XXDXDXDXX,]],
+[[,X3.....3X,]],
+[[,XXXXDXXXX,]],
+[[,,XX.1.XX,,]],
+[[,,,XXXXX,,,]],
+[[,,,,,,,,,,,]],
+}
+elseif version == 4 then
+return {
+[[,,,,,,,,,,,]],
+[[,,,XX!XX,,,]],
+[[,,XX...XX,,]],
+[[,XXX.2.XXX,]],
+[[,X2D...D2X,]],
+[[,X.XXDXX.X,]],
+[[,X.X...X.X,]],
+[[,X.X.2.X.X,]],
+[[,X3X...X3X,]],
+[[,X3X...X3X,]],
+[[,X3XXDXX3X,]],
+[[,X3X...X3X,]],
+[[,XXX.1.XXX,]],
+[[,,XX...XX,,]],
+[[,,,XXXXX,,,]],
+[[,,,,,,,,,,,]],
+}
+else
+return {
+[[,,,,,,,,,,,]],
+[[,,,XX!XX,,,]],
+[[,,XXX2XXX,,]],
+[[,XXXX.XXXX,]],
+[[,X33X.X33X,]],
+[[,XDXXDXXDX,]],
+[[,X2D...D2X,]],
+[[,XDXXDXXDX,]],
+[[,X.X...X.X,]],
+[[,X.X.2.X.X,]],
+[[,X.XXDXX.X,]],
+[[,X3.D1D.3X,]],
+[[,XXXX.XXXX,]],
+[[,,XX3.3XX,,]],
+[[,,,XXXXX,,,]],
+[[,,,,,,,,,,,]],
+}
+end
diff --git a/game/modules/tome/data/maps/vaults/forest-snake-pit.lua b/game/modules/tome/data/maps/vaults/auto/lesser/crystal-cabal.lua
similarity index 61%
rename from game/modules/tome/data/maps/vaults/forest-snake-pit.lua
rename to game/modules/tome/data/maps/vaults/auto/lesser/crystal-cabal.lua
index 13024412378f64643cd6bc29e6fad4bcbcfae9c9..b50dd1ae5ec871ec1f113f29cfe8e0e93f2490d9 100644
--- a/game/modules/tome/data/maps/vaults/forest-snake-pit.lua
+++ b/game/modules/tome/data/maps/vaults/auto/lesser/crystal-cabal.lua
@@ -18,25 +18,33 @@
 -- darkgod@te4.org
 
 setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
+roomCheck(function(room, zone, level, map)
+   return resolvers.current_level >= 5 and resolvers.current_level <= 25
+end)
 specialList("actor", {
-	"/data/general/npcs/snake.lua",
+   "/data/general/npcs/crystal.lua",
 })
-rotates = {"default", "90", "180", "270", "flipx", "flipy"}
-
-defineTile(',', "GRASS")
-defineTile(';', "FLOWER")
-defineTile('#', "WALL")
-defineTile('X', "TREE")
-defineTile('x', "DOOR_VAULT")
+border = 0
+startx, starty = 4, 10
+defineTile('.', data.floor or "FLOOR")
+defineTile(',', "FLOOR")
+defineTile('!', "DOOR_VAULT")
+defineTile('X', "HARDWALL")
+defineTile('G', "FLOOR", {random_filter={type="gem"}})
+defineTile('C', "FLOOR", nil, {random_filter={subtype="crystal", add_levels=4}})
 
-defineTile('s', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, {random_filter={name="rattlesnake"}})
+rotates = {"default", "90", "180", "270", "flipx", "flipy"}
 
 return {
-[[,,,,,,,,,]],
-[[,#####,,,]],
-[[;#sss#,X,]],
-[[,#sssx,,,]],
-[[,#sss#,,,]],
-[[,#####;,,]],
-[[,,,,,,,,,]],
+[[.........]],
+[[.XXXXXXX.]],
+[[.XXXXXXX.]],
+[[.X,C,C,X.]],
+[[.XGG,GGX.]],
+[[.XGG,GGX.]],
+[[.X,C,C,X.]],
+[[.XXX!XXX.]],
+[[.XXX.XXX.]],
+[[.XXX.XXX.]],
+[[.........]],
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/mage-hideout.lua b/game/modules/tome/data/maps/vaults/auto/lesser/mage-hideout.lua
index feb0f8047736ab87cd6cfdd8ffa4a8d20f8dde5d..e0bc764ed483f3c29fd9c41380cb9d85fa7516f8 100644
--- a/game/modules/tome/data/maps/vaults/auto/lesser/mage-hideout.lua
+++ b/game/modules/tome/data/maps/vaults/auto/lesser/mage-hideout.lua
@@ -20,23 +20,37 @@
 setStatusAll{no_teleport=true, no_vaulted=true}
 border = 0 -- override normal vault border
 roomCheck(function(room, zone, level, map)
-	return resolvers.current_level <= 20
+   return resolvers.current_level <= 20
 end)
 specialList("actor", {
-	"/data/general/npcs/skeleton.lua",
+   "/data/general/npcs/skeleton.lua",
+   "/data/general/npcs/troll.lua",
+   "/data/general/npcs/thieve.lua",
+   "/data/general/npcs/spider.lua",
+   "/data/general/npcs/ghoul.lua",
 })
 specialList("terrain", {
-	"/data/general/grids/forest.lua",
+   "/data/general/grids/forest.lua",
 }, true)
+local mobs = {
+   "skeleton mage",
+   "skeleton magus",
+   "cave troll",
+   "thief",
+   "spitting spider",
+   "weaver young",
+   "ghast",
+}
+local mob = rng.tableRemove(mobs)
 local Floor = data.floor or data['.'] or "GRASS"
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
 defineTile(',', Floor)
 defineTile('#', "HARDWALL")
 defineTile('X', data.wall or data['#'] or "TREE")
 defineTile('+', "DOOR")
-defineTile('s', Floor, nil, {random_filter={name="skeleton mage", add_levels=6}})
-defineTile('$', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, nil)
-
+defineTile('s', Floor, nil, {random_filter={name=mob, add_levels=6}})
+defineTile('$', "FLOOR", {random_filter={type="scroll", add_levels=5, ego_chance=60}}, nil)
+defineTile('*', "FLOOR", {random_filter={mod="vault", add_levels=5, ego_chance=30}}, nil)
 startx = 1
 starty = 7
 
@@ -45,8 +59,8 @@ return {
 [[X,,X,,,X,X,]],
 [[X,X,,,,,,XX]],
 [[X,X,,s####X]],
-[[X,X,,,#$$#X]],
-[[X,XX,,+$$#X]],
+[[X,X,,,#*$#X]],
+[[X,XX,,+$*#X]],
 [[X,,XX,####X]],
 [[X,,,XXXXXXX]],
 }
diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/skeleton-mage-cabal.lua b/game/modules/tome/data/maps/vaults/auto/lesser/skeleton-mage-cabal.lua
index 5799fa76cedc9c3cc091b87077848743dad5f30c..09dbadd3aca861881adeb308678ed140958c6c96 100644
--- a/game/modules/tome/data/maps/vaults/auto/lesser/skeleton-mage-cabal.lua
+++ b/game/modules/tome/data/maps/vaults/auto/lesser/skeleton-mage-cabal.lua
@@ -19,11 +19,38 @@
 
 setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
 roomCheck(function(room, zone, level, map)
-	return resolvers.current_level >= 5 and resolvers.current_level <= 25
+   return resolvers.current_level >= 5 and resolvers.current_level <= 25
 end)
 specialList("actor", {
-	"/data/general/npcs/skeleton.lua",
+   "/data/general/npcs/skeleton.lua",
+   "/data/general/npcs/thieve.lua",
+   "/data/general/npcs/horror.lua",
 })
+specialList("terrain", {
+   "/data/general/grids/forest.lua",
+}, true)
+local mobs = {
+   "skeleton mage",
+   "skeleton warrior",
+   "skeleton archer",
+   "thief",
+   "bloated horror",
+}
+local mob = rng.tableRemove(mobs)
+
+local weapon = "staff"
+if mob == "skeleton warrior" then weapon = rng.percent(50) and "waraxe" or "battleaxe"
+elseif   mob == "skeleton archer" then weapon = "longbow"
+elseif   mob == "thief" then weapon = rng.percent(50) and "dagger" or "sling"
+elseif   mob == "bloated horror" then weapon = "mindstar"
+end
+
+local armor = "cloth"
+if mob == "skeleton warrior" then armor = rng.percent(50) and "shield" or "massive"
+elseif   mob == "skeleton archer" then armor = rng.percent(50) and "light" or "heavy"
+elseif   mob == "thief" then armor = "light"
+end
+
 border = 0
 startx, starty = 4, 10
 defineTile('.', data.floor or "FLOOR")
@@ -31,22 +58,22 @@ defineTile(',', "FLOOR")
 defineTile('D', "DOOR")
 defineTile('!', "DOOR_VAULT")
 defineTile('X', "HARDWALL")
-defineTile('W', "FLOOR", {random_filter={subtype="staff", tome_mod="vault", add_levels=4}})
-defineTile('S', "FLOOR", {random_filter={type="scroll", ego_chance=25, add_levels=4}})
-defineTile('M', "FLOOR", nil, {random_filter={name="skeleton mage", add_levels=4}})
-
+defineTile('S', "FLOOR", {random_filter={type="scroll", ego_chance=50, add_levels=6}})
+defineTile('W', "FLOOR", {random_filter={subtype=weapon, tome_mod="vault", add_levels=6, ego_chance=100}})
+defineTile('A', "FLOOR", {random_filter={subtype=armor, tome_mod="vault", add_levels=6, ego_chance=100}})
+defineTile('M', "FLOOR", nil, {random_filter={name=mob, add_levels=8}})
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
 
 return {
 [[.........]],
 [[.XXXXXXX.]],
-[[.XSSSSSX.]],
+[[.XASSSWX.]],
 [[.XXXDXXX.]],
 [[.X,,M,,X.]],
 [[.X,M,M,X.]],
 [[.X,,M,,X.]],
 [[.XDX!XDX.]],
-[[.XWX.XWX.]],
+[[.XWX.XAX.]],
 [[.XXX.XXX.]],
 [[.........]],
 }
diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/thief-hideout.lua b/game/modules/tome/data/maps/vaults/auto/lesser/thief-hideout.lua
index 34b419495a1c2a75be2a414ceb9bf8c5d6870925..4f51a272cbe09ae2436d9138dfd821257e40a2f4 100644
--- a/game/modules/tome/data/maps/vaults/auto/lesser/thief-hideout.lua
+++ b/game/modules/tome/data/maps/vaults/auto/lesser/thief-hideout.lua
@@ -19,42 +19,92 @@
 
 setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
 specialList("actor", {
-	"/data/general/npcs/thieve.lua",
+   "/data/general/npcs/thieve.lua",
 })
 specialList("terrain", {
-	"/data/general/grids/forest.lua",
+   "/data/general/grids/forest.lua",
 }, true)
 border = 0
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
 
 defineTile('.', "FLOOR")
 defineTile(',', data.floor or data['.'] or "GRASS")
-defineTile('#', "WALL")
-defineTile('X', "HARDWALL")
+defineTile('#', "HARDWALL")
 defineTile('+', "DOOR")
 defineTile('!', "DOOR_VAULT")
+local mobs = {
+   "bandit",
+   "rogue",
+   "cutpurse",
+}
+local bosses = {
+   "rogue sapper",
+   "assassin",
+   "shadowblade"
+}
 
-defineTile('p', "FLOOR", nil, {random_filter={name="rogue", add_levels=3}})
-defineTile('P', "FLOOR", nil, {random_filter={name="bandit", add_levels=5}})
+local boss = rng.tableRemove(bosses)
 
-defineTile('&', "FLOOR", {random_filter={type="scroll"}})
-defineTile('$', "FLOOR", "MONEY_SMALL")
-defineTile('*', "FLOOR", {random_filter={type="gem"}})
+defineTile('1', "FLOOR", nil, {random_filter={name=mobs[rng.range(0, #mobs)], add_levels=4}})
+defineTile('2', "FLOOR", nil, {random_filter={name=mobs[rng.range(0, #mobs)], add_levels=5}})
+defineTile('3', "FLOOR", nil, {random_filter={name=mobs[rng.range(0, #mobs)], add_levels=6}})
+defineTile('B', "FLOOR", nil, {random_filter={name=boss,  add_levels=boss=="shadowblade" and 0 or 12}})
+defineTile('T', "FLOOR", nil, {random_filter={name="thief", add_levels=10}})
 
+defineTile('&', "FLOOR", {random_filter={type="scroll", ego_chance=25}})
+defineTile('$', "FLOOR", {random_filter={add_levels=15, type="money"}})
+defineTile('*', "FLOOR", {random_filter={type="gem"}})
+defineTile('%', "FLOOR", {random_filter={mod="gvault", type="armor", add_levels=8}})
+defineTile('^', "FLOOR", {random_filter={mod="vault", type="weapon", add_levels=8}})
 --startx, starty = 10, 0
 
+local version = rng.range(1, 3)
+if version == 1 then
+return {
+[[,,,,,,,,,,,,,,]],
+[[,#######,,,,,,]],
+[[,#%#$$$#,,,,,,]],
+[[,#^#$*$#,,,,,,]],
+[[,#*#$$$#,,,,,,]],
+[[,#+##+###!###,]],
+[[,#B^#2#1...2#,]],
+[[,#&3+1#.312.#,]],
+[[,####.#..3..#,]],
+[[,#13#.#.....#,]],
+[[,#*2+.+..T..#,]],
+[[,############,]],
+[[,,,,,,,,,,,,,,]],
+}
+elseif version == 2 then
+return {
+[[,,,,,,,,,,,,,,]],
+[[,,,,,,,,,,,,,,]],
+[[,,,,,,,,,,,,,,]],
+[[,###########,,]],
+[[,.!..213$$.#,,]],
+[[,##+######+#,,]],
+[[,#..#*B*#12#,,]],
+[[,#..#132#3$#,,]],
+[[,#..#+#+####,,]],
+[[,#12..#$$&^#,,]],
+[[,#3T$*#$$%^#,,]],
+[[,###########,,]],
+[[,,,,,,,,,,,,,,]],
+}
+else
 return {
 [[,,,,,,,,,,,,,,]],
-[[,XXXXXXX,,,,,,]],
-[[,X*#$$$X,,,,,,]],
-[[,X*#$$$X,,,,,,]],
-[[,X*#$$$X,,,,,,]],
-[[,XXXX+XX#!###,]],
-[[,#..#.#.....#,]],
-[[,#.p+.#.p.p.#,]],
-[[,####.#..P..#,]],
-[[,#P.#.#.p.p.#,]],
-[[,#&.+.+.....#,]],
+[[,#!#####,,,,,,]],
+[[,#.#$*$#,,,,,,]],
+[[,#.#2$3#,,,,,,]],
+[[,#1#.1.#,,,,,,]],
+[[,#+#+#+######,]],
+[[,#...#.23...#,]],
+[[,#.23##1..B2#,]],
+[[,#.1T*#...3*#,]],
+[[,####+###+###,]],
+[[,#$$$$#%*^^&#,]],
 [[,############,]],
 [[,,,,,,,,,,,,,,]],
-}
\ No newline at end of file
+}
+end
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/worms.lua b/game/modules/tome/data/maps/vaults/auto/lesser/worms.lua
new file mode 100644
index 0000000000000000000000000000000000000000..82cf484aed5f2c46c9824f51559b8a6f4f4ffa3f
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/auto/lesser/worms.lua
@@ -0,0 +1,52 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2019 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 = 4
+starty = 7
+
+specialList("actor", {
+   "/data/general/npcs/horror.lua",
+   "/data/general/npcs/vermin.lua",
+})
+
+setStatusAll{no_teleport=true}
+rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+
+defineTile('o', "WALL")
+defineTile('.', "FLOOR")
+defineTile('#', "HARDWALL")
+defineTile('!', "DOOR_VAULT")
+
+defineTile('$', "FLOOR", {random_filter={add_levels=20, type="money"}})
+defineTile('*', "FLOOR", {random_filter={add_levels=15, tome_mod="gvault"}})
+defineTile('~', "FLOOR", {random_filter={add_levels=5, tome_mod="gvault"}})
+
+defineTile('w', "FLOOR", nil, {random_filter={add_levels=10, name = "carrion worm mass"}} )
+defineTile('W', "FLOOR", nil, {random_filter={add_levels=5, name = "worm that walks"}} )
+
+return {
+ [[#########]],
+ [[#~~w*w~~#]],
+ [[#..www..#]],
+ [[#..ooo..#]],
+ [[#.......#]],
+ [[#.Wo.oW.#]],
+ [[#$$o.o$$#]],
+ [[####!####]],
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/collapsed-tower.lua b/game/modules/tome/data/maps/vaults/collapsed-tower.lua
new file mode 100644
index 0000000000000000000000000000000000000000..972ee11a61f28f4816a500acd6a191c269e2e6f4
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/collapsed-tower.lua
@@ -0,0 +1,189 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2019 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 Talents = require("engine.interface.ActorTalents")
+
+setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
+
+local turret = function(version)
+   local NPC = require "mod.class.NPC"
+   local m = NPC.new{
+         type = "construct", subtype = "crystal", image="trap/trap_beam.png",
+         display = "t",
+         body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1, QUIVER=1 },
+         life_rating = 20,
+         rank = 2,
+         inc_damage = { all = -75, },
+   
+         open_door = true,
+         cut_immune = 1,
+         blind_immune = 1,
+         fear_immune = 1,
+         poison_immune = 1,
+         disease_immune = 1,
+         stone_immune = 1,
+         see_invisible = 30,
+         no_breath = 1,
+         infravision = 10,
+         never_move = 1,
+   
+         autolevel = "caster",
+         level_range = {1, nil}, exp_worth = 1,
+         stats = { mag=16, con=22 },
+         size_category = 2,
+         name = "elemental crystal", color=colors.BLUE,
+         combat = { dam=resolvers.rngavg(1,2), atk=2, apr=0, dammod={str=0.4} },
+         combat_armor = 10, combat_def = 0,
+         talent_cd_reduction={[Talents.T_ELEMENTAL_BOLT]=3, },
+   
+         resolvers.talents{
+            [Talents.T_ELEMENTAL_BOLT]={base=1, every=5, max=9},
+         },
+   
+         ai = "dumb_talented_simple", ai_state = { ai_move="move_complex", talent_in=3, },
+      
+      }
+   return m
+end
+
+local id = "collapsed-tower-"..game.turn
+
+local changer = function()
+   local npcs = mod.class.NPC:loadList{"/data/general/npcs/thieve.lua"}
+   local objects = mod.class.Object:loadList("/data/general/objects/objects.lua")
+   local terrains = mod.class.Grid:loadList("/data/general/grids/basic.lua")
+   terrains.DOWN.change_level_shift_back = true
+   terrains.DOWN.change_zone_auto_stairs = true
+   terrains.DOWN.name = "stairs back to "..game.zone.name
+   terrains.DOWN.change_zone = game.zone.short_name
+   local zone = mod.class.Zone.new(id, {
+      name = "collapsed tower",
+      level_range = {game.zone.base_level, game.zone.base_level},
+      __applied_difficulty = true, -- Difficulty already applied to parent zone
+      level_scheme = "player",
+      max_level = 1,
+      width = 20, height = 20,
+      ambient_music = "Swashing the buck.ogg",
+      reload_lists = false,
+      persistent = "zone",
+      
+      no_worldport = game.zone.no_worldport,
+      min_material_level = util.getval(game.zone.min_material_level),
+      max_material_level = util.getval(game.zone.max_material_level),
+      generator = {
+         map = {
+            class = "engine.generator.map.Static",
+            map = "zones/collapsed-tower",
+         },
+         trap = { nb_trap = {0, 0} },
+         object = { nb_object = {0, 0} },
+         actor = { nb_npc = {0, 0} },
+      },
+      npc_list = npcs,
+      grid_list = terrains,
+      object_list = objects,
+      trap_list = mod.class.Trap:loadList("/data/general/traps/natural_forest.lua"),
+   })
+   return zone
+end
+
+local stairs = function()
+   local terrains = mod.class.Grid:loadList("/data/general/grids/basic.lua")
+   local g = terrains.FLOOR:clone()
+   g.name = "collapsed tower"
+   g.always_remember = true
+   g.display='>' g.color_r=0 g.color_g=0 g.color_b=255 g.notice = true
+   g.change_level=1 g.change_zone=id g.glow=true
+   g:removeAllMOs()
+   if engine.Map.tiles.nicer_tiles then
+      g.add_displays = g.add_displays or {}
+      g.add_displays[#g.add_displays+1] = mod.class.Grid.new{image="terrain/stair_up.png", z=5}
+   end
+   g.nice_tiler = nil
+   g:altered()
+   g:initGlow()
+   g.real_change = changer
+   g.change_level_check = function(self)
+      game:changeLevel(1, self.real_change(self.change_zone), {temporary_zone_shift=true, direct_switch=true})
+      self.change_level_check = nil
+      self.real_change = nil
+      self.special_minimap = colors.VIOLET
+      return true
+   end
+   return g
+end
+
+
+specialList("terrain", {
+   "/data/general/grids/water.lua",
+   "/data/general/grids/forest.lua",
+}, true)
+border = 0
+--rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+
+defineTile('.', "FLOOR")
+defineTile(',', "GRASS")
+defineTile('#', "HARDWALL")
+defineTile('+', "DOOR")
+defineTile('!', "DOOR_VAULT")
+defineTile(';', "FLOWER")
+defineTile('~', "DEEP_WATER")
+defineTile('#', "WALL")
+defineTile('X', "TREE")
+
+specialList("actor", {
+   "/data/general/npcs/construct.lua",
+   "/data/general/npcs/plant.lua",
+   "/data/general/npcs/skeleton.lua",
+   "/data/general/npcs/bear.lua",   
+})
+specialList("trap", {
+   "/data/general/traps/natural_forest.lua",
+})
+
+defineTile('a', "FLOOR", {random_filter={add_levels=5, tome_mod="vault"}}, nil)
+defineTile('S', "FLOOR", {random_filter={type="scroll", ego_chance=100}}, nil)
+defineTile('$', "FLOOR", {random_filter={add_levels=25, type="money"}})
+defineTile('g', "FLOOR", nil, {random_filter={add_levels=5, name="broken golem"}})
+defineTile('p', "GRASS", nil, {random_filter={add_levels=5, name="poison ivy"}})
+defineTile('v', "GRASS", nil, {random_filter={add_levels=5, name="giant venus flytrap"}})
+defineTile('s', "FLOOR", {random_filter={add_levels=5, tome_mod="vault"}}, {random_filter={add_levels=5, name="skeleton mage"}})
+defineTile('b', "FLOWER", nil, {random_filter={name="black bear"}})
+defineTile('t', "FLOOR", nil, turret(version))
+defineTile('^', "FLOOR", nil, nil, {random_filter={name="sliding rock"}})
+defineTile('<', stairs())
+
+return {
+[[,,,,,,,,;;;;;,,,,]],
+[[,,X##,,#;~~~;,,,,]],
+[[,.##,,##;~~~;##,,]],
+[[,...XXX,b;;;b###,]],
+[[,##.........####,]],
+[[,######..####.##,]],
+[[.#.#..#####...t#,]],
+[[.!...^t#.<+sp;a#,]],
+[[.#.#..##..#,;;.#,]],
+[[,#.##+#####p...#,]],
+[[,#g#p,,,^.#....#,]],
+[[,###..;;^v##+###,]],
+[[,,##.vp,,....##,,]],
+[[,,,##$$SSS$$##,,,]],
+[[,,,,#########,,,,]],
+[[,,,,,,,,,,,,,,,,,]],
+}
diff --git a/game/modules/tome/data/maps/vaults/flooded-prison.lua b/game/modules/tome/data/maps/vaults/flooded-prison.lua
new file mode 100644
index 0000000000000000000000000000000000000000..5d89a2e687abd0ed274b362e8b99d8d5ad62649b
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/flooded-prison.lua
@@ -0,0 +1,53 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2019 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 = 1
+starty = 2
+
+setStatusAll{no_teleport=true, vault_only_door_open=true}
+rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+
+specialList("actor", {
+   "/data/general/npcs/aquatic_demon.lua",
+   "/data/general/npcs/horror_aquatic.lua",
+   "/data/general/npcs/naga.lua",
+})
+
+specialList("terrain", {
+        "/data/general/grids/water.lua",
+        "/data/general/grids/basic.lua",
+})
+
+defineTile('#', "HARDWALL")
+defineTile('~', "WATER_FLOOR")
+defineTile('X', "DOOR_VAULT")
+defineTile('%', "DOOR")
+defineTile('8', "WATER_FLOOR", {random_filter={add_levels=18, tome_mod="gvault"}}, {random_filter={add_levels=20}})
+
+return {
+   [[~~~~~~~~~~~~~]],
+   [[~###########~]],
+   [[~X8%8%8%8%8#~]],
+   [[~#########%#~]],
+   [[~#8%8%8%8%8#~]],
+   [[~#%#########~]],
+   [[~#8%8%8%8%8X~]],
+   [[~###########~]],
+   [[~~~~~~~~~~~~~]],
+}
diff --git a/game/modules/tome/data/maps/vaults/forest-ruined-building1.lua b/game/modules/tome/data/maps/vaults/forest-ruined-building1.lua
index 01147d97f92009169b5d32e48afa5974707c6952..b9ad32c834d7280c31ae603165ff56dda7d3316f 100644
--- a/game/modules/tome/data/maps/vaults/forest-ruined-building1.lua
+++ b/game/modules/tome/data/maps/vaults/forest-ruined-building1.lua
@@ -19,30 +19,79 @@
 
 setStatusAll{no_teleport=true, room_map = {can_open=true}}
 specialList("actor", {
-	"/data/general/npcs/troll.lua",
+   "/data/general/npcs/troll.lua",
+   "/data/general/npcs/ghoul.lua",
+   "/data/general/npcs/thieve.lua",
+   "/data/general/npcs/skeleton.lua",
 })
 border = 0
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
 
 defineTile('.', "FLOOR")
-defineTile(',', "GRASS")
-defineTile('#', "WALL")
-defineTile('X', "TREE")
+defineTile(',', data.floor or data['.'] or "GRASS")
+defineTile('#', "HARDWALL")
+defineTile('X', "HARDTREE")
 defineTile('+', "DOOR")
 defineTile('x', "DOOR_VAULT")
 
-defineTile('T', "FLOOR", {random_filter={type="scroll", tome_mod="vault"}}, {random_filter={name="forest troll", add_levels=4}})
+local mobs = {
+   "cave troll",
+   "thief",
+   "skeleton magus",
+   "ghast",
+}
+local mob = rng.tableRemove(mobs)
+local moblet = "forest troll"
+if mob == "thief" then moblet = "bandit"
+elseif mob == "skeleton magus" then moblet = "skeleton warrior"
+elseif mob == "ghast" then moblet = "ghoul"
+end
 
+defineTile('T', "FLOOR", {random_filter={type="scroll", ego_chance =50, add_levels=8}}, {random_filter={name=mob, add_levels=8}})
+defineTile('t', "FLOOR", {random_filter={tome_mod="vault", add_levels=5}}, {random_filter={name=moblet, add_levels=6}})
+defineTile('m', "FLOOR", nil, {random_filter={name=moblet, add_levels=4}})
+
+local version = rng.range(1,3)
+if version == 1 then
 return {
 [[,,,,,,,,,,,,,]],
-[[,#####,,,X,,,]],
-[[,#...#,,X,,X,]],
-[[,#T..#,,,,X,,]],
+[[,#####XXXX,,,]],
+[[,#tTt#,,XX,X,]],
+[[,#...#,,,XXX,]],
 [[,###x#X#X.,#,]],
-[[,#.....XX,.#,]],
-[[,X,.,...,..+,]],
+[[,#,..,,XX,.#,]],
+[[,X.m...m,..+,]],
 [[,X,,.X.,...+,]],
-[[,,,X..,....#,]],
-[[,##XX,##X#X#,]],
+[[,X,X.m.,,..#,]],
+[[,##XX#XXX#X#,]],
+[[,,,,,,,,,,,,,]],
+}
+elseif version == 2 then
+return {
+[[,,,,,,,,,,,,,]],
+[[,##X##XXXX#X,]],
+[[,X,,,,.m.XX,,]],
+[[,X,.,....,XX,]],
+[[,X.###x###,#,]],
+[[,Xm#t...t#,#,]],
+[[,#.#..T..#,#,]],
+[[,#,#######,X,]],
+[[,X,,,.,.m.#X,]],
+[[,X###++#####,]],
+[[,,,,,,,,,,,,,]],
+}
+else
+return {
+[[,,,,,,,,,,,,,]],
+[[,###++##X#X,,]],
+[[,#,.m.,#XX#X,]],
+[[,X,...,,,XXX,]],
+[[,X.mXX,,,,,#,]],
+[[,#...,,,.X.#,]],
+[[,#####,,,,.X,]],
+[[,#t,.x..mX.#,]],
+[[,#Tt.#,.X..#,]],
+[[,#########X#,]],
 [[,,,,,,,,,,,,,]],
-}
\ No newline at end of file
+}
+end
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/forest-ruined-building2.lua b/game/modules/tome/data/maps/vaults/forest-ruined-building2.lua
index bfd727a8c03a162ee2525b64b6a1e4e6e3629ca2..8c4561c81a273d1a2ac090d4b91c03e889328b65 100644
--- a/game/modules/tome/data/maps/vaults/forest-ruined-building2.lua
+++ b/game/modules/tome/data/maps/vaults/forest-ruined-building2.lua
@@ -17,29 +17,132 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+startx = 9
+starty = 1
+
 setStatusAll{no_teleport=true, room_map = {can_open=true}}
+
 roomCheck(function(room, zone, level, map)
-	return zone.npc_list.__loaded_files["/data/general/npcs/plant.lua"] and zone.npc_list.__loaded_files["/data/general/npcs/swarm.lua"] --make sure the honey tree can summon
+   return zone.npc_list.__loaded_files["/data/general/npcs/bear.lua"] and zone.npc_list.__loaded_files["/data/general/npcs/plant.lua"] and zone.npc_list.__loaded_files["/data/general/npcs/swarm.lua"] --make sure the honey tree can summon
 end)
+
+specialList("actor", {"/data/general/npcs/aquatic_demon.lua"}, true)
+
+specialList("terrain", {
+   "/data/general/grids/underground_gloomy.lua",
+   "/data/general/grids/water.lua",
+   "/data/general/grids/forest.lua",
+}, true)
+
 border = 0
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
 
+local vaultvariations = rng.range(1,3)
+
 defineTile('.', "FLOOR")
 defineTile(',', "GRASS")
 defineTile('#', "WALL")
 defineTile('X', "TREE")
---defineTile('+', "DOOR")
 defineTile('+', "DOOR", nil, nil, nil, {room_map = {can_open=true}})
-defineTile('T', "GRASS", nil, {random_filter={name="honey tree", add_levels=4}})
-
-return {
-[[,,,,,,,,,,,,,,,,,,,,,]],
-[[,#################X,,]],
-[[,#....#.,..,..#.X.,X,]],
-[[,#....+..,,,..+..,.#,]],
-[[,######..,T,,.######,]],
-[[,#....+.,,,,..+....#,]],
-[[,#....#....,,.#....#,]],
-[[,########+#+########,]],
-[[,,,,,,,,,,,,,,,,,,,,,]],
-}
+
+if vaultvariations == 1 then -- Gloomy theme
+   defineTile('i', "FLOOR", {random_filter={add_levels=4, tome_mod="gvault"}})
+   local Talents = require("engine.interface.ActorTalents")
+   defineTile('T', "FLOOR", nil,
+      {entity_mod=function(e)
+         e.make_escort = nil
+         e.name = rng.table{"gloomy ", "deformed ", "sick "}..e.name
+         e[#e+1] = resolvers.talents{ [Talents.T_GLOOM]=1, [Talents.T_HATEFUL_WHISPER]=1 }
+         e:resolve()
+         return e
+      end,
+      random_filter={name="honey tree", add_levels=4}}
+   )
+   defineTile('P', "FLOOR", nil,
+      {entity_mod=function(e)
+         e.make_escort = nil
+         e.name = rng.table{"gloomy ", "deformed ", "sick "}..e.name
+         e[#e+1] = resolvers.talents{ [Talents.T_AGONY]=1, [Talents.T_GLOOM]=1 }
+         e:resolve()
+         return e
+      end,
+      random_filter={name="giant venus flytrap", add_levels=4}}
+   )
+   defineTile('B', "FLOOR", nil,
+      {entity_mod=function(e)
+         e.make_escort = nil
+         e.name = rng.table{"gloomy ", "deformed ", "sick "}..e.name
+         e[#e+1] = resolvers.talents{ [Talents.T_REPROACH]=1, [Talents.T_GLOOM]=1 }
+         e:resolve()
+         return e
+      end,
+      random_filter={name="brown bear", add_levels=4}}
+   )
+   return {
+   [[,,,,,,,,,,,,,,,,,,,,,]],
+   [[,#################X,,]],
+   [[,#....#.....,,#,X,,X,]],
+   [[,#P...+......,+,...#,]],
+   [[,######...T...######,]],
+   [[,#.,,,,.......+..i.#,]],
+   [[,#..,,#,,.....#B...#,]],
+   [[,########+#+########,]],
+   [[,,,,,,,,,,,,,,,,,,,,,]],
+   }
+
+elseif vaultvariations == 2 then -- FLooded theme
+   local Talents = require("engine.interface.ActorTalents")
+   defineTile('~', "DEEP_WATER")
+   defineTile('i', "GRASS", {random_filter={add_levels=4, tome_mod="gvault"}})
+   defineTile('T', "DEEP_WATER", nil,
+      {entity_mod=function(e)
+         e.make_escort = nil
+         e.can_breath={water=1}
+         e.name = rng.table{"wet ", "soaked ", "drenched "}..e.name
+         e[#e+1] = resolvers.talents{ [Talents.T_TIDAL_WAVE]=2 }
+         e:resolve()
+         return e
+      end,
+      random_filter={name="honey tree", add_levels=4}}
+   )
+   defineTile('B', "DEEP_WATER", nil,
+      {entity_mod=function(e)
+         e.make_escort = nil
+         e.can_breath={water=1}
+         e.name = rng.table{"wet ", "soaked ", "drenched "}..e.name
+         e[#e+1] = resolvers.talents{ [Talents.T_WATER_BOLT]=1 }
+         e:resolve()
+         return e
+      end,
+      random_filter={name="giant venus flytrap", add_levels=4}}
+   )
+   defineTile('P', "DEEP_WATER", nil, {random_filter={name="water imp", add_levels=4}})
+   return {
+   [[,,,,,,,,,,,,,,,,,,~~~]],
+   [[,#################X~~]],
+   [[,#~P~~#~~~~~~~#~~~~X~]],
+   [[,#~~~,+,~~~~~~X~~~~#,]],
+   [[,######,~~T~~~######,]],
+   [[,#~~i,+,~~~~~,+,~~~#,]],
+   [[,#~~~,#,,,,,,,#~~~B#,]],
+   [[,########+#+########,]],
+   [[,,,,,,,,,,,,,,,,,,,,,]],
+   }
+
+else -- Normal theme
+   defineTile('T', "GRASS", nil, {random_filter={name="honey tree", add_levels=4}})
+   defineTile('P', "FLORR", nil, {random_filter={name="giant venus flytrap", add_levels=4}})
+   defineTile('B', "FLOOR", nil, {random_filter={name="brown bear", add_levels=4}})
+   defineTile('i', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}})
+   return {
+   [[,,,,,,,,,,,,,,,,,,,,,]],
+   [[,#################X,,]],
+   [[,#....#.,..,..#.X.,X,]],
+   [[,#.i..+..,,,..+..,.#,]],
+   [[,######..,T,,.######,]],
+   [[,#....+.,,,,..+....#,]],
+   [[,#P...#....,,.#B...#,]],
+   [[,########+#+########,]],
+   [[,,,,,,,,,,,,,,,,,,,,,]],
+   }
+end
diff --git a/game/modules/tome/data/maps/vaults/forest-ruined-building3.lua b/game/modules/tome/data/maps/vaults/forest-ruined-building3.lua
index d5f0b0cc78498c83a8abae167063b20a86331734..befc838356f9351be01d7e259c6ee6231f4816a4 100644
--- a/game/modules/tome/data/maps/vaults/forest-ruined-building3.lua
+++ b/game/modules/tome/data/maps/vaults/forest-ruined-building3.lua
@@ -19,7 +19,17 @@
 
 setStatusAll{no_teleport=true, room_map = {can_open=true}}
 specialList("actor", {
-	"/data/general/npcs/skeleton.lua",
+   "/data/general/npcs/skeleton.lua",
+   "/data/general/npcs/snake.lua",
+   "/data/general/npcs/molds.lua",
+   "/data/general/npcs/feline.lua",
+   "/data/general/npcs/ant.lua",
+   "/data/general/npcs/sandworm.lua",
+   "/data/general/npcs/spider.lua",
+   "/data/general/npcs/vermin.lua",
+   "/data/general/npcs/rodent.lua",
+   "/data/general/npcs/ooze.lua",
+   "/data/general/npcs/jelly.lua",
 })
 border = 0
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
@@ -28,23 +38,63 @@ defineTile('.', "FLOOR")
 defineTile(',', "GRASS")
 defineTile(';', "FLOWER")
 defineTile('~', "DEEP_WATER")
-defineTile('#', "WALL")
-defineTile('X', "TREE")
-defineTile('+', "DOOR")
+defineTile('#', "HARDWALL")
+defineTile('X', "HARDTREE")
 defineTile('x', "DOOR_VAULT")
 
-defineTile('s', "FLOOR", nil, {random_filter={name="degenerated skeleton warrior"}})
+local mobs = {
+   "rattlesnake",
+   "green worm mass",
+   "giant brown ant",
+   "snow cat",
+   "green mold",
+   "giant grey rat",
+   "giant spider",
+   "sandworm",
+   "grey mold",
+   "giant brown rat",
+   "skeleton mage",
+   "skeleton archer",
+   "skeleton warrior",
+   "giant green ant",
+   "giant red ant",
+   "giant yellow ant",
+   "giant blue ant",
+   "brown mold",
+   "white worm mass",
+   "giant crystal rat",
+   "spitting spider",
+   "weaver young",
+   "green ooze",
+   "red ooze",
+   "yellow ooze",
+   "blue ooze",
+   "green jelly",
+   "red jelly",
+   "blue jelly",
+   "yellow jelly",
+}
+
+defineTile('s', "FLOOR", "MONEY_SMALL", {random_filter={name="degenerated skeleton warrior"}}) -- retain closet skeleton for posterity; give it a little money to guard so he's not so sad
+
+--ALL OF THE VARIABILITY
+defineTile('1', "FLOOR", rng.percent(66)and{random_filter={tome_mod="vault", add_levels=rng.range(1,3)}} or nil, rng.percent(50) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(5,10)}} or nil)
+defineTile('2', "FLOOR", rng.percent(50)and{random_filter={tome_mod="vault", add_levels=rng.range(2,5)}} or nil, rng.percent(66) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(4,8)}} or nil)
+defineTile('3', "FLOOR", rng.percent(66)and{random_filter={add_levels=rng.range(2,4), ego_chance=rng.range(75,100)}} or nil, rng.percent(50) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(5,10)}} or nil)
+defineTile('4', "FLOOR", rng.percent(50)and{random_filter={add_levels=rng.range(3,6), ego_chance=rng.range(66,100)}} or nil, rng.percent(66) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(4,8)}} or nil)
+defineTile('5', "FLOOR", rng.percent(66)and{random_filter={tome_mod="vault", add_levels=rng.range(1,3)}} or nil, rng.percent(50) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(5,10)}} or nil)
+defineTile('6', "FLOOR", rng.percent(50)and{random_filter={tome_mod="vault", add_levels=rng.range(4,6)}} or nil, rng.percent(66) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(4,8)}} or nil)
 
 return {
 [[,,,,,,,,,,,,,,,,]],
 [[,#X#########X,,,]],
-[[,,.+....+..,..X,]],
-[[,###....#.###.,,]],
-[[,#.+....#.....#,]],
-[[,###....###+###,]],
-[[,#sx....#,,,,,,,]],
-[[,###...X#,;;;;;,]],
-[[,#.+..,.,,;~~~;,]],
-[[,#####X,,,;;;;;,]],
-[[,,,,,,,,,,,,,,,,]],
+[[,#2x.;,.x.6,X.X,]],
+[[,###.,,.####XXX,]],
+[[,#3x.;,.#.5.1.#,]],
+[[,###.;;.###x###,]],
+[[,#sx..,,#;;;;;;;]],
+[[,###.,,X#;;~~~;;]],
+[[,#4x..,.,;;~~~;;]],
+[[,#####X,,;;~~~;;]],
+[[,,,,,,,,,;;;;;;;]],
 }
diff --git a/game/modules/tome/data/maps/vaults/honey_glade.lua b/game/modules/tome/data/maps/vaults/honey_glade.lua
index 2d2318b9745ddf84c9ef44d4086a4e28c1f7fd70..0b15bc6e62138e630b48a69e061d9c4e34e8cb8e 100644
--- a/game/modules/tome/data/maps/vaults/honey_glade.lua
+++ b/game/modules/tome/data/maps/vaults/honey_glade.lua
@@ -17,42 +17,76 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
-setStatusAll{no_teleport=true, vault_only_door_open=true}
+setStatusAll{no_teleport=true}
 roomCheck(function(room, zone, level, map)
-	return resolvers.current_level <= 25 and zone.npc_list.__loaded_files["/data/general/npcs/swarm.lua"] -- make sure the honey trees can summon
+   return resolvers.current_level <= 25 and zone.npc_list.__loaded_files["/data/general/npcs/swarm.lua"] -- make sure the honey tree can summon
 end)
 specialList("actor", {
-	"/data/general/npcs/bear.lua",
-	"/data/general/npcs/plant.lua",
+   "/data/general/npcs/bear.lua",
+   "/data/general/npcs/plant.lua",
+   "/data/general/npcs/swarm.lua",
 })
+
 specialList("terrain", {
-	"/data/general/grids/forest.lua",
+   "/data/general/grids/forest.lua",
 }, true)
+
 local Floor = data.floor or "GRASS"
-defineTile('!', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=false, can_open=true}})
+defineTile('X', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=true, can_open=true}})
 defineTile(' ', Floor)
-defineTile('+', "DOOR")
-defineTile('X', "HARDTREE")
-defineTile('^', Floor, nil, nil, {random_filter={add_levels=5}})
-defineTile('#', Floor, nil, {random_filter={name="honey tree"}})
-defineTile('q', Floor, {random_filter={add_levels=10, tome_mod="vault"}}, {random_filter={name="brown bear", add_levels=10}})
-defineTile('Q', Floor, {random_filter={add_levels=20, tome_mod="vault"}}, {random_filter={name="grizzly bear", add_levels=20}})
+defineTile('#', "HARDTREE")
+defineTile('*', Floor, {random_filter={add_levels=10, tome_mod="vault"}})
+defineTile('T', Floor, nil, {random_filter={name="honey tree", add_levels=15}})
+defineTile('t', Floor, nil, {random_filter={name="honey tree"}})
+defineTile('B', Floor, nil, {random_filter={name="bee swarm", add_levels=10}})
+defineTile('b', Floor, nil, {random_filter={name="bee swarm", add_levels=5}})
+defineTile('G', Floor, {random_filter={add_levels=20, tome_mod="vault"}}, {random_filter={name="grizzly bear", add_levels=20}})
+defineTile('g', Floor, nil, {random_filter={name="brown bear", add_levels=10}})
 
 startx = 2
 starty = 10
 
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
-
-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]],
-}
+--Introducing: Our Patented Alt-Vault System(R)
+local version = rng.range(1,4)
+if version == 4 then
+   return { -- more or less the original, 4 weak trees, 4 brown bears, 1 grizzly
+   [[#######]],
+   [[##*g*##]],
+   [[#tgGgt#]],
+   [[#t g t#]],
+   [[##   ##]],
+   [[### ###]],
+   [[###X###]],
+   }
+elseif version == 3 then
+   return { -- grizzly bear and a bunch of weak swarms
+   [[#######]],
+   [[##   ##]],
+   [[#bb bb#]],
+   [[#*bTb*#]],
+   [[## G ##]],
+   [[### ###]],
+   [[###X###]],
+   }
+elseif version == 2 then
+   return { -- 2 brown bears, 3 strong swarms, no narrow spot
+   [[#######]],
+   [[## t ##]],
+   [[# * * #]],
+   [[# gTg #]],
+   [[# B*B #]],
+   [[## B ##]],
+   [[###X###]],
+   }
+else -- always return something
+   return { -- 2 grizzly bears, one strong swarm
+   [[#######]],
+   [[## * ##]],
+   [[# GTG #]],
+   [[#  B  #]],
+   [[##   ##]],
+   [[### ###]],
+   [[###X###]],
+   }
+end
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/mold-path.lua b/game/modules/tome/data/maps/vaults/mold-path.lua
index c6801492093e994bc0a73796bde087513dfd0c77..bd89683fcebb27482d945e5d1d03be6e1a6138b1 100644
--- a/game/modules/tome/data/maps/vaults/mold-path.lua
+++ b/game/modules/tome/data/maps/vaults/mold-path.lua
@@ -19,16 +19,16 @@
 
 setStatusAll{no_teleport=true}
 roomCheck(function(room, zone, level, map)
-	return resolvers.current_level <= 25
+   return resolvers.current_level <= 25
 end)
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
 specialList("terrain", {
-	"/data/general/grids/water.lua",
-	"/data/general/grids/forest.lua",
+   "/data/general/grids/water.lua",
+   "/data/general/grids/forest.lua",
 })
 specialList("actor", {
-	"/data/general/npcs/ooze.lua",
-	"/data/general/npcs/molds.lua",
+   "/data/general/npcs/ooze.lua",
+   "/data/general/npcs/molds.lua",
 })
 defineTile('.', "GRASS_SHORT")
 defineTile('#', "TREE")
@@ -36,24 +36,57 @@ defineTile('X', "HARDTREE")
 defineTile('~', "POISON_DEEP_WATER")
 defineTile('!', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=false, can_open=true}})
 
-defineTile('m', "GRASS_SHORT", nil, {random_filter={subtype="molds", add_levels=2}})
-defineTile('j', "GRASS_SHORT", nil, {random_filter={subtype="oozes", add_levels=2}})
+defineTile('m', "GRASS_SHORT", nil, {random_filter={subtype="molds", add_levels=5}})
+defineTile('j', "GRASS_SHORT", nil, {random_filter={subtype="oozes", add_levels=5}})
 
 defineTile('$', "GRASS_SHORT", {random_filter={add_levels=5, tome_mod="vault"}})
+defineTile('*', "GRASS_SHORT", {random_filter={add_levels=10, tome_mod="vault"}})
 
-startx = 19
+startx = 3
 starty = 7
-
-return {
-[[#XXXXXXXXX#####XXXX#]],
-[[XXm~~~~~~XXXX#XX$$XX]],
-[[X~~~~.j..~~jXXXmmmmX]],
-[[X~.~~mXX.j~~~j..jjXX]],
-[[Xm.~~XXXXX~~~~.jXXX#]],
-[[XX.mmXXXXXXXXXXXX###]],
-[[XmmmXXXXXXXXXXXXXXXX]],
-[[X~~~mXXXX~.mmXXm...!]],
-[[XXm..~m~....~~~~~mXX]],
-[[#XXXX~~~mXXXm~m~XXX#]],
-[[####XXXXXX#XXXXXX###]],
+local version = rng.range(1,4)
+if version == 1 then
+return { -- switchback, similar to original
+[[XXXXXXXXXXXXXXXX]],
+[[XXm~~.m....X$*$X]],
+[[X~..j..jXX.mmmmX]],
+[[X~..mXXXXXXXXXXX]],
+[[Xm.jm......jm..X]],
+[[XXXXXXXXXXXX~~.X]],
+[[X~~...mm....mm.X]],
+[[XXX!XXXXXXXXXXXX]],
+}
+elseif version == 2 then
+return { -- big pond, you can go through the poison to the loot, the better loot is in sight of the mob pile though
+[[XXXXXXXXXXXXXXXX]],
+[[XX...XjmmmmX..*X]],
+[[X..XmmjjmmmmmX$X]],
+[[X..XXXXXmjmmjX$X]],
+[[X..~~~~XXXXXXX~X]],
+[[XX.~~~~~~~~~~~~X]],
+[[XX...~~~~~~~~~XX]],
+[[XXX!XXXXXXXXXXXX]],
+}
+elseif version == 3 then
+return { -- small pond, lots of jellies
+[[XXXXXXXXXXXXXXXX]],
+[[XXmjmXXj..jXX$XX]],
+[[Xj..j..jX..mjjmX]],
+[[Xj.~mXXXXXX.jj$X]],
+[[Xm.~~~~~~~XjX..X]],
+[[XX.mXX~~~~XjXj*X]],
+[[Xm..XXX~~~XX~~~X]],
+[[XXX!XXXXXXXXXXXX]],
+}
+else
+return { -- small pond, nearly all mold, token jelly
+[[XXXXXXXXXXXXXXXX]],
+[[XX...mmm..m.X$XX]],
+[[Xmm...~~XXXmXmjX]],
+[[X....m~~mmXX...X]],
+[[X....~~~~~mXmmmX]],
+[[XX....m~~~~XX$mX]],
+[[XX......m~~X*mmX]],
+[[XXX!XXXXXXXXXXXX]],
 }
+end
diff --git a/game/modules/tome/data/maps/vaults/snake-pit.lua b/game/modules/tome/data/maps/vaults/snake-pit.lua
new file mode 100644
index 0000000000000000000000000000000000000000..5fc4debb7f4d2479a1d3398ff473d33671bd3873
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/snake-pit.lua
@@ -0,0 +1,59 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2019 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 = 3
+starty = 4
+
+setStatusAll{no_teleport=true, room_map = {can_open=false}}
+specialList("actor", {
+   "/data/general/npcs/snake.lua",
+   "/data/general/npcs/molds.lua",
+   "/data/general/npcs/feline.lua",
+   "/data/general/npcs/ant.lua",
+   "/data/general/npcs/sandworm.lua",
+   "/data/general/npcs/spider.lua",
+   "/data/general/npcs/vermin.lua",
+   "/data/general/npcs/rodent.lua",
+})
+rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+
+defineTile('#', "HARDWALL")
+defineTile('!', "DOOR_VAULT")
+
+local mobs = {
+   "rattlesnake",
+   "green worm mass",
+   "giant ice ant",
+   "snow cat",
+   "green mold",
+   "giant grey rat",
+   "giant spider",
+   "sandworm"
+}
+local mob = rng.tableRemove(mobs)
+
+defineTile('s', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, {random_filter={name=mob}})
+
+return {
+[[#####]],
+[[#sss#]],
+[[#sss!]],
+[[#sss#]],
+[[#####]],
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/troll-hideout.lua b/game/modules/tome/data/maps/vaults/troll-hideout.lua
index f699ea0aa0882447ff5fd85b06289d9c76fca0d6..c20db7f6f0314f7afd528a0f9ee226307444ebf2 100644
--- a/game/modules/tome/data/maps/vaults/troll-hideout.lua
+++ b/game/modules/tome/data/maps/vaults/troll-hideout.lua
@@ -19,11 +19,11 @@
 
 setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
 specialList("actor", {
-	"/data/general/npcs/troll.lua",
+   "/data/general/npcs/troll.lua",
 })
 specialList("terrain", {
-	"/data/general/grids/water.lua",
-	"/data/general/grids/forest.lua",
+   "/data/general/grids/water.lua",
+   "/data/general/grids/forest.lua",
 }, true)
 border = 0
 rotates = {"default", "90", "180", "270", "flipx", "flipy"}
@@ -35,29 +35,80 @@ defineTile('#', "HARDWALL")
 defineTile('X', "TREE")
 defineTile('+', "DOOR")
 
-defineTile('T', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, {random_filter={name="forest troll"}})
+defineTile('T', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, {random_filter={name="forest troll", add_levels=10}})
 defineTile('t', "FLOOR", nil, {random_filter={name="forest troll"}})
-defineTile('$', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, nil)
---startx, starty = 0, 9
-return {
+defineTile('$', "FLOOR", {random_filter={type="scroll", ego_chance=25}})
+defineTile('*', "FLOOR", {random_filter={mod="vault", add_levels=5}})
+startx, starty = 0, 9
+
+local version = rng.range(1, 3)
+if version == 1 then
+return { -- original
 [[,,,,,,,,,,,,,,,,,,,,,,]],
 [[,,,XX,,X,,,,,,,,,,X,,,]],
 [[,,X~~~~~~~,,~~~~~XXX,,]],
 [[,XX~#####~,,~#####~,,,]],
-[[,XX~#...#~~~~#...#~,X,]],
-[[,XX~#.t.######.t.#~,,,]],
+[[,XX~#...#~~~~#..*#~,X,]],
+[[,XX~#.t.######.T.#~,,,]],
 [[,,X~#...#.t..+...#~,X,]],
 [[,XX~###+#..t.#####~,,,]],
 [[,XX~~~#....#####~~~,,,]],
-[[,,,..t+....#$$$#~,,,X,]],
-[[,,,..t+....+$$T#~,,,X,]],
+[[,,,..t+....#$.$#~,,,X,]],
+[[,,,..t+....+.$T#~,,,X,]],
 [[,XX~~~#....#####~~~,X,]],
-[[,,X~###+#....#####~,X,]],
-[[,,X~#...#....+...#~,X,]],
-[[,,X~#.t.######.t.#~,,,]],
-[[,XX~#...#~~~~#...#~,,,]],
+[[,,X~###+#..t.#####~,X,]],
+[[,,X~#...#.t..+...#~,X,]],
+[[,,X~#.T.######.t.#~,,,]],
+[[,XX~#*..#~~~~#...#~,,,]],
 [[,,X~#####~,,~#####~,,,]],
 [[,,X~~~~~~~,,~~~~~~~,,,]],
 [[,,XXX,X,,XXX,X,,XXX,,,]],
 [[,,,,,,,,,,,,,,,,,,,,,,]],
 }
+elseif version == 2 then
+return { -- ruined
+[[,,,,,,,,,,,,,,,,,,,,,,]],
+[[,,XXXXXXXXXXXXXXXXXX,,]],
+[[,,X~~~~~~~,,~~~~~~~XX,]],
+[[,XX~#####~,,~#####~,X,]],
+[[,XX~#$.t#~~~~#.*.#~XX,]],
+[[,XX~#,t.#.#~.#.T.#~X,,]],
+[[,,X~#t..#....+.,,#~XX,]],
+[[,XX~###+#..#.#####~,X,]],
+[[,XX~~#...#....X.~~~,X,]],
+[[,,,.~~.,,..X.t..~~,,X,]],
+[[,,,.~t.#..T.,#.~~~~,X,]],
+[[,XX~~~..,.,...~~~~~,X,]],
+[[,,X~###+#..X.#####~,X,]],
+[[,,X~#*.t#....+,,$#~XX,]],
+[[,,X~#.T.#..#.#.t.#~X,,]],
+[[,XX~#t.,#~~#~#$..#~X,,]],
+[[,,X~#####~~~~#####~X,,]],
+[[,,X~~~~~~~,,~~~~~~~X,,]],
+[[,,XXXXXXXXXXXXXXXXXX,,]],
+[[,,,,,,,,,,,,,,,,,,,,,,]],
+}
+else
+return { -- fortified
+[[,,,,,,,,,,,,,,,,,,,,,,]],
+[[,,,XX,,X,,,,,,,,,,X,,,]],
+[[,,X~~~~~~~,,~~~~~XXX,,]],
+[[,XX~#####~~~~#####~,,,]],
+[[,XX~#...######.$.#~,X,]],
+[[,XX~#.T....#..t..#~,,,]],
+[[,,X~#....#.#.#.t.#~,X,]],
+[[,XX~###..#.#.#.###~,,,]],
+[[,XX~~~#..#.#.#.#~~~,,,]],
+[[,,,...+t.#.#.#.#~,,,X,]],
+[[,,,...+t.#.#T#.#~,,,X,]],
+[[,XX~~~#.##.#.#.#~~~,X,]],
+[[,,X~#####....#.###~,X,]],
+[[,,X~#$.#######t..#~,X,]],
+[[,,X~#T.+..tt..t..#~,,,]],
+[[,XX~#**#######..$#~,,,]],
+[[,,X~#####~~~~#####~,,,]],
+[[,,X~~~~~~~,,~~~~~~~,,,]],
+[[,,XXX,X,,XXX,X,,XXX,,,]],
+[[,,,,,,,,,,,,,,,,,,,,,,]],
+}
+end
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/zones/collapsed-tower.lua b/game/modules/tome/data/maps/zones/collapsed-tower.lua
new file mode 100644
index 0000000000000000000000000000000000000000..9297c5f92a97ddc108ebea4b65ea618d1ca2027f
--- /dev/null
+++ b/game/modules/tome/data/maps/zones/collapsed-tower.lua
@@ -0,0 +1,96 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2019 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 Talents = require("engine.interface.ActorTalents")
+
+setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
+
+local turret = function()
+   local NPC = require "mod.class.NPC"
+   local m = NPC.new{
+      type = "construct", subtype = "crystal", image="trap/trap_beam.png",
+      display = "t",
+      body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1, QUIVER=1 },
+      life_rating = 20,
+      rank = 2,
+      inc_damage = { all = -75, },
+
+      open_door = true,
+      cut_immune = 1,
+      blind_immune = 1,
+      fear_immune = 1,
+      poison_immune = 1,
+      disease_immune = 1,
+      stone_immune = 1,
+      see_invisible = 30,
+      no_breath = 1,
+      infravision = 10,
+      never_move = 1,
+
+      autolevel = "caster",
+      level_range = {1, nil}, exp_worth = 1,
+      stats = { mag=16, con=22 },
+      size_category = 2,
+      name = "arcane crystal", color=colors.BLUE,
+      combat = { dam=resolvers.rngavg(1,2), atk=2, apr=0, dammod={str=0.4} },
+      combat_armor = 10, combat_def = 0,
+      talent_cd_reduction={[Talents.T_ELEMENTAL_BOLT]=3, },
+
+      resolvers.talents{
+         [Talents.T_ELEMENTAL_BOLT]={base=1, every=5, max=10},
+      },
+
+      ai = "dumb_talented_simple", ai_state = { ai_move="move_complex", talent_in=3, },
+   
+   }
+   return m
+end
+
+specialList("actor", {
+   "/data/general/npcs/skeleton.lua",
+})
+specialList("terrain", {
+   "/data/general/grids/water.lua",
+   "/data/general/grids/forest.lua",
+}, true)
+border = 0
+--rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+
+defineTile('.', "FLOOR")
+defineTile('#', "HARDWALL")
+defineTile('+', "DOOR")
+defineTile('!', "DOOR_VAULT")
+defineTile('>', "DOWN")
+
+
+defineTile('b', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}}, {random_filter={add_levels=5, name="skeleton magus"}})
+defineTile('$', "FLOOR", {random_filter={add_levels=25, type="money"}})
+defineTile('t', "FLOOR", nil, turret())
+
+local def = {
+[[##############]],
+[[##############]],
+[[##.##.$...####]],
+[[#t.....>..####]],
+[[##.##...$.####]],
+[[#b$##$....####]],
+[[##############]],
+}
+
+return def
diff --git a/game/modules/tome/data/zones/halfling-ruins/zone.lua b/game/modules/tome/data/zones/halfling-ruins/zone.lua
index 3717fda1ac4e1a953f5b1c7409a975414c82a032..b53655217728c76b2c6d5f11722a9a63f04f4776 100644
--- a/game/modules/tome/data/zones/halfling-ruins/zone.lua
+++ b/game/modules/tome/data/zones/halfling-ruins/zone.lua
@@ -35,8 +35,9 @@ return {
 		map = {
 			class = "engine.generator.map.Roomer",
 			nb_rooms = 10,
-			rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}},
+			rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}, {"greater_vault",10}},
 			lesser_vaults_list = {"circle","rat-nest","skeleton-mage-cabal"},
+			greater_vaults_list = {"living-weapons"},
 			lite_room_chance = 100,
 			['.'] = "FLOOR",
 			['#'] = "WALL",
diff --git a/game/modules/tome/data/zones/lake-nur/zone.lua b/game/modules/tome/data/zones/lake-nur/zone.lua
index 54d5f85467c2a46e31a5498ba55bc4bc35257b21..87177ed49305e36e5ca424b4454f19e22dd34917 100644
--- a/game/modules/tome/data/zones/lake-nur/zone.lua
+++ b/game/modules/tome/data/zones/lake-nur/zone.lua
@@ -42,6 +42,7 @@ return {
 			class = "engine.generator.map.Roomer",
 			nb_rooms = 10,
 			rooms = {"random_room"},
+			lesser_vaults_list = {"flooded-prison"},
 			lite_room_chance = 0,
 			['.'] = {"WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR_BUBBLE"},
 			['#'] = "WATER_WALL",
@@ -87,6 +88,9 @@ return {
 			underwater = true,
 			effects = {"EFF_ZONE_AURA_UNDERWATER"},
 			generator = {
+				map =  {
+					rooms = {"random_room",{"lesser_vault",7}},
+				},
 				actor = {
 					filters = {{special_rarity="water_rarity"}},
 				},
@@ -96,6 +100,7 @@ return {
 			underwater = is_flooded,
 			generator = is_flooded and {
 				map = {
+					rooms = {"random_room",{"lesser_vault",5}},
 					down = "SHERTUL_FORTRESS_FLOOD",
 					['.'] = {"WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR_BUBBLE"},
 					force_last_stair = true,
diff --git a/game/modules/tome/data/zones/old-forest/zone.lua b/game/modules/tome/data/zones/old-forest/zone.lua
index a45f8f7fd99016faf4cbb78178a869d5793cfd3b..2c2104fa91ef34d5f348a473c2dbeef57f3ad30c 100644
--- a/game/modules/tome/data/zones/old-forest/zone.lua
+++ b/game/modules/tome/data/zones/old-forest/zone.lua
@@ -46,7 +46,7 @@ return {
 			edge_entrances = {4,6},
 			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", "troll-hideout", "mage-hideout", "thief-hideout", "plantlife", "mold-path", "bandit-fortress","loot-vault"},
+			lesser_vaults_list = {"honey_glade", "troll-hideout", "mage-hideout", "thief-hideout", "plantlife", "mold-path", "bandit-fortress","loot-vault","worms"},
 			['.'] = "GRASS",
 			['#'] = "TREE",
 			up = "GRASS_UP4",
diff --git a/game/modules/tome/data/zones/rhaloren-camp/zone.lua b/game/modules/tome/data/zones/rhaloren-camp/zone.lua
index b61674cb6636d90cd98a3a47ece383ea18a8e836..2b80656275f24cc2de05e61d0a68ab3d97fc1601 100644
--- a/game/modules/tome/data/zones/rhaloren-camp/zone.lua
+++ b/game/modules/tome/data/zones/rhaloren-camp/zone.lua
@@ -124,9 +124,9 @@ return {
 			['.'] = "FLOOR",
 			['+'] = "DOOR",
 
-			nb_rooms = {0,1,1,2},
+			nb_rooms = {1,1,2},
 			rooms = {"lesser_vault"},
-			lesser_vaults_list = {"circle","amon-sul-crypt","rat-nest","skeleton-mage-cabal"},
+			lesser_vaults_list = {"circle","amon-sul-crypt","skeleton-mage-cabal","collapsed-tower"},
 			lite_room_chance = 100,
 		},
 		actor = {
diff --git a/game/modules/tome/data/zones/ruins-kor-pul/zone.lua b/game/modules/tome/data/zones/ruins-kor-pul/zone.lua
index 5b78063836386bd3dc5b2bac33d930a8b7933193..2b8a4ead84c3ec4f68f2a4895bd18852c1ca3f9c 100644
--- a/game/modules/tome/data/zones/ruins-kor-pul/zone.lua
+++ b/game/modules/tome/data/zones/ruins-kor-pul/zone.lua
@@ -42,7 +42,7 @@ return {
 			class = "engine.generator.map.Roomer",
 			nb_rooms = 10,
 			rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}},
-			lesser_vaults_list = {"circle","amon-sul-crypt","rat-nest","skeleton-mage-cabal"},
+			lesser_vaults_list = {"circle","amon-sul-crypt","rat-nest","skeleton-mage-cabal","crystal-cabal","snake-pit"},
 			lite_room_chance = 100,
 			['.'] = "FLOOR",
 			['#'] = "WALL",
diff --git a/game/modules/tome/data/zones/scintillating-caves/zone.lua b/game/modules/tome/data/zones/scintillating-caves/zone.lua
index 22379e17d4bd58a2bc2a52498717e889f36fb5f1..cb77d59fee3c6fde2f7228c87332640e320746ad 100644
--- a/game/modules/tome/data/zones/scintillating-caves/zone.lua
+++ b/game/modules/tome/data/zones/scintillating-caves/zone.lua
@@ -40,7 +40,8 @@ return {
 		map = {
 			class = "engine.generator.map.Roomer",
 			nb_rooms = 5,
-			rooms = {"random_room", {"money_vault",5}},
+			rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}},
+			lesser_vaults_list = {"amon-sul-crypt","skeleton-mage-cabal","crystal-cabal","snake-pit"},
 			lite_room_chance = 20,
 			['.'] = "CRYSTAL_FLOOR",
 			['#'] = {"CRYSTAL_WALL","CRYSTAL_WALL2","CRYSTAL_WALL3","CRYSTAL_WALL4","CRYSTAL_WALL5","CRYSTAL_WALL6","CRYSTAL_WALL7","CRYSTAL_WALL8","CRYSTAL_WALL9","CRYSTAL_WALL10","CRYSTAL_WALL11","CRYSTAL_WALL12","CRYSTAL_WALL13","CRYSTAL_WALL14","CRYSTAL_WALL15","CRYSTAL_WALL16","CRYSTAL_WALL17","CRYSTAL_WALL18","CRYSTAL_WALL19","CRYSTAL_WALL20",},
diff --git a/game/modules/tome/data/zones/slazish-fen/zone.lua b/game/modules/tome/data/zones/slazish-fen/zone.lua
index 80b4d6500dbf48146e746261e60eb8ef45c07aa6..675692f8eebcd5a5ed91562787a88bc517972184 100644
--- a/game/modules/tome/data/zones/slazish-fen/zone.lua
+++ b/game/modules/tome/data/zones/slazish-fen/zone.lua
@@ -53,7 +53,7 @@ return {
 
 --			nb_rooms = {0,0,0,1},
 --			rooms = {"lesser_vault"},
---			lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "forest-snake-pit", "mage-hideout"},
+--			lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "snake-pit", "mage-hideout"},
 --			lite_room_chance = 100,
 		},
 		actor = {
diff --git a/game/modules/tome/data/zones/trollmire/zone.lua b/game/modules/tome/data/zones/trollmire/zone.lua
index bf6d4b23f108a28f32e692262d62b8f968a94b59..11c4475c5e5fb1c9e4d44c9a36e192fdf156c189 100644
--- a/game/modules/tome/data/zones/trollmire/zone.lua
+++ b/game/modules/tome/data/zones/trollmire/zone.lua
@@ -61,9 +61,9 @@ return {
 			road = "GRASS_ROAD_DIRT",
 			add_road = true,
 
-			nb_rooms = {0,0,0,1},
+			nb_rooms = {0,1},
 			rooms = {"lesser_vault"},
-			lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "forest-snake-pit", "mage-hideout"},
+			lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "snake-pit", "mage-hideout", "collapsed-tower"},
 			lite_room_chance = 100,
 		},
 		actor = {
@@ -189,9 +189,9 @@ return {
 				pond = {{0.6, "DEEP_WATER"}, {0.8, "DEEP_WATER"}},
 			},
 
-			nb_rooms = {0,0,0,1},
+			nb_rooms = {0,1},
 			rooms = {"lesser_vault"},
-			lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "forest-snake-pit", "mage-hideout"},
+			lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "snake-pit", "mage-hideout", "collapsed-tower"},
 			lite_room_chance = 100,
 		},
 		actor = {