diff --git a/abms.lua b/abms.lua
new file mode 100644
index 0000000000000000000000000000000000000000..4f49efc60c7d915adfadd127dd4eaa5b3967a2d8
--- /dev/null
+++ b/abms.lua
@@ -0,0 +1,56 @@
+--grab schematics
+local fortress = minetest.get_modpath("caverealms").."/schems/DMFort.mts"
+local fountain = minetest.get_modpath("caverealms").."/schems/DMFountain.mts"
+
+--place Dungeon Master Statue fountains
+minetest.register_abm({
+	nodenames = {"caverealms:s_fountain"},
+	interval = 1.0,
+	chance = 1,
+	action = function(pos, node, active_object_count, active_object_count_wider)
+		minetest.place_schematic(pos, fountain, "random", {}, true)
+	end,
+})
+
+--place Dungeon Master Fortresses
+minetest.register_abm({
+	nodenames = {"caverealms:s_fortress"},
+	interval = 1.0,
+	chance = 1,
+	action = function(pos, node, active_object_count, active_object_count_wider)
+		npos = {x=pos.x,y=pos.y-7,z=pos.z}
+		minetest.place_schematic(npos, fortress, "random", {}, true)
+	end,
+})
+
+local MAX_ITEMS = 5 --maximum number of items to put in chests - do not set to less than 2
+--table of itemstrings
+local ITEMS = {
+	"default:diamond",
+	"default:obsidian 33",
+	"default:mese",
+	"default:pick_diamond",
+	"default:stonebrick 50",
+	"default:sandstone 75",
+	"default:torch 99",
+	"default:water_source 4",
+}
+
+--spawn and fill chests
+minetest.register_abm({
+	nodenames = {"caverealms:s_chest"},
+	interval = 1.0,
+	chance = 1,
+	action = function(pos, node, active_object_count, active_object_count_wider)
+		oldparam = minetest.get_node(pos).param2
+		minetest.set_node(pos, {name="default:chest", param2=oldparam})
+		minetest.after(1.0, function()
+			local inv = minetest.get_inventory({type="node", pos=pos})
+			local item_num = math.random(1, MAX_ITEMS)
+			for i = 1, item_num do
+				item_i = math.random(8) --if you add or subtract items from ITEMS, be sure to change this value to reflect it
+				inv:add_item("main", ITEMS[item_i])
+			end
+		end)
+	end,
+})
\ No newline at end of file
diff --git a/functions.lua b/functions.lua
index 6c62a9352734c1ab0762430681185faa0a2eb2e2..7cb0af700025ac800aa8a62d5cf24fb61448c8a4 100644
--- a/functions.lua
+++ b/functions.lua
@@ -117,6 +117,8 @@ function caverealms:crystal_stalagmite(x,y,z, area, data, biome)
 	local c_emore = minetest.get_content_id("caverealms:glow_emerald_ore")
 	local c_mesecry = minetest.get_content_id("caverealms:glow_mese")
 	local c_meseore = minetest.get_content_id("default:stone_with_mese")
+	local c_ruby = minetest.get_content_id("caverealms:glow_ruby")
+	local c_rubore = minetest.get_content_id("caverealms:glow_ruby_ore")
 	local c_ice = minetest.get_content_id("default:ice")
 	local c_thinice = minetest.get_content_id("caverealms:thin_ice")
 
@@ -142,14 +144,16 @@ function caverealms:crystal_stalagmite(x,y,z, area, data, biome)
  		{ {c_crystore, c_crystal}, {c_emore, c_emerald} },
  		{ {c_emore, c_emerald}, {c_crystore, c_crystal} },
  		{ {c_emore, c_emerald}, {c_meseore, c_mesecry} },
- 		{ {c_ice, c_thinice}, {c_crystore, c_crystal}}
+ 		{ {c_ice, c_thinice}, {c_crystore, c_crystal}},
+		{ {c_ice, c_thinice}, {c_crystore, c_crystal}},
+		{ {c_rubore, c_ruby}, {c_meseore, c_mesecry}},
  	}
 
  	local nid_a
  	local nid_b
 	local nid_s = c_stone --stone base, will be rewritten to ice in certain biomes
 
- 	if biome > 3 then
+ 	if biome > 3 and biome < 6 then
  		if mode == 1 then
  			nid_a = c_ice
 			nid_b = c_thinice
@@ -209,6 +213,8 @@ function caverealms:crystal_stalactite(x,y,z, area, data, biome)
 	local c_emore = minetest.get_content_id("caverealms:glow_emerald_ore")
 	local c_mesecry = minetest.get_content_id("caverealms:glow_mese")
 	local c_meseore = minetest.get_content_id("default:stone_with_mese")
+	local c_ruby = minetest.get_content_id("caverealms:glow_ruby")
+	local c_rubore = minetest.get_content_id("caverealms:glow_ruby_ore")
 	local c_ice = minetest.get_content_id("default:ice")
 	local c_thinice = minetest.get_content_id("caverealms:hanging_thin_ice")
 
@@ -234,14 +240,16 @@ function caverealms:crystal_stalactite(x,y,z, area, data, biome)
  		{ {c_crystore, c_crystal}, {c_emore, c_emerald} },
  		{ {c_emore, c_emerald}, {c_crystore, c_crystal} },
  		{ {c_emore, c_emerald}, {c_meseore, c_mesecry} },
- 		{ {c_ice, c_thinice}, {c_crystore, c_crystal}}
+ 		{ {c_ice, c_thinice}, {c_crystore, c_crystal}},
+		{ {c_ice, c_thinice}, {c_crystore, c_crystal}},
+		{ {c_rubore, c_ruby}, {c_meseore, c_mesecry}},
  	}
 
  	local nid_a
  	local nid_b
 	local nid_s = c_stone --stone base, will be rewritten to ice in certain biomes
 
- 	if biome > 3 then
+ 	if biome > 3 and biome < 6 then
  		if mode == 1 then
  			nid_a = c_ice
 			nid_b = c_thinice
diff --git a/init.lua b/init.lua
index c13671b560a974114cee37c7875c396a91a4e47c..477344180815e4b4a4987e5481d9416e4621308a 100644
--- a/init.lua
+++ b/init.lua
@@ -15,6 +15,7 @@ dofile(modpath.."/config.lua") --configuration file; holds various constants
 dofile(modpath.."/crafting.lua") --crafting recipes
 dofile(modpath.."/nodes.lua") --node definitions
 dofile(modpath.."/functions.lua") --function definitions
+dofile(modpath.."/abms.lua") --abm definitions
 
 if caverealms.config.falling_icicles == true then
 	dofile(modpath.."/falling_ice.lua") --complicated function for falling icicles
@@ -37,6 +38,12 @@ local MYCCHA = caverealms.config.myccha --0.03 --chance of mycena mushrooms
 local WORMCHA = caverealms.config.wormcha --0.03 --chance of glow worms
 local GIANTCHA = caverealms.config.giantcha --0.001 -- chance of giant mushrooms
 local ICICHA = caverealms.config.icicha --0.035 -- chance of icicles
+local FLACHA = 0.04 --chance of constant flames
+local FOUNCHA = 0.001 --chance of statue + fountain
+local FORTCHA = 0.0003 --chance of DM Fortresses
+
+local DM_TOP = -4000 --level at which Dungeon Master Realms start to appear
+local DM_BOT = -5000 --level at which "" ends
 
 -- 3D noise for caves
 
@@ -94,13 +101,13 @@ minetest.register_on_generated(function(minp, maxp, seed)
 	local x0 = minp.x
 	local y0 = minp.y
 	local z0 = minp.z
-
+	
 	print ("[caverealms] chunk minp ("..x0.." "..y0.." "..z0..")") --tell people you are generating a chunk
-
+	
 	local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
 	local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
 	local data = vm:get_data()
-
+	
 	--grab content IDs
 	local c_air = minetest.get_content_id("air")
 	local c_stone = minetest.get_content_id("default:stone")
@@ -117,26 +124,30 @@ minetest.register_on_generated(function(minp, maxp, seed)
 	local c_moss = minetest.get_content_id("caverealms:stone_with_moss")
 	local c_lichen = minetest.get_content_id("caverealms:stone_with_lichen")
 	local c_algae = minetest.get_content_id("caverealms:stone_with_algae")
+	local c_hcobble = minetest.get_content_id("caverealms:hot_cobble")
 	local c_fungus = minetest.get_content_id("caverealms:fungus")
 	local c_mycena = minetest.get_content_id("caverealms:mycena")
 	local c_worm = minetest.get_content_id("caverealms:glow_worm")
 	local c_iciu = minetest.get_content_id("caverealms:icicle_up")
 	local c_icid = minetest.get_content_id("caverealms:icicle_down")
-
+	local c_flame = minetest.get_content_id("caverealms:constant_flame")
+	local c_fountain = minetest.get_content_id("caverealms:s_fountain")
+	local c_fortress = minetest.get_content_id("caverealms:s_fortress")
+	
 	--mandatory values
 	local sidelen = x1 - x0 + 1 --length of a mapblock
 	local chulens = {x=sidelen, y=sidelen, z=sidelen} --table of chunk edges
 	local minposxyz = {x=x0, y=y0, z=z0} --bottom corner
 	local minposxz = {x=x0, y=z0} --2D bottom corner
-
+	
 	local nvals_cave = minetest.get_perlin_map(np_cave, chulens):get3dMap_flat(minposxyz) --cave noise for structure
 	local nvals_wave = minetest.get_perlin_map(np_wave, chulens):get3dMap_flat(minposxyz) --wavy structure of cavern ceilings and floors
 	local nvals_biome = minetest.get_perlin_map(np_biome, chulens):get2dMap_flat({x=x0+150, y=z0+50}) --2D noise for biomes (will be 3D humidity/temp later)
-
+	
 	local nixyz = 1 --3D node index
 	local nixz = 1 --2D node index
 	local nixyz2 = 1 --second 3D index for second loop
-
+	
 	for z = z0, z1 do -- for each xy plane progressing northwards
 		--structure loop
 		for y = y0, y1 do -- for each x row progressing upwards
@@ -159,7 +170,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
 				vi = vi + 1
 			end
 		end
-
+		
 		--decoration loop
 		for y = y0, y1 do -- for each x row progressing upwards
 			local tcave --same as above
@@ -172,7 +183,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
 			end
 			local vi = area:index(x0, y, z)
 			for x = x0, x1 do -- for each node do
-
+				
 				--determine biome
 				local biome = false --preliminary declaration
 				n_biome = nvals_biome[nixz] --make an easier reference to the noise
@@ -190,7 +201,14 @@ minetest.register_on_generated(function(minp, maxp, seed)
 				else
 					biome = 3 --algae
 				end
-
+				
+				if y <= DM_TOP and y >= DM_BOT then
+					biome = 6 --DUNGEON MASTER'S LAIR
+				end
+				--if y <= -1000 then
+					--biome = 6 --DUNGEON MASTER'S LAIR
+				--end
+				
 				if math.floor(((nvals_cave[nixyz2] + nvals_wave[nixyz2])/2)*100) == math.floor(tcave*100) then
 					--ceiling
 					local ai = area:index(x,y+1,z) --above index
@@ -261,8 +279,19 @@ minetest.register_on_generated(function(minp, maxp, seed)
 							if math.random() < ICICHA then --if glaciated, place icicles
 								data[ai] = c_iciu
 							end
+						elseif biome == 6 then
+							data[vi] = c_hcobble
+							if math.random() < FLACHA then --neverending flames
+								data[ai] = c_flame
+							end
+							if math.random() < FOUNCHA then --DM FOUNTAIN
+								data[ai] = c_fountain
+							end
+							if math.random() < FORTCHA then --DM FORTRESS
+								data[ai] = c_fortress
+							end
 						end
-
+						
 						if math.random() < STAGCHA then
 							caverealms:stalagmite(x,y,z, area, data)
 						end
@@ -270,7 +299,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
 							caverealms:crystal_stalagmite(x,y,z, area, data, biome)
 						end
 					end
-
+					
 				end
 				nixyz2 = nixyz2 + 1
 				nixz = nixz + 1
@@ -280,7 +309,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
 		end
 		nixz = nixz + sidelen --shift the 2D index up a layer
 	end
-
+	
 	--send data back to voxelmanip
 	vm:set_data(data)
 	--calc lighting
@@ -292,6 +321,4 @@ minetest.register_on_generated(function(minp, maxp, seed)
 	local chugent = math.ceil((os.clock() - t1) * 1000) --grab how long it took
 	print ("[caverealms] "..chugent.." ms") --tell people how long
 end)
-
-
 print("[caverealms] loaded!")
diff --git a/nodes.lua b/nodes.lua
index 7588234e8a46b57bc729885b871e5e1dc88b0787..952f9a4d8c63ace7b39e84a46a23e10d683f390f 100644
--- a/nodes.lua
+++ b/nodes.lua
@@ -48,6 +48,20 @@ minetest.register_node("caverealms:glow_mese", {
 	sunlight_propagates = true,
 })
 
+--glowing ruby
+minetest.register_node("caverealms:glow_ruby", {
+	description = "Glow Ruby",
+	tiles = {"caverealms_glow_ruby.png"},
+	is_ground_content = true,
+	groups = {cracky=3},
+	sounds = default.node_sound_glass_defaults(),
+	light_source = 13,
+	paramtype = "light",
+	use_texture_alpha = true,
+	drawtype = "glasslike",
+	sunlight_propagates = true,
+})
+
 --embedded crystal
 minetest.register_node("caverealms:glow_ore", {
 	description = "Glow Crystal Ore",
@@ -70,6 +84,17 @@ minetest.register_node("caverealms:glow_emerald_ore", {
 	paramtype = "light",
 })
 
+--embedded rub
+minetest.register_node("caverealms:glow_ruby_ore", {
+	description = "Glow Ruby Ore",
+	tiles = {"caverealms_glow_ruby_ore.png"},
+	is_ground_content = true,
+	groups = {cracky=2},
+	sounds = default.node_sound_glass_defaults(),
+	light_source = 10,
+	paramtype = "light",
+})
+
 --thin (transparent) ice
 minetest.register_node("caverealms:thin_ice", {
 	description = "Thin Ice",
@@ -235,6 +260,19 @@ minetest.register_node("caverealms:stone_with_algae", {
 	}),
 })
 
+--Hot Cobble - cobble with lava instead of mortar XD
+minetest.register_node("caverealms:hot_cobble", {
+	description = "Hot Cobble",
+	tiles = {"caverealms_hot_cobble.png"},
+	is_ground_content = true,
+	groups = {crumbly=2, hot=1},
+	damage_per_second = 1,
+	light_source = 3,
+	sounds = default.node_sound_stone_defaults({
+		footstep = {name="default_stone_footstep", gain=0.25},
+	}),
+})
+
 --glow worms
 minetest.register_node("caverealms:glow_worm", {
 	description = "Glow Worms",
@@ -323,3 +361,80 @@ minetest.register_node("caverealms:mushroom_gills", {
 	drawtype = "plantlike",
 	paramtype = "light",
 })
+
+--define special flame so that it does not expire
+minetest.register_node("caverealms:constant_flame", {
+	description = "Fire",
+	drawtype = "plantlike",
+	tiles = {{
+		name="fire_basic_flame_animated.png",
+		animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1},
+	}},
+	inventory_image = "fire_basic_flame.png",
+	light_source = 14,
+	groups = {igniter=2,dig_immediate=3,hot=3},
+	drop = '',
+	walkable = false,
+	buildable_to = true,
+	damage_per_second = 4,
+	
+	after_place_node = function(pos, placer)
+		fire.on_flame_add_at(pos)
+	end,
+	
+	after_dig_node = function(pos, oldnode, oldmetadata, digger)
+		fire.on_flame_remove_at(pos)
+	end,
+})
+
+--node to create a treasure chest in DM Forts.
+minetest.register_node("caverealms:s_chest", {
+	description = "Trying to rob the bank before it's opened, eh?",
+	tiles = {"default_chest_front.png"},
+	paramtype2 = "facedir",
+	groups = {choppy=3,oddly_breakable_by_hand=2,cavechest=1},
+})
+
+--hacky schematic placers
+
+minetest.register_node("caverealms:s_fountain", {
+	description = "A Hack like you should know what this does...",
+	tiles = {"caverealms_stone_eyes.png"},
+	groups = {crumbly=3, schema=1},
+})
+
+minetest.register_node("caverealms:s_fortress", {
+	description = "A Hack like you should know what this does...",
+	tiles = {"caverealms_stone_eyes.png"},
+	groups = {crumbly=3, schema=1},
+})
+
+--dungeon master statue (nodebox)
+minetest.register_node("caverealms:dm_statue", {
+	tiles = {
+		"caverealms_dm_stone.png",
+		"caverealms_dm_stone.png",
+		"caverealms_dm_stone.png",
+		"caverealms_dm_stone.png",
+		"caverealms_dm_stone.png",
+		"caverealms_stone_eyes.png"
+	},
+	drawtype = "nodebox",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	groups = {cracky=2},
+	node_box = {
+		type = "fixed",
+		fixed = {
+			{-0.4375, -0.5, -0.4375, 0.4375, -0.3125, 0.4375}, -- NodeBox1
+			{-0.25, -0.125, -0.1875, 0.25, 0.5, 0.1875}, -- NodeBox2
+			{-0.375, 0, -0.125, -0.25, 0.4375, 0.125}, -- NodeBox3
+			{0.25, 0.125, -0.4375, 0.375, 0.375, 0.1875}, -- NodeBox4
+			{-0.25, -0.5, -0.125, -0.125, -0.125, 0.125}, -- NodeBox5
+			{0.125, -0.3125, -0.125, 0.25, 0, 0.125}, -- NodeBox6
+		}
+	},
+	selection_box = {
+		type = "regular"
+	}
+})
diff --git a/schems/DMFort.mts b/schems/DMFort.mts
new file mode 100644
index 0000000000000000000000000000000000000000..14cc8f22ca67b41d562a32c5880553a35c861613
Binary files /dev/null and b/schems/DMFort.mts differ
diff --git a/schems/DMFountain.mts b/schems/DMFountain.mts
new file mode 100644
index 0000000000000000000000000000000000000000..e0c6aff87be23cb5efe605c5cdbbb842447a43e9
Binary files /dev/null and b/schems/DMFountain.mts differ
diff --git a/textures/caverealms_dm_stone.png b/textures/caverealms_dm_stone.png
new file mode 100644
index 0000000000000000000000000000000000000000..95e02ab71c2a4be80a3de6485daf0eece39a23aa
Binary files /dev/null and b/textures/caverealms_dm_stone.png differ
diff --git a/textures/caverealms_glow_ruby.png b/textures/caverealms_glow_ruby.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ef07e67a53e37ed893012f78e3ef1f4f222c8fa
Binary files /dev/null and b/textures/caverealms_glow_ruby.png differ
diff --git a/textures/caverealms_glow_ruby_ore.png b/textures/caverealms_glow_ruby_ore.png
new file mode 100644
index 0000000000000000000000000000000000000000..f511972292d60cec9f172d09a5494938d2e0207e
Binary files /dev/null and b/textures/caverealms_glow_ruby_ore.png differ
diff --git a/textures/caverealms_hot_cobble.png b/textures/caverealms_hot_cobble.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e08c3c37d097f513847e510d46cf46e882b3ab1
Binary files /dev/null and b/textures/caverealms_hot_cobble.png differ
diff --git a/textures/caverealms_stone_eyes.png b/textures/caverealms_stone_eyes.png
new file mode 100644
index 0000000000000000000000000000000000000000..204d2b767bbaece8bab8cf53e6ff2e0186b55da3
Binary files /dev/null and b/textures/caverealms_stone_eyes.png differ