diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua
index 59945973f..091d9cb1c 100644
--- a/mods/CORE/mcl_init/init.lua
+++ b/mods/CORE/mcl_init/init.lua
@@ -12,15 +12,25 @@ mcl_vars.inventory_header = mcl_vars.gui_slots .. mcl_vars.gui_bg
 local mg_name = minetest.get_mapgen_setting("mg_name")
 local minecraft_height_limit = 256
 if mg_name ~= "flat" then
-	mcl_vars.mg_overworld_min = -62
-	mcl_vars.mg_overworld_max = mcl_vars.mg_overworld_min + minecraft_height_limit
+	--[[ Realm stacking (h is for height)
+	- Overworld (h>=256)
+	- Void (h>=1000)
+	- Realm Barrier (h=11), to allow escaping the End
+	- End (h>=256)
+	- Void (h>=1000)
+	- Nether (h=128)
+	- Void (h>=1000)
+	]]
 
-	-- 1 flat bedrock layer with 4 rough layers above
+	-- Overworld
+	mcl_vars.mg_overworld_min = -62
+	mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit
 	mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min
 	mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min + 4
 	mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min + 10
 	mcl_vars.mg_lava = true
 	mcl_vars.mg_bedrock_is_rough = true
+
 else
 	local ground = minetest.get_mapgen_setting("mgflat_ground_level")
 	ground = tonumber(ground)
@@ -33,13 +43,32 @@ else
 	else
 		mcl_vars.mg_overworld_min = ground - 3
 	end
-	mcl_vars.mg_overworld_max = mcl_vars.mg_overworld_min + minecraft_height_limit
+	mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit
 	mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min
 	mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min
 	mcl_vars.mg_lava = false
 	mcl_vars.mg_bedrock_is_rough = false
 end
 
+mcl_vars.mg_overworld_max = 31000
+
+-- The Nether
+mcl_vars.mg_nether_min = -29000
+mcl_vars.mg_nether_max = mcl_vars.mg_nether_min + 128
+mcl_vars.mg_bedrock_nether_bottom_min = mcl_vars.mg_nether_min
+mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + 4
+mcl_vars.mg_bedrock_nether_top_max = mcl_vars.mg_nether_max
+mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - 4
+mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 31
+
+-- The End
+mcl_vars.mg_end_min = mcl_vars.mg_nether_max + 2000
+mcl_vars.mg_end_max_official = mcl_vars.mg_end_min + minecraft_height_limit
+mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000
+-- Realm barrier used to safely separate the End from the void below the Overworld
+mcl_vars.mg_realm_barrier_overworld_end_max = mcl_vars.mg_end_max
+mcl_vars.mg_realm_barrier_overworld_end_min = mcl_vars.mg_end_max - 11
+
 -- Set default stack sizes
 minetest.nodedef_default.stack_max = 64
 minetest.craftitemdef_default.stack_max = 64
diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua
index 2da93dd7d..95b9f7f6c 100644
--- a/mods/CORE/mcl_util/init.lua
+++ b/mods/CORE/mcl_util/init.lua
@@ -335,9 +335,23 @@ end
 -- 1st return value: true if pos is in void
 -- 2nd return value: true if it is in the deadly part of the void
 function mcl_util.is_in_void(pos)
-	local void, void_deadly
-	void = pos.y < mcl_vars.mg_overworld_min
-	void_deadly = pos.y < mcl_vars.mg_overworld_min - 64
+	local void =
+		not ((pos.y < mcl_vars.mg_overworld_max and pos.y > mcl_vars.mg_overworld_min) or
+		(pos.y < mcl_vars.mg_nether_max and pos.y > mcl_vars.mg_nether_min) or
+		(pos.y < mcl_vars.mg_end_max and pos.y > mcl_vars.mg_end_min))
+
+	local void_deadly = false
+	local deadly_tolerance = 64 -- the player must be this many nodes “deep” into the void to be damaged
+	if void then
+		-- Overworld → Void → End → Void → Nether → Void
+		if pos.y < mcl_vars.mg_overworld_min and pos.y > mcl_vars.mg_end_max then
+			void_deadly = pos.y < mcl_vars.mg_overworld_min - deadly_tolerance
+		elseif pos.y < mcl_vars.mg_end_min and pos.y > mcl_vars.mg_nether_max then
+			void_deadly = pos.y < mcl_vars.mg_end_min - deadly_tolerance
+		elseif pos.y < mcl_vars.mg_nether_min then
+			void_deadly = pos.y < mcl_vars.mg_nether_min - deadly_tolerance
+		end
+	end
 	return void, void_deadly
 end
 
@@ -351,6 +365,10 @@ end
 function mcl_util.y_to_layer(y)
 	if y >= mcl_vars.mg_overworld_min then
 		return y - mcl_vars.mg_overworld_min, "overworld"
+	elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max then
+		return y - mcl_vars.mg_nether_min, "nether"
+	elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then
+		return y - mcl_vars.mg_end_min, "end"
 	else
 		return nil, "void"
 	end
@@ -359,10 +377,15 @@ end
 -- Takes a Minecraft layer and a “dimension” name
 -- and returns the corresponding Y coordinate for
 -- MineClone 2.
--- minecraft_dimension parameter is ignored at the moment
--- TODO: Implement dimensions
-function mcl_util.layer_to_y(layer, minecraft_dimension)
-	return layer + mcl_vars.mg_overworld_min
+-- mc_dimension is one of "overworld", "nether", "end" (default: "overworld").
+function mcl_util.layer_to_y(layer, mc_dimension)
+	if mc_dimension == "overworld" or mc_dimension == nil then
+		return layer + mcl_vars.mg_overworld_min
+	elseif mc_dimension == "nether" then
+		return layer + mcl_vars.mg_nether_min
+	elseif mc_dimension == "end" then
+		return layer + mcl_vars.mg_end_min
+	end
 end
 
 -- Returns a on_place function for plants
diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua
index 692f6245d..410719f67 100644
--- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua
+++ b/mods/ENTITIES/mobs_mc/0_gameconfig.lua
@@ -249,8 +249,9 @@ mobs_mc.spawn = {
 	desert = { "default:desert_sand", "group:sand" },
 	jungle = { "default:dirt_with_rainforest_litter", "default:jungleleaves", "default:junglewood", "mcl_core:jungleleaves", "mcl_core:junglewood" },
 	snow = { "default:snow", "default:snowblock", "default:dirt_with_snow" },
-	end_city = { "default:cobble", "mcl_end:purpur_block", "mcl_end:end_stone", "mcl_portals:void"},
+	end_city = { "default:sandstonebrick", "mcl_end:purpur_block", "mcl_end:end_stone" },
 	wolf = { mobs_mc.items.grass_block, "default:dirt_with_rainforest_litter", "default:dirt", "default:dirt_with_snow", "default:snow", "default:snowblock" },
+	village = { "mg_villages:road" },
 
 	-- These probably don't need overrides
 	mushroom_island = { mobs_mc.items.mycelium, "mcl_core:mycelium" },
@@ -260,13 +261,31 @@ mobs_mc.spawn = {
 	water = { mobs_mc.items.water_source, "mcl_core:water_source", "default:water_source" },
 }
 
+-- This table contains important spawn height references for the mob spawn height.
+-- Please base your mob spawn height on these numbers to keep things clean.
+mobs_mc.spawn_height = {
+	water = tonumber(minetest.setting_get("water_level")) or 0, -- Water level in the Overworld
+
+	-- Overworld boundaries (inclusive)
+	overworld_min = -2999,
+	overworld_max = 31000,
+
+	-- Nether boundaries (inclusive)
+	nether_min = -3369,
+	nether_max = -3000,
+
+	-- End boundaries (inclusive)
+	end_min = -6200,
+	end_max = -6000,
+}
+
 mobs_mc.misc = {
 	shears_wear = 276, -- Wear to add per shears usage (238 uses)
 }
 
 -- Item name overrides from mobs_mc_gameconfig (if present)
 if minetest.get_modpath("mobs_mc_gameconfig") and mobs_mc.override then
-	local tables = {"items", "follow", "replace", "spawn", "misc"}
+	local tables = {"items", "follow", "replace", "spawn", "spawn_height", "misc"}
 	for t=1, #tables do
 		local tbl = tables[t]
 		if mobs_mc.override[tbl] then
diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua
index 5de504f84..5e6b9aa97 100644
--- a/mods/ENTITIES/mobs_mc/bat.lua
+++ b/mods/ENTITIES/mobs_mc/bat.lua
@@ -54,7 +54,7 @@ else
 end
 
 -- Spawn on solid blocks at or below Sea level and the selected light level
-mobs:spawn_specific("mobs_mc:bat", mobs_mc.spawn.solid,{"air"},0, maxlight, 20, 5000, 2, -500, 0)
+mobs:spawn_specific("mobs_mc:bat", mobs_mc.spawn.solid, {"air"}, 0, maxlight, 20, 5000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-1)
 
 
 -- spawn eggs
diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua
index 767d5760f..3af101055 100644
--- a/mods/ENTITIES/mobs_mc/blaze.lua
+++ b/mods/ENTITIES/mobs_mc/blaze.lua
@@ -71,8 +71,8 @@ mobs:register_mob("mobs_mc:blaze", {
 	blood_amount = 0,
 })
 
-mobs:register_spawn("mobs_mc:blaze", mobs_mc.spawn.nether_fortress, minetest.LIGHT_MAX+1, 0, 5000, 1, -1000, true)
-	
+mobs:spawn_specific("mobs_mc:blaze", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 3, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max)
+
 -- Blaze fireball
 mobs:register_arrow("mobs_mc:blaze_fireball", {
 	visual = "sprite",
diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua
index 09f6ee26f..cd8a22b2b 100644
--- a/mods/ENTITIES/mobs_mc/chicken.lua
+++ b/mods/ENTITIES/mobs_mc/chicken.lua
@@ -95,7 +95,7 @@ mobs:register_mob("mobs_mc:chicken", {
 })
 
 --spawn
-mobs:register_spawn("mobs_mc:chicken", mobs_mc.spawn.grassland, minetest.LIGHT_MAX+1, 9, 17000, 3, 31000)
+mobs:spawn_specific("mobs_mc:chicken", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 3, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 
 -- spawn eggs
 mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0)
diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua
index 83bfd8539..f7f2d47be 100644
--- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua
+++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua
@@ -134,9 +134,8 @@ mobs:register_mob("mobs_mc:mooshroom", mooshroom_def)
 
 
 -- Spawning
-mobs:register_spawn("mobs_mc:cow", mobs_mc.spawn.grassland, minetest.LIGHT_MAX+1, 9, 17000, 20, 31000)
-mobs:register_spawn("mobs_mc:mooshroom", mobs_mc.spawn.mushroom_island, minetest.LIGHT_MAX+1, 9, 17000, 10, 31000)
-
+mobs:spawn_specific("mobs_mc:cow", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 20, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
+mobs:spawn_specific("mobs_mc:mooshroom", mobs_mc.spawn.mushroom_island, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 10, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 
 -- compatibility
 mobs:alias_mob("mobs_animal:cow", "mobs_mc:cow")
diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua
index 6f481b402..b8ba9e2cd 100644
--- a/mods/ENTITIES/mobs_mc/creeper.lua
+++ b/mods/ENTITIES/mobs_mc/creeper.lua
@@ -122,7 +122,7 @@ mobs:register_mob("mobs_mc:creeper", {
 })
 
 
-mobs:spawn_specific("mobs_mc:creeper", mobs_mc.spawn.solid, {"air"},0, 7, 20, 16500, 1, -310, 31000)
+mobs:spawn_specific("mobs_mc:creeper", mobs_mc.spawn.solid, {"air"}, 0, 7, 20, 16500, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 
 -- compatibility
 mobs:alias_mob("mobs:creeper", "mobs_mc:creeper")
diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua
index 5b0d236be..8f687b506 100644
--- a/mods/ENTITIES/mobs_mc/enderman.lua
+++ b/mods/ENTITIES/mobs_mc/enderman.lua
@@ -146,12 +146,13 @@ mobs:register_mob("mobs_mc:enderman", {
 })
 
 
+-- End spawn
+mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 3000, 18, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max)
+-- Overworld spawn
+mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 9000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
+-- Nether spawn (rare)
+mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 27500, 4, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max)
 
---spawn on solid blocks
-mobs:register_spawn("mobs_mc:enderman", mobs_mc.spawn.desert, 7, 0, 9000, -31000, 31000)
---mobs:register_spawn("mobs_mc:enderman", mobs_mc.end_city, minetest.LIGHT_MAX+1, 0, 9000, -31000, -5000)
-mobs:spawn_specific("mobs_mc:enderman",  "mcl_end:end_stone", {"air"}, 0, minetest.LIGHT_MAX+1, 5, 20, 2, -31000, -5000)
-mobs:spawn_specific("mobs_mc:enderman",  "mcl_end:end_stone", {"mcl_portals:void"}, 0, minetest.LIGHT_MAX+1, 5, 20, 2, -31000, -5000)
 -- spawn eggs
 mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0)
 
diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua
index 3b71a1b06..f12006476 100644
--- a/mods/ENTITIES/mobs_mc/ghast.lua
+++ b/mods/ENTITIES/mobs_mc/ghast.lua
@@ -77,8 +77,8 @@ mobs:register_mob("mobs_mc:ghast", {
 })
 
 
---mobs:register_spawn("mobs_mc:ghast", {"default:flowing_lava", "nether:rack","air"}, 17, -1, 5000, 1, -2000)
-mobs:spawn_specific("mobs_mc:ghast", mobs_mc.spawn.nether, {"air"},0, minetest.LIGHT_MAX+1, 0, 18000, 2, -3610, -2100)
+mobs:spawn_specific("mobs_mc:ghast", mobs_mc.spawn.nether, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 18000, 2, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max)
+
 -- fireball (weapon)
 mobs:register_arrow(":mobs_monster:fireball", {
 	visual = "sprite",
diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua
index 73063129f..de9cac1dd 100644
--- a/mods/ENTITIES/mobs_mc/guardian.lua
+++ b/mods/ENTITIES/mobs_mc/guardian.lua
@@ -81,7 +81,7 @@ mobs:register_mob("mobs_mc:guardian", {
 	blood_amount = 0,
 })
 
-mobs:register_spawn("mobs_mc:guardian", mobs_mc.spawn.water, minetest.LIGHT_MAX+1, 0, 5000, 2, -1000, true)
+mobs:spawn_specific("mobs_mc:guardian", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water - 10)
 
 -- spawn eggs
 mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0)
diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua
index 9b74aca07..27e21c450 100644
--- a/mods/ENTITIES/mobs_mc/guardian_elder.lua
+++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua
@@ -86,7 +86,7 @@ mobs:register_mob("mobs_mc:guardian_elder", {
 	blood_amount = 0,
 })
 
-mobs:register_spawn("mobs_mc:guardian_elder", mobs_mc.spawn.water, minetest.LIGHT_MAX+1, 0, 5000, 2, -1000, true)
+mobs:spawn_specific("mobs_mc:guardian_elder", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-18)
 
 -- spawn eggs
 mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0)
diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua
index 34c29ede5..7672eb66e 100644
--- a/mods/ENTITIES/mobs_mc/horse.lua
+++ b/mods/ENTITIES/mobs_mc/horse.lua
@@ -330,9 +330,8 @@ mobs:register_mob("mobs_mc:mule", mule)
 
 --===========================
 --Spawn Function
-mobs:register_spawn("mobs_mc:horse", mobs_mc.spawn.grassland_savanna, minetest.LIGHT_MAX+1, 0, 15000, 12, 31000)
-mobs:register_spawn("mobs_mc:donkey", mobs_mc.spawn.grassland_savanna, minetest.LIGHT_MAX+1, 0, 15000, 12, 31000)
-
+mobs:spawn_specific("mobs_mc:horse", mobs_mc.spawn.grassland_savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 12, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max)
+mobs:spawn_specific("mobs_mc:donkey", mobs_mc.spawn.grassland_savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 12, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max)
 
 -- compatibility
 mobs:alias_mob("mobs:horse", "mobs_mc:horse")
diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua
index 82c251195..d689993d4 100644
--- a/mods/ENTITIES/mobs_mc/llama.lua
+++ b/mods/ENTITIES/mobs_mc/llama.lua
@@ -139,7 +139,7 @@ mobs:register_mob("mobs_mc:llama", {
 })
 
 --spawn
-mobs:register_spawn("mobs_mc:llama", mobs_mc.spawn.savanna, minetest.LIGHT_MAX+1, 0, 15000, 1, 40)
+mobs:spawn_specific("mobs_mc:llama", mobs_mc.spawn.savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 5, mobs_mc.spawn_height.water+15, mobs_mc.spawn_height.overworld_max)
 
 -- spawn eggs
 mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0)
diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua
index cd9e2e3a6..e1c11e8cd 100644
--- a/mods/ENTITIES/mobs_mc/ocelot.lua
+++ b/mods/ENTITIES/mobs_mc/ocelot.lua
@@ -140,12 +140,13 @@ local base_spawn_chance = 5000
 mobs:spawn({
 	name = "mobs_mc:ocelot",
 	nodes = mobs_mc.spawn.jungle,
+	neighbors = {"air"},
 	light_max = minetest.LIGHT_MAX+1,
 	light_min = 0,
 	chance = math.ceil(base_spawn_chance * 1.5), -- emulates 1/3 spawn failure rate
 	active_object_count = 12,
-	min_height = 1, -- Right above ocean level
-	max_height = 31000,
+	min_height = mobs_mc.spawn_height.water+1, -- Right above ocean level
+	max_height = mobs_mc.spawn_height.overworld_max,
 	on_spawn = function(self, pos)
 		--[[ Note: Minecraft has a 1/3 spawn failure rate.
 		In this mod it is emulated by reducing the spawn rate accordingly (see above). ]]
diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua
index 21e1b965c..e030d16fb 100644
--- a/mods/ENTITIES/mobs_mc/parrot.lua
+++ b/mods/ENTITIES/mobs_mc/parrot.lua
@@ -89,7 +89,7 @@ mobs:register_mob("mobs_mc:parrot", {
 
 --spawn
 -- TODO: Increase spawn chance if polished
-mobs:spawn_specific("mobs_mc:parrot", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX+1, 20, 20000, 2, 15, 20)
+--mobs:spawn_specific("mobs_mc:parrot", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 30000, 1, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max)
 
 -- spawn eggs
 mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0)
diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua
index aa4944f9b..05481544b 100644
--- a/mods/ENTITIES/mobs_mc/pig.lua
+++ b/mods/ENTITIES/mobs_mc/pig.lua
@@ -168,7 +168,7 @@ mobs:register_mob("mobs_mc:pig", {
 	end,
 })
 
-mobs:register_spawn("mobs_mc:pig", mobs_mc.spawn.grassland, minetest.LIGHT_MAX+1, 9, 15000, 30, 31000)
+mobs:spawn_specific("mobs_mc:pig", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 15000, 30, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 
 -- compatibility
 mobs:alias_mob("mobs:pig", "mobs_mc:pig")
diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua
index 24858bcb9..8028655a3 100644
--- a/mods/ENTITIES/mobs_mc/polar_bear.lua
+++ b/mods/ENTITIES/mobs_mc/polar_bear.lua
@@ -69,13 +69,9 @@ mobs:register_mob("mobs_mc:polar_bear", {
 mobs:alias_mob("mobs_mc:polarbear", "mobs_mc:polar_bear")
 
 
-mobs:register_spawn("mobs_mc:polar_bear", mobs_mc.spawn.snow, minetest.LIGHT_MAX+1, 0, 7000, 3, 31000)
-
+mobs:spawn_specific("mobs_mc:polar_bear", mobs_mc.spawn.snow, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 7000, 3, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 
 -- spawn egg
-
-
-
 mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "mobs_mc_spawn_icon_polarbear.png", 0)
 
 
diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua
index c937d86cd..5e1b2b526 100644
--- a/mods/ENTITIES/mobs_mc/rabbit.lua
+++ b/mods/ENTITIES/mobs_mc/rabbit.lua
@@ -104,10 +104,13 @@ mobs:register_mob("mobs_mc:killer_bunny", killer_bunny)
 
 local spawn = {
 	name = "mobs_mc:rabbit",
+	neighbors = {"air"},
 	chance = 15000,
 	active_object_count = 99,
 	min_light = 0,
 	max_light = minetest.LIGHT_MAX+1,
+	min_height = mobs_mc.spawn_height.overworld_min,
+	max_height = mobs_mc.spawn_height.overworld_max,
 }
 
 local spawn_desert = table.copy(spawn)
diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua
index 48176e721..bfc8ac0f4 100644
--- a/mods/ENTITIES/mobs_mc/sheep.lua
+++ b/mods/ENTITIES/mobs_mc/sheep.lua
@@ -202,7 +202,7 @@ mobs:register_mob("mobs_mc:sheep", {
 		if mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end
 	end,
 })
-mobs:register_spawn("mobs_mc:sheep", mobs_mc.spawn.grassland, minetest.LIGHT_MAX+1, 0, 15000, 3, 31000)
+mobs:spawn_specific("mobs_mc:sheep", mobs_mc.spawn.grassland, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 3, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 
 -- compatibility
 mobs:alias_mob("mobs_animal:sheep", "mobs_mc:sheep")
diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua
index f91739957..aed2d2433 100644
--- a/mods/ENTITIES/mobs_mc/shulker.lua
+++ b/mods/ENTITIES/mobs_mc/shulker.lua
@@ -83,12 +83,7 @@ mobs:register_arrow("mobs_mc:shulkerbullet", {
 
 mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0)
 
---mobs:spawn_specific("mobs_mc:shulker", mobs_mc.spawn.end_city, 0, minetest.LIGHT_MAX+1, 5, 3, 1, -31000, -5000)
-mobs:spawn_specific("mobs_mc:shulker",  "mcl_end:purpur_block", {"air"}, 0, minetest.LIGHT_MAX+1, 5, 20, 2, -31000, -5000)
-mobs:spawn_specific("mobs_mc:shulker",  "mcl_end:purpur_block", {"mcl_portals:void"}, 0, minetest.LIGHT_MAX+1, 5, 20, 2, -31000, -5000)
-
-
-
+mobs:spawn_specific("mobs_mc:shulker", mobs_mc.spawn.end_city, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 2, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max)
 
 if minetest.settings:get_bool("log_mods") then
 	minetest.log("action", "MC Shulkers loaded")
diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua
index 183c95687..7632adcd7 100644
--- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua
+++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua
@@ -122,10 +122,15 @@ mobs:register_mob("mobs_mc:stray", stray)
 -- compatibility
 mobs:alias_mob("mobs:skeleton", "mobs_mc:skeleton")
 
---spawn
-mobs:spawn_specific("mobs_mc:skeleton", mobs_mc.spawn.solid,{"air"}, 0, 7, 20, 17000, 2, -110, 31000)
+-- Overworld spawn
+mobs:spawn_specific("mobs_mc:skeleton", mobs_mc.spawn.solid, {"air"}, 0, 7, 20, 17000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
+-- Nether spawn
+mobs:spawn_specific("mobs_mc:skeleton", mobs_mc.spawn.nether_fortress, {"air"}, 0, 7, 30, 10000, 3, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max)
+
+-- Stray spawn
 -- TODO: Spawn directly under the sky
-mobs:spawn_specific("mobs_mc:stray", mobs_mc.spawn.snow, {"air"}, 0, 7, 20, 19000, 2, -110, 31000)
+mobs:spawn_specific("mobs_mc:stray", mobs_mc.spawn.snow, {"air"}, 0, 7, 20, 19000, 2, mobs_mc.spawn_height.water, mobs_mc.spawn_height.overworld_max)
+
 
 -- spawn eggs
 mobs:register_egg("mobs_mc:skeleton", S("Skeleton"), "mobs_mc_spawn_icon_skeleton.png", 0)
diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua
index fbf94ba85..400fa5094 100644
--- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua
+++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua
@@ -94,7 +94,8 @@ mobs:register_mob("mobs_mc:witherskeleton", {
 })
 
 --spawn
-mobs:register_spawn("mobs_mc:witherskeleton", mobs_mc.spawn.nether_fortress, 7, 0, 5000, 3, -3000, true)
+mobs:spawn_specific("mobs_mc:witherskeleton", mobs_mc.spawn.nether_fortress, {"air"}, 0, 7, 30, 5000, 5, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max)
+
 -- spawn eggs
 mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "mobs_mc_spawn_icon_witherskeleton.png", 0)
 
diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua
index ecd4e64aa..e0c9d58a9 100644
--- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua
+++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua
@@ -118,11 +118,12 @@ slime_tiny.on_die = nil
 
 mobs:register_mob("mobs_mc:slime_tiny", slime_tiny)
 
+local smin = mobs_mc.spawn_height.overworld_min
+local smax = mobs_mc.spawn_height.water - 23
 
-mobs:register_spawn("mobs_mc:slime_tiny", mobs_mc.spawn.solid, minetest.LIGHT_MAX+1, 0, 35000, 4, -12)
-mobs:register_spawn("mobs_mc:slime_small", mobs_mc.spawn.solid, minetest.LIGHT_MAX+1, 0, 35000, 4, -12)
-mobs:register_spawn("mobs_mc:slime_big", mobs_mc.spawn.solid, minetest.LIGHT_MAX+1, 0, 35000, 4, -12)
-
+mobs:spawn_specific("mobs_mc:slime_tiny", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 12000, 4, smin, smax)
+mobs:spawn_specific("mobs_mc:slime_small", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8500, 4, smin, smax)
+mobs:spawn_specific("mobs_mc:slime_big", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 10000, 4, smin, smax)
 
 -- Magma cube
 local magma_cube_big = {
@@ -240,14 +241,17 @@ magma_cube_tiny.on_die = nil
 mobs:register_mob("mobs_mc:magma_cube_tiny", magma_cube_tiny)
 
 
+local mmin = mobs_mc.spawn_height.nether_min
+local mmax = mobs_mc.spawn_height.nether_max
 
-mobs:register_spawn("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 15000, 4, -1000)
-mobs:register_spawn("mobs_mc:magma_cube_small", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 15500, 4, -1000)
-mobs:register_spawn("mobs_mc:magma_cube_big", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 16000, 4, -1000)
+mobs:spawn_specific("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 4, mmin, mmax)
+mobs:spawn_specific("mobs_mc:magma_cube_small", mobs_mc.spawn.nether, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15500, 4, mmin, mmax)
+mobs:spawn_specific("mobs_mc:magma_cube_big", mobs_mc.spawn.nether, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 16000, 4, mmin, mmax)
+
+mobs:spawn_specific("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11000, 4, mmin, mmax)
+mobs:spawn_specific("mobs_mc:magma_cube_small", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11100, 4, mmin, mmax)
+mobs:spawn_specific("mobs_mc:magma_cube_big", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11200, 4, mmin, mmax)
 
-mobs:register_spawn("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether_fortress, minetest.LIGHT_MAX+1, 0, 11000, 4, -1000)
-mobs:register_spawn("mobs_mc:magma_cube_small", mobs_mc.spawn.nether_fortress, minetest.LIGHT_MAX+1, 0, 11100, 4, -1000)
-mobs:register_spawn("mobs_mc:magma_cube_big", mobs_mc.spawn.nether_fortress, minetest.LIGHT_MAX+1, 0, 11200, 4, -1000)
 
 -- Compability
 mobs:alias_mob("mobs_mc:greensmall", "mobs_mc:slime_tiny")
diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua
index bb2f2db70..73f37cc66 100644
--- a/mods/ENTITIES/mobs_mc/spider.lua
+++ b/mods/ENTITIES/mobs_mc/spider.lua
@@ -77,8 +77,7 @@ cave_spider.walk_velocity = 4.1
 mobs:register_mob("mobs_mc:cave_spider", cave_spider)
 
 
-mobs:register_spawn("mobs_mc:spider", mobs_mc.spawn.solid, 7, 0, 19500, 2, 3000)
-
+mobs:spawn_specific("mobs_mc:spider", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 17000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 
 -- compatibility
 mobs:alias_mob("mobs:spider", "mobs_mc:spider")
diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua
index c1b291eb9..2ab401d1b 100644
--- a/mods/ENTITIES/mobs_mc/squid.lua
+++ b/mods/ENTITIES/mobs_mc/squid.lua
@@ -60,7 +60,7 @@ mobs:register_mob("mobs_mc:squid", {
 
 -- Spawn near the water surface
 
-local water = tonumber(minetest.settings:get("water_level")) or 0
+local water = mobs_mc.spawn_height.water
 --name, nodes, neighbours, minlight, maxlight, interval, chance, active_object_count, min_height, max_height
 mobs:spawn_specific("mobs_mc:squid", mobs_mc.spawn.water, {mobs_mc.items.water_source}, 0, minetest.LIGHT_MAX+1, 30, 5500, 3, water-16, water)
 
diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua
index 246011444..76a728e2f 100644
--- a/mods/ENTITIES/mobs_mc/villager.lua
+++ b/mods/ENTITIES/mobs_mc/villager.lua
@@ -168,8 +168,7 @@ mobs:register_mob("mobs_mc:villager", {
 	]]
 })
 
---mobs:register_spawn("mobs_mc:villager", {"default:gravel"},  7, -1, 4090, 4, 31000)
-mobs:register_spawn("mobs_mc:villager", {"mg_villages:road"}, minetest.LIGHT_MAX+1, -1,8000, 4, 31000)
+mobs:spawn_specific("mobs_mc:villager", mobs_mc.spawn.village, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8000, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max)
 
 -- compatibility
 mobs:alias_mob("mobs:villager", "mobs_mc:villager")
diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua
index e5094f2ee..b5c079c87 100644
--- a/mods/ENTITIES/mobs_mc/villager_zombie.lua
+++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua
@@ -83,11 +83,8 @@ mobs:register_mob("mobs_mc:villager_zombie", {
 	fear_height = 5,
 
 })
---mobs:register_spawn("mobs_mc:villager", {"default:gravel"},  7, -1, 4090, 4, 31000)
-mobs:register_spawn("mobs_mc:villager_zombie", {"mg_villages:road"}, 7, -1, 4090, 4, 31000)
-
-
 
+mobs:spawn_specific("mobs_mc:villager_zombie", mobs_mc.spawn.village, {"air"}, 0, 7, 30, 4090, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max)
 
 -- spawn eggs
 mobs:register_egg("mobs_mc:villager_zombie", S("Zombie Villager"), "mobs_mc_spawn_icon_zombie_villager.png", 0)
diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua
index 99ec2eb0c..85abbdc2e 100644
--- a/mods/ENTITIES/mobs_mc/witch.lua
+++ b/mods/ENTITIES/mobs_mc/witch.lua
@@ -110,7 +110,7 @@ mobs:register_arrow(":mobs:potion_arrow", {
 })
 
 -- TODO: Spawn when witch works properly
---mobs:spawn_specific("mobs_mc:witch", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, 1, 30)
+--mobs:spawn_specific("mobs_mc:witch", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, mobs_mc.spawn_height.water-6, mobs_mc.spawn_height.overworld_max)
 
 -- spawn eggs
 mobs:register_egg("mobs_mc:witch", S("Witch"), "mobs_mc_spawn_icon_witch.png", 0)
diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua
index cf17b3b59..7f22ce907 100644
--- a/mods/ENTITIES/mobs_mc/wolf.lua
+++ b/mods/ENTITIES/mobs_mc/wolf.lua
@@ -207,7 +207,7 @@ end
 mobs:register_mob("mobs_mc:dog", dog)
 
 -- Spawn
-mobs:register_spawn("mobs_mc:wolf", mobs_mc.spawn.wolf, minetest.LIGHT_MAX+1, 0, 9000, 20, 31000)
+mobs:spawn_specific("mobs_mc:wolf", mobs_mc.spawn.wolf, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 9000, 20, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max)
 
 -- Compatibility
 mobs:alias_mob("mobs:wolf", "mobs_mc:wolf")
diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua
index 8d2dda473..4408a7beb 100644
--- a/mods/ENTITIES/mobs_mc/zombie.lua
+++ b/mods/ENTITIES/mobs_mc/zombie.lua
@@ -122,12 +122,11 @@ mobs:register_mob("mobs_mc:baby_husk", baby_husk)
 
 -- Spawning
 
-mobs:register_spawn("mobs_mc:zombie", mobs_mc.spawn.solid, 7, 0, 6000, 4, 31000)
+mobs:spawn_specific("mobs_mc:zombie", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 6000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 -- Baby zombie is 20 times less likely than regular zombies
-mobs:register_spawn("mobs_mc:baby_zombie", mobs_mc.spawn.solid, 7, 0, 60000, 4, 31000)
-mobs:register_spawn("mobs_mc:husk", mobs_mc.spawn.desert, 7, 0, 6500, 4, 31000)
-mobs:register_spawn("mobs_mc:baby_husk", mobs_mc.spawn.desert, 7, 0, 65000, 4, 31000)
-
+mobs:spawn_specific("mobs_mc:baby_zombie", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 60000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
+mobs:spawn_specific("mobs_mc:husk", mobs_mc.spawn.desert, {"air"}, 0, 7, 30, 6500, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
+mobs:spawn_specific("mobs_mc:baby_husk", mobs_mc.spawn.desert, {"air"}, 0, 7, 30, 65000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 
 -- Compatibility
 mobs:alias_mob("mobs:zombie", "mobs_mc:zombie")
diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua
index 6b2ad65e4..3661ec47f 100644
--- a/mods/ENTITIES/mobs_mc/zombiepig.lua
+++ b/mods/ENTITIES/mobs_mc/zombiepig.lua
@@ -80,7 +80,7 @@ mobs:register_mob("mobs_mc:pigman", pigman)
 
 local baby_pigman = table.copy(pigman)
 baby_pigman.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25}
-baby_pigman.visual_size = {x=0.5, y=0.5}
+baby_pigman.visual_size = {x=pigman.visual_size.x/2, y=pigman.visual_size.y/2}
 baby_pigman.textures = {{"mobs_mc_zombie_pigman.png"}}
 baby_pigman.walk_velocity = 1.2
 baby_pigman.run_velocity = 2.4
@@ -88,13 +88,13 @@ baby_pigman.light_damage = 0
 
 mobs:register_mob("mobs_mc:baby_pigman", baby_pigman)
 
+-- Regular spawning in the Nether
+mobs:spawn_specific("mobs_mc:pigman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 6000, 3, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max)
 -- Baby zombie is 20 times less likely than regular zombies
-mobs:register_spawn("mobs_mc:baby_pigman", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 100000, 4, 31000)
+mobs:spawn_specific("mobs_mc:baby_pigman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 100000, 4, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max)
 
---mobs:register_spawn("mobs_mc:pigman", {"nether:rack"},  17, -1, 5000, 3, -2000)
-mobs:register_spawn("mobs_mc:pigman", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 6000, 3, -2000)
-mobs:register_spawn("mobs_mc:pigman", mobs_mc.spawn.nether_portal, minetest.LIGHT_MAX+1, 0, 500, 4, 31000)
-mobs:spawn_specific("mobs_mc:pigman", mobs_mc.spawn.nether_portal, {"air", "mcl_portals:nether_air"},0, minetest.LIGHT_MAX+1, 7, 9000, 2, -31000, 31000)
+-- Spawning in Nether portals in the Overworld
+mobs:spawn_specific("mobs_mc:pigman", mobs_mc.spawn.nether_portal, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 500, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max)
 
 -- compatibility
 mobs:alias_mob("mobs:pigman", "mobs_mc:pigman")
diff --git a/mods/ENTITIES/mobs_mc_gameconfig/depends.txt b/mods/ENTITIES/mobs_mc_gameconfig/depends.txt
new file mode 100644
index 000000000..3b355984e
--- /dev/null
+++ b/mods/ENTITIES/mobs_mc_gameconfig/depends.txt
@@ -0,0 +1 @@
+mcl_init
diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua
index e598d3fd8..124352db7 100644
--- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua
+++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua
@@ -178,7 +178,28 @@ mobs_mc.override.spawn = {
 	desert = { "group:sand" },
 	jungle = { "mcl_core:podzol", "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern" },
 	snow = { "mcl_core:snow", "mcl_core:snowblock", "mcl_core:dirt_with_grass_snow" },
-	end_city = { "mcl_end:purpur_block" },
+	-- End stone added for shulkers because End cities don't generate yet
+	end_city = { "mcl_end:end_stone", "mcl_end:purpur_block" },
+	nether = { "mcl_nether:netherrack", "mcl_nether:quartz_ore" },
+	-- Netherrack added because there are no Nether fortresses yet. TODO: Remove netherrac from list as soon they're available
+	nether_fortress = { "mcl_nether:nether_brick", "mcl_nether:netherrack" },
 	wolf = { mobs_mc.override.items.grass_block, "mcl_core:dirt", "mcl_core:dirt_with_grass_snow", "mcl_core:snow", "mcl_core:snowblock", "mcl_core:podzol" },
 }
 
+-- This table contains important spawn height references for the mob spawn height.
+mobs_mc.override.spawn_height = {
+	water = tonumber(minetest.setting_get("water_level")) or 0, -- Water level in the Overworld
+
+	-- Overworld boundaries (inclusive)
+	overworld_min = mcl_vars.mg_overworld_min,
+	overworld_max = mcl_vars.mg_overworld_max,
+
+	-- Nether boundaries (inclusive)
+	nether_min = mcl_vars.mg_nether_min,
+	nether_max = mcl_vars.mg_nether_max,
+
+	-- End boundaries (inclusive)
+	end_min = mcl_vars.mg_end_min,
+	end_max = mcl_vars.mg_end_max,
+}
+
diff --git a/mods/ENVIRONMENT/weather_pack/skycolor.lua b/mods/ENVIRONMENT/weather_pack/skycolor.lua
index 6fe3870b1..0131c2383 100644
--- a/mods/ENVIRONMENT/weather_pack/skycolor.lua
+++ b/mods/ENVIRONMENT/weather_pack/skycolor.lua
@@ -74,7 +74,8 @@ skycolor = {
 		players = skycolor.utils.get_players(players)
 		for _, player in ipairs(players) do
 			local pos = player:getpos()
-			if pos.y >= mcl_vars.mg_bedrock_overworld_max then
+			local _, dim = mcl_util.y_to_layer(pos.y)
+			if dim == "overworld" then
 				player:set_sky(color, "plain", nil, true)
 			end
 		end
@@ -112,7 +113,8 @@ skycolor = {
 		local players = skycolor.utils.get_players(nil)
 		for _, player in ipairs(players) do
 			local pos = player:getpos()
-			if pos.y >= mcl_vars.mg_bedrock_overworld_max then
+			local _, dim = mcl_util.y_to_layer(pos.y)
+			if dim == "overworld" then
 				player:set_sky(color, "plain", nil, true)
 			end
 		end
@@ -125,7 +127,8 @@ skycolor = {
 		local players = skycolor.utils.get_players(players)
 		for _, player in ipairs(players) do
 			local pos = player:getpos()
-			if pos.y >= mcl_vars.mg_bedrock_overworld_max then
+			local _, dim = mcl_util.y_to_layer(pos.y)
+			if dim == "overworld" then
 				player:set_sky(nil, "regular", nil, true)
 			end
 		end
diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua
index 8c1718e04..89d51b035 100644
--- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua
+++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua
@@ -203,3 +203,5 @@ mesecon:register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off")
 mesecon:register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on")
 mesecon:register_mvps_stopper("mesecons_noteblock:noteblock")
 mesecon:register_mvps_stopper("3d_armor_stand:armor_stand")
+mesecon:register_mvps_stopper("mcl_portals:portal")
+mesecon:register_mvps_stopper("mcl_portals:portal_end")
diff --git a/mods/ITEMS/mcl_beds/depends.txt b/mods/ITEMS/mcl_beds/depends.txt
index 53f5b7c50..93b5fc03e 100644
--- a/mods/ITEMS/mcl_beds/depends.txt
+++ b/mods/ITEMS/mcl_beds/depends.txt
@@ -1,3 +1,5 @@
 mcl_sounds?
+mcl_util?
 mcl_wool?
 mcl_dye?
+mcl_tnt?
diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua
index cbb2c3c09..5f8e4daf0 100644
--- a/mods/ITEMS/mcl_beds/functions.lua
+++ b/mods/ITEMS/mcl_beds/functions.lua
@@ -136,6 +136,17 @@ function mcl_beds.skip_night()
 end
 
 function mcl_beds.on_rightclick(pos, player)
+	if minetest.get_modpath("mcl_init") then
+		local _, dim = mcl_util.y_to_layer(pos.y)
+		if dim == "nether" or dim == "end" then
+			-- Bed goes BOOM in the Nether or End.
+			minetest.remove_node(pos)
+			if minetest.get_modpath("mcl_tnt") then
+				tnt.boom(pos, {radius = 4, damage_radius = 4})
+			end
+			return
+		end
+	end
 	local name = player:get_player_name()
 	local ppos = player:getpos()
 	local tod = minetest.get_timeofday() * 24000
diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua
index fe3ee332d..3d00f3dcb 100644
--- a/mods/ITEMS/mcl_buckets/init.lua
+++ b/mods/ITEMS/mcl_buckets/init.lua
@@ -1,8 +1,6 @@
 -- Minetest 0.4 mod: bucket
 -- See README.txt for licensing and other information.
 
-local LIQUID_MAX = 8  --The number of water levels when liquid_finite is enabled
-
 minetest.register_alias("bucket:bucket_empty", "mcl_buckets:bucket_empty")
 minetest.register_alias("bucket:bucket_water", "mcl_buckets:bucket_water")
 minetest.register_alias("bucket:bucket_lava", "mcl_buckets:bucket_lava")
@@ -39,18 +37,29 @@ local sound_take = function(itemname, pos)
 end
 
 -- Register a new liquid
---   source = name of the source node
---   flowing = name of the flowing node
---   itemname = name of the new bucket item (or nil if liquid is not takeable)
+--   source_place = a string or function.
+--      * string: name of the node to place
+--      * function(pos): will returns name of the node to place with pos being the placement position
+--   source_take = table of liquid source node names to take
+--   itemname = itemstring of the new bucket item (or nil if liquid is not takeable)
 --   inventory_image = texture of the new bucket item (ignored if itemname == nil)
--- This function can be called from any mod (that depends on bucket).
-function mcl_buckets.register_liquid(source, flowing, itemname, inventory_image, name, longdesc, usagehelp)
-	mcl_buckets.liquids[source] = {
-		source = source,
-		flowing = flowing,
-		itemname = itemname,
-	}
-	mcl_buckets.liquids[flowing] = mcl_buckets.liquids[source]
+--   name = user-visible bucket description
+--   longdesc = long explanatory description (for help)
+--   usagehelp = short usage explanation (for help)
+--   extra_check = optional function(pos) which can returns false to avoid placing the liquid
+--
+-- This function can be called from any mod (which depends on this one)
+function mcl_buckets.register_liquid(source_place, source_take, itemname, inventory_image, name, longdesc, usagehelp, extra_check)
+	for i=1, #source_take do
+		mcl_buckets.liquids[source_take[i]] = {
+			source_place = source_place,
+			source_take = source_take[i],
+			itemname = itemname,
+		}
+		if type(source_place) == "string" then
+			mcl_buckets.liquids[source_place] = mcl_buckets.liquids[source_take[i]]
+		end
+	end
 
 	if itemname ~= nil then
 		minetest.register_craftitem(itemname, {
@@ -67,43 +76,38 @@ function mcl_buckets.register_liquid(source, flowing, itemname, inventory_image,
 				end
 
 				local node = minetest.get_node(pointed_thing.under)
+				local place_pos = pointed_thing.under
 				local nn = node.name
 				-- Call on_rightclick if the pointed node defines it
 				if user and not user:get_player_control().sneak then
 					if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].on_rightclick then
-						return minetest.registered_nodes[nn].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack
+						return minetest.registered_nodes[nn].on_rightclick(place_pos, node, user, itemstack) or itemstack
 					end
 				end
 
-				local place_liquid = function(pos, node, source, flowing, fullness)
-					sound_place(source, pos)
-					if math.floor(fullness/128) == 1 or (not minetest.settings:get_bool("liquid_finite")) then
-						minetest.add_node(pos, {name=source, param2=fullness})
-						return
-					elseif node.name == flowing then
-						fullness = fullness + node.param2
-					elseif node.name == source then
-						fullness = LIQUID_MAX
-					end
-
-					if fullness >= LIQUID_MAX then
-						minetest.add_node(pos, {name=source, param2=LIQUID_MAX})
-					else
-						minetest.add_node(pos, {name=flowing, param2=fullness})
-					end
+				local place_liquid = function(pos, itemstring)
+					local fullness = minetest.registered_nodes[itemstring].liquid_range
+					sound_place(itemstring, pos)
+					minetest.add_node(pos, {name=itemstring, param2=fullness})
 				end
 
+				local node_place
+				if type(source_place) == "function" then
+					node_place = source_place(place_pos)
+				else
+					node_place = source_place
+				end
 				-- Check if pointing to a buildable node
-				local fullness = tonumber(itemstack:get_metadata())
-				if not fullness then fullness = LIQUID_MAX end
 				local item = itemstack:get_name()
 
-				if item == "mcl_buckets:bucket_water" and
+				if extra_check and extra_check(place_pos) == false then
+					-- Fail placement of liquid
+				elseif item == "mcl_buckets:bucket_water" and
 						(nn == "mcl_cauldrons:cauldron" or
 						nn == "mcl_cauldrons:cauldron_1" or
 						nn == "mcl_cauldrons:cauldron_2") then
 					-- Put water into cauldron
-					minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_3"})
+					minetest.set_node(place_pos, {name="mcl_cauldrons:cauldron_3"})
 
 					sound_place("mcl_core:water_source", pos)
 				elseif item == "mcl_buckets:bucket_water" and nn == "mcl_cauldrons:cauldron_3" then
@@ -111,12 +115,12 @@ function mcl_buckets.register_liquid(source, flowing, itemname, inventory_image,
 				elseif minetest.registered_nodes[nn] and minetest.registered_nodes[nn].buildable_to then
 					-- buildable; replace the node
 					local pns = user:get_player_name()
-					if minetest.is_protected(pointed_thing.under, pns) then
+					if minetest.is_protected(place_pos, pns) then
 						return itemstack
 					end
-					place_liquid(pointed_thing.under, node, source, flowing, fullness)
-					if mod_doc and doc.entry_exists("nodes", source) then
-						doc.mark_entry_as_revealed(user:get_player_name(), "nodes", source)
+					place_liquid(place_pos, node_place)
+					if mod_doc and doc.entry_exists("nodes", node_place) then
+						doc.mark_entry_as_revealed(user:get_player_name(), "nodes", node_place)
 					end
 				else
 					-- not buildable to; place the liquid above
@@ -127,9 +131,9 @@ function mcl_buckets.register_liquid(source, flowing, itemname, inventory_image,
 						if minetest.is_protected(pointed_thing.above, pn) then
 							return itemstack
 						end
-						place_liquid(pointed_thing.above, node, source, flowing, fullness)
-						if mod_doc and doc.entry_exists("nodes", source) then
-							doc.mark_entry_as_revealed(user:get_player_name(), "nodes", source)
+						place_liquid(pointed_thing.above, node_place)
+						if mod_doc and doc.entry_exists("nodes", node_place) then
+							doc.mark_entry_as_revealed(user:get_player_name(), "nodes", node_place)
 						end
 					else
 						-- do not remove the bucket with the liquid
@@ -188,8 +192,7 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", {
 		-- Check if pointing to a liquid source
 		liquiddef = mcl_buckets.liquids[nn]
 		local new_bucket
-		if liquiddef ~= nil and liquiddef.itemname ~= nil and (nn == liquiddef.source or
-			(nn == liquiddef.flowing and minetest.settings:get_bool("liquid_finite"))) then
+		if liquiddef ~= nil and liquiddef.itemname ~= nil and (nn == liquiddef.source_take) then
 
 			-- Fill bucket, but not in Creative Mode
 			if not minetest.settings:get_bool("creative_mode") then
@@ -234,19 +237,37 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", {
 })
 
 if mod_mcl_core then
+	-- Water bucket
 	mcl_buckets.register_liquid(
 		"mcl_core:water_source",
-		"mcl_core:water_flowing",
+		{"mcl_core:water_source"},
 		"mcl_buckets:bucket_water",
 		"bucket_water.png",
 		"Water Bucket",
 		"A bucket can be used to collect and release liquids. This one is filled with water.",
-		"Right-click on any block to empty the bucket and put a water source on this spot."
+		"Right-click on any block to empty the bucket and put a water source on this spot.",
+		function(pos)
+			local _, dim = mcl_util.y_to_layer(pos.y)
+			if dim == "nether" then
+				minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16})
+				return false
+			else
+				return true
+			end
+		end
 	)
 
+	-- Lava bucket
 	mcl_buckets.register_liquid(
-		"mcl_core:lava_source",
-		"mcl_core:lava_flowing",
+		function(pos)
+			local _, dim = mcl_util.y_to_layer(pos.y)
+			if dim == "nether" then
+				return "mcl_nether:nether_lava_source"
+			else
+				return "mcl_core:lava_source"
+			end
+		end,
+		{"mcl_core:lava_source", "mcl_nether:nether_lava_source"},
 		"mcl_buckets:bucket_lava",
 		"bucket_lava.png",
 		"Lava Bucket",
diff --git a/mods/ITEMS/mcl_clock/depends.txt b/mods/ITEMS/mcl_clock/depends.txt
index 0430af2c8..bf2f4ce73 100644
--- a/mods/ITEMS/mcl_clock/depends.txt
+++ b/mods/ITEMS/mcl_clock/depends.txt
@@ -1,3 +1,4 @@
-mcl_core
+mcl_init
+mcl_util
 mesecons
 doc?
diff --git a/mods/ITEMS/mcl_clock/init.lua b/mods/ITEMS/mcl_clock/init.lua
index c011b1ee2..48bced175 100644
--- a/mods/ITEMS/mcl_clock/init.lua
+++ b/mods/ITEMS/mcl_clock/init.lua
@@ -12,10 +12,17 @@ mcl_clock.stereotype = "mcl_clock:clock"
 local watch = {}
 watch.old_time = -1
 
--- Image of all 64 possible faces
+local clock_frames = 64
+
+-- Timer for random clock spinning
+local random_timer = 0.0
+local random_timer_trigger = 1.0 -- random clock spinning tick in seconds. Increase if there are performance problems
+local random_frame = math.random(0, clock_frames-1)
+
+-- Image of all possible faces
 watch.images = {}
-for frame=0,63 do
-	table.insert(watch.images, "mcl_clock_clock.png^[verticalframe:64:"..frame)
+for frame=0, clock_frames-1 do
+	table.insert(watch.images, "mcl_clock_clock.png^[verticalframe:"..clock_frames..":"..frame)
 end
 
 local function round(num)
@@ -23,9 +30,9 @@ local function round(num)
 end
 
 function watch.get_clock_frame()
-	local t = 64 * minetest.get_timeofday()
+	local t = clock_frames * minetest.get_timeofday()
 	t = round(t)
-	if t == 64 then t = 0 end
+	if t == clock_frames then t = 0 end
 	return tostring(t)
 end
 
@@ -65,6 +72,12 @@ local force_clock_update_timer = 0
 minetest.register_globalstep(function(dtime)
 	local now = watch.get_clock_frame()
 	force_clock_update_timer = force_clock_update_timer + dtime
+	random_timer = random_timer + dtime
+	-- This causes the random spinning of the clock
+	if random_timer >= random_timer_trigger then
+		random_frame = (random_frame + math.random(-4, 4)) % clock_frames
+		random_timer = 0
+	end
 
 	if watch.old_time == now and force_clock_update_timer < 60 then
 		return
@@ -76,11 +89,19 @@ minetest.register_globalstep(function(dtime)
 	local players = minetest.get_connected_players()
 	for p, player in ipairs(players) do
 		for s, stack in ipairs(player:get_inventory():get_list("main")) do
+			local _, dim = mcl_util.y_to_layer(player:getpos().y)
+			local frame
+			-- Clocks do not work in the End, Nether or the Void
+			if dim == "end" or dim == "nether" or dim == "void" then
+				frame = random_frame
+			else
+				frame = now
+			end
 			local count = stack:get_count()
 			if stack:get_name() == mcl_clock.stereotype then
-				player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count)
-			elseif string.sub(stack:get_name(), 1, 16) == "mcl_clock:clock_" then
-				player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count)
+				player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..frame.." "..count)
+			elseif minetest.get_item_group(stack:get_name(), "clock") ~= 0 then
+				player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..frame.." "..count)
 			end
 		end
 	end
@@ -107,7 +128,7 @@ minetest.register_craft({
 watch.register_item(mcl_clock.stereotype, watch.images[1], true, 1)
 
 -- Faces
-for a=0,63,1 do
+for a=0,clock_frames-1,1 do
 	local b = a
 	if b > 31 then
 		b = b - 32
diff --git a/mods/ITEMS/mcl_compass/depends.txt b/mods/ITEMS/mcl_compass/depends.txt
index 0430af2c8..53ee1117a 100644
--- a/mods/ITEMS/mcl_compass/depends.txt
+++ b/mods/ITEMS/mcl_compass/depends.txt
@@ -1,3 +1,4 @@
 mcl_core
+mcl_util
 mesecons
 doc?
diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua
index b033c2b47..ff9db2aeb 100644
--- a/mods/ITEMS/mcl_compass/init.lua
+++ b/mods/ITEMS/mcl_compass/init.lua
@@ -1,9 +1,23 @@
 mcl_compass = {}
 
+local compass_frames = 32
+
 local default_spawn_settings = minetest.settings:get("static_spawnpoint")
 
+-- Timer for random compass spinning
+local random_timer = 0
+local random_timer_trigger = 0.5 -- random compass spinning tick in seconds. Increase if there are performance problems
+
+local random_frame = math.random(0, compass_frames-1)
+
 minetest.register_globalstep(function(dtime)
+	random_timer = random_timer + dtime
 	local players  = minetest.get_connected_players()
+
+	if random_timer >= random_timer_trigger then
+		random_frame = (random_frame + math.random(-1, 1)) % compass_frames
+		random_timer = 0
+	end
 	for i,player in ipairs(players) do
 		local function has_compass(player)
 			for _,stack in ipairs(player:get_inventory():get_list("main")) do
@@ -14,24 +28,31 @@ minetest.register_globalstep(function(dtime)
 			return false
 		end
 		if has_compass(player) then
-			local spawn = {x=0,y=0,z=0}
-			local s = minetest.settings:get("static_spawnpoint")
-			if s then
-				local numbers = string.split(s, ",")
-				spawn.x = tonumber(numbers[1])
-				spawn.y = tonumber(numbers[2])
-				spawn.z = tonumber(numbers[3])
-				if type(spawn.x) ~= "number" and type(spawn.y) ~= "number" and type(spawn.z) ~= "number" then
-					spawn = {x=0,y=0,z=0}
-				end
-			end
 			local pos = player:getpos()
-			local dir = player:get_look_horizontal()
-			local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z))
-			if angle_north < 0 then angle_north = angle_north + 360 end
-			local angle_dir = -math.deg(dir)
-			local angle_relative = (angle_north - angle_dir + 180) % 360
-			local compass_image = math.floor((angle_relative/11.25) + 0.5)%32
+			local _, dim = mcl_util.y_to_layer(pos.y)
+			local compass_image
+			-- Compasses do not work in the End, Nether or the Void
+			if dim == "end" or dim == "nether" or dim == "void" then
+				compass_image = random_frame
+			else
+				local spawn = {x=0,y=0,z=0}
+				local s = minetest.settings:get("static_spawnpoint")
+				if s then
+					local numbers = string.split(s, ",")
+					spawn.x = tonumber(numbers[1])
+					spawn.y = tonumber(numbers[2])
+					spawn.z = tonumber(numbers[3])
+					if type(spawn.x) ~= "number" and type(spawn.y) ~= "number" and type(spawn.z) ~= "number" then
+						spawn = {x=0,y=0,z=0}
+					end
+				end
+				local dir = player:get_look_horizontal()
+				local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z))
+				if angle_north < 0 then angle_north = angle_north + 360 end
+				local angle_dir = -math.deg(dir)
+				local angle_relative = (angle_north - angle_dir + 180) % 360
+				compass_image = math.floor((angle_relative/11.25) + 0.5) % compass_frames
+			end
 
 			for j,stack in ipairs(player:get_inventory():get_list("main")) do
 				if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and
@@ -45,7 +66,7 @@ minetest.register_globalstep(function(dtime)
 end)
 
 local images = {}
-for frame=0,31 do
+for frame = 0, compass_frames-1 do
 	local s = string.format("%02d", frame)
 	table.insert(images, "mcl_compass_compass_"..s..".png")
 end
diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua
index c9a06283d..464d9fd64 100644
--- a/mods/ITEMS/mcl_core/functions.lua
+++ b/mods/ITEMS/mcl_core/functions.lua
@@ -642,7 +642,7 @@ end
 
 
 
-local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_params().seed)
+local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed"))
 
 ------------------------------
 -- Spread grass blocks and mycelium on neighbor dirt
diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua
index 81274a49a..3c1c51f3a 100644
--- a/mods/ITEMS/mcl_core/nodes_misc.lua
+++ b/mods/ITEMS/mcl_core/nodes_misc.lua
@@ -153,6 +153,8 @@ minetest.register_node("mcl_core:realm_barrier", {
 	wield_image = "mcl_core_barrier.png^[colorize:#FF00FF:127^[transformFX",
 	tiles = { "blank.png" },
 	stack_max = 64,
+	-- To avoid players getting stuck forever between realms
+	damage_per_second = 8,
 	sunlight_propagates = true,
 	is_ground_content = false,
 	pointable = false,
diff --git a/mods/ITEMS/mcl_core/schematics/apple_tree.mts b/mods/ITEMS/mcl_core/schematics/apple_tree.mts
new file mode 100644
index 000000000..2bd57c1fc
Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/apple_tree.mts differ
diff --git a/mods/ITEMS/mcl_core/schematics/aspen_tree.mts b/mods/ITEMS/mcl_core/schematics/aspen_tree.mts
new file mode 100644
index 000000000..429a831c7
Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/aspen_tree.mts differ
diff --git a/mods/ITEMS/mcl_core/schematics/jungle_tree.mts b/mods/ITEMS/mcl_core/schematics/jungle_tree.mts
new file mode 100644
index 000000000..01a1b11a0
Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/jungle_tree.mts differ
diff --git a/mods/ITEMS/mcl_core/schematics/pine_tree.mts b/mods/ITEMS/mcl_core/schematics/pine_tree.mts
new file mode 100644
index 000000000..6f27d8392
Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/pine_tree.mts differ
diff --git a/mods/ITEMS/mcl_fire/fire_charge.lua b/mods/ITEMS/mcl_fire/fire_charge.lua
index dc3af8dd0..83612b870 100644
--- a/mods/ITEMS/mcl_fire/fire_charge.lua
+++ b/mods/ITEMS/mcl_fire/fire_charge.lua
@@ -15,17 +15,16 @@ minetest.register_craftitem("mcl_fire:fire_charge", {
 			end
 		end
 
+		-- Ignite/light fire
 		if pointed_thing.type == "node" then
-			if minetest.get_node(pointed_thing.under).name == "mcl_tnt:tnt" then
-				tnt.ignite(pointed_thing.under)
-				if not minetest.settings:get_bool("creative_mode") then
-					itemstack:take_item()
-				end
+			local nodedef = minetest.registered_nodes[node.name]
+			if nodedef and nodedef._on_ignite then
+				nodedef._on_ignite(user, pointed_thing)
 			else
 				mcl_fire.set_fire(pointed_thing)
-				if not minetest.settings:get_bool("creative_mode") then
-					itemstack:take_item()
-				end
+			end
+			if not minetest.settings:get_bool("creative_mode") then
+				itemstack:take_item()
 			end
 		end
 		return itemstack
diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua
index 8902c1604..9737c3adf 100644
--- a/mods/ITEMS/mcl_fire/flint_and_steel.lua
+++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua
@@ -2,7 +2,7 @@
 minetest.register_tool("mcl_fire:flint_and_steel", {
 	description = "Flint and Steel",
 	_doc_items_longdesc = "Flint and steel is a tool to start fires and ignite blocks.",
-	_doc_items_usagehelp = "Rightclick the surface of a block to attempt to light a fire in front of it. On netherrack and magma blocks it will start an eternal fire. Using it on TNT will ignite it.",
+	_doc_items_usagehelp = "Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.",
 	inventory_image = "mcl_fire_flint_and_steel.png",
 	liquids_pointable = false,
 	stack_max = 1,
@@ -25,7 +25,7 @@ minetest.register_tool("mcl_fire:flint_and_steel", {
 		if pointed_thing.type == "node" then
 			local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name]
 			if nodedef and nodedef._on_ignite then
-				nodedef._on_ignite(pointed_thing.under, user)
+				nodedef._on_ignite(user, pointed_thing)
 			else
 				mcl_fire.set_fire(pointed_thing)
 			end
diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua
index 7c542c73e..45eb44972 100644
--- a/mods/ITEMS/mcl_fire/init.lua
+++ b/mods/ITEMS/mcl_fire/init.lua
@@ -376,10 +376,14 @@ local eternal_override = {
 			minetest.remove_node(pos)
 		end
 	end,
-	_on_ignite = function(pos, player)
+	_on_ignite = function(player, pointed_thing)
+		local pos = pointed_thing.under
 		local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z}
-		if minetest.get_node(flame_pos).name == "air" then
+		local fn = minetest.get_node(flame_pos)
+		if fn.name == "air" and not minetest.is_protected(flame_pos, "fire") and pointed_thing.under.y < pointed_thing.above.y then
 			minetest.set_node(flame_pos, {name = "mcl_fire:eternal_fire"})
+		else
+			mcl_fire.set_fire(pointed_thing)
 		end
 	end,
 }
@@ -392,7 +396,7 @@ end
 -- Set pointed_thing on (normal) fire
 mcl_fire.set_fire = function(pointed_thing)
 	local n = minetest.get_node(pointed_thing.above)
-	if n.name ~= ""  and n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then
+	if n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then
 		minetest.add_node(pointed_thing.above, {name="mcl_fire:fire"})
 	end
 end
diff --git a/mods/ITEMS/mcl_portals/LICENSE b/mods/ITEMS/mcl_portals/LICENSE
new file mode 100644
index 000000000..ece42d0aa
--- /dev/null
+++ b/mods/ITEMS/mcl_portals/LICENSE
@@ -0,0 +1,7 @@
+The MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/mods/ITEMS/mcl_portals/README.md b/mods/ITEMS/mcl_portals/README.md
new file mode 100644
index 000000000..77c5c0efa
--- /dev/null
+++ b/mods/ITEMS/mcl_portals/README.md
@@ -0,0 +1,15 @@
+# Portals mod for MineClone 2
+## How to create portals
+
+Nether portal: Build an upright frame of obsidian, 4 blocks wide and 5 blocks high, and use a flint and steel inside it.
+End portal: Build an upright frame of red nether brick blocks, 4 blocks wide and 5 blocks high, and use an eye of ender inside it.
+
+## Credits
+Created by maikerumine and Wuzzy.
+Code license: MIT License (see `LICENSE`).
+
+Texture license: See main MineClone 2 directory.
+
+License of sound: [CC BY 3.0](http://creativecommons.org/licenses/by/3.0/)
+Authors: [FreqMan](https://freesound.org/people/FreqMan/) and Wuzzy
+Source: <https://freesound.org/people/FreqMan/sounds/32541/>
diff --git a/mods/ITEMS/mcl_portals/depends.txt b/mods/ITEMS/mcl_portals/depends.txt
new file mode 100644
index 000000000..fbb8a6e2d
--- /dev/null
+++ b/mods/ITEMS/mcl_portals/depends.txt
@@ -0,0 +1,7 @@
+mcl_init
+mcl_util
+mcl_core
+mcl_fire
+mcl_nether
+mcl_end
+doc?
diff --git a/mods/ITEMS/mcl_portals/description.txt b/mods/ITEMS/mcl_portals/description.txt
new file mode 100644
index 000000000..fe84531f3
--- /dev/null
+++ b/mods/ITEMS/mcl_portals/description.txt
@@ -0,0 +1 @@
+Adds buildable portals to the Nether and End dimensions.
diff --git a/mods/ITEMS/mcl_portals/init.lua b/mods/ITEMS/mcl_portals/init.lua
new file mode 100644
index 000000000..cf4716c40
--- /dev/null
+++ b/mods/ITEMS/mcl_portals/init.lua
@@ -0,0 +1,10 @@
+-- Load files
+
+-- Nether portal:
+-- Obsidian frame, activated by flint and steel
+dofile(minetest.get_modpath("mcl_portals").."/portal_nether.lua")
+
+-- End portal (W.I.P):
+-- Red nether brick block frame, activated by an eye of ender
+dofile(minetest.get_modpath("mcl_portals").."/portal_end.lua")
+
diff --git a/mods/ITEMS/mcl_portals/mod.conf b/mods/ITEMS/mcl_portals/mod.conf
new file mode 100644
index 000000000..e82fbe6c1
--- /dev/null
+++ b/mods/ITEMS/mcl_portals/mod.conf
@@ -0,0 +1 @@
+name = mcl_portals
diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua
new file mode 100644
index 000000000..bc26faf90
--- /dev/null
+++ b/mods/ITEMS/mcl_portals/portal_end.lua
@@ -0,0 +1,448 @@
+-- Parameters
+
+local TCAVE = 0.6
+local nobj_cave = nil
+
+local SPAWN_MIN = mcl_vars.mg_end_min+70
+local SPAWN_MAX = mcl_vars.mg_end_min+98
+
+-- 3D noise
+
+local np_cave = {
+	offset = 0,
+	scale = 1,
+	spread = {x = 384, y = 128, z = 384}, -- squashed 3:1
+	seed = 59033,
+	octaves = 5,
+	persist = 0.7
+}
+-- Portal frame material
+local portal_frame = "mcl_nether:quartz_block"
+
+-- Table of objects (including players) which recently teleported by a
+-- End portal. Those objects have a brief cooloff period before they
+-- can teleport again. This prevents annoying back-and-forth teleportation.
+local portal_cooloff = {}
+
+-- Destroy portal if pos (portal frame or portal node) got destroyed
+local destroy_portal = function(pos)
+	-- Deactivate Nether portal
+	local meta = minetest.get_meta(pos)
+	local p1 = minetest.string_to_pos(meta:get_string("portal_frame1"))
+	local p2 = minetest.string_to_pos(meta:get_string("portal_frame2"))
+	if not p1 or not p2 then
+		return
+	end
+
+	local first = true
+
+	-- p1 metadata of first node
+	local mp1
+	for x = p1.x, p2.x do
+	for y = p1.y, p2.y do
+	for z = p1.z, p2.z do
+		local p = vector.new(x, y, z)
+		local m = minetest.get_meta(p)
+		if first then
+			--[[ Only proceed if the first node still has metadata.
+			If it doesn't have metadata, another node propably triggred the delection
+			routine earlier, so we bail out earlier to avoid an infinite cascade
+			of on_destroy events. ]]
+			mp1 = minetest.string_to_pos(m:get_string("portal_frame1"))
+			if not mp1 then
+				return
+			end
+		end
+		local nn = minetest.get_node(p).name
+		if nn == portal_frame or nn == "mcl_portals:portal_end" then
+			-- Remove portal nodes, but not myself
+			if nn == "mcl_portals:portal_end" and not vector.equals(p, pos) then
+				minetest.remove_node(p)
+			end
+			-- Clear metadata of portal nodes and the frame
+			m:set_string("portal_frame1", "")
+			m:set_string("portal_frame2", "")
+			m:set_string("portal_target", "")
+		end
+		first = false
+	end
+	end
+	end
+end
+
+-- Nodes
+minetest.register_node("mcl_portals:portal_end", {
+	description = "End Portal",
+	_doc_items_longdesc = "An End portal teleports creatures and objects to the mysterious End dimension (and back!).",
+	_doc_items_usagehelp = "Stand in the portal for a moment to activate the teleportation. Entering such a portal for the first time will create a new portal in your destination. End portal which were built in the End will lead back to the Overworld. An End portal is destroyed if any of its surrounding frame blocks is destroyed.",
+	tiles = {
+		"blank.png",
+		"blank.png",
+		"blank.png",
+		"blank.png",
+		{
+			name = "mcl_portals_end_portal.png",
+			animation = {
+				type = "vertical_frames",
+				aspect_w = 16,
+				aspect_h = 16,
+				length = 2.0,
+			},
+		},
+		{
+			name = "mcl_portals_end_portal.png",
+			animation = {
+				type = "vertical_frames",
+				aspect_w = 16,
+				aspect_h = 16,
+				length = 2.0,
+			},
+		},
+	},
+	drawtype = "nodebox",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	sunlight_propagates = true,
+	use_texture_alpha = true,
+	walkable = false,
+	diggable = false,
+	pointable = false,
+	buildable_to = false,
+	is_ground_content = false,
+	drop = "",
+	-- This is 15 in MC.
+	light_source = 14,
+	post_effect_color = {a = 192, r = 0, g = 0, b = 0},
+	alpha = 192,
+	node_box = {
+		type = "fixed",
+		fixed = {
+			{-0.5, -0.5, -0.1,  0.5, 0.5, 0.1},
+		},
+	},
+	groups = {not_in_creative_inventory = 1},
+	on_destruct = destroy_portal,
+
+	_mcl_hardness = -1,
+	_mcl_blast_resistance = 18000000,
+})
+
+local function build_end_portal(pos, target3)
+	local p = {x = pos.x - 1, y = pos.y - 1, z = pos.z}
+	local p1 = {x = pos.x - 1, y = pos.y - 1, z = pos.z}
+	local p2 = {x = p1.x + 3, y = p1.y + 4, z = p1.z}
+
+	for i = 1, 4 do
+		minetest.set_node(p, {name = portal_frame})
+		p.y = p.y + 1
+	end
+	for i = 1, 3 do
+		minetest.set_node(p, {name = portal_frame})
+		p.x = p.x + 1
+	end
+	for i = 1, 4 do
+		minetest.set_node(p, {name = portal_frame})
+		p.y = p.y - 1
+	end
+	for i = 1, 3 do
+		minetest.set_node(p, {name = portal_frame})
+		p.x = p.x - 1
+	end
+
+	for x = p1.x, p2.x do
+	for y = p1.y, p2.y do
+		p = {x = x, y = y, z = p1.z}
+		if not (x == p1.x or x == p2.x or y == p1.y or y == p2.y) then
+			minetest.set_node(p, {name = "mcl_portals:portal_end", param2 = 0})
+		end
+		local meta = minetest.get_meta(p)
+		meta:set_string("portal_frame1", minetest.pos_to_string(p1))
+		meta:set_string("portal_frame2", minetest.pos_to_string(p2))
+		meta:set_string("portal_target", minetest.pos_to_string(target3))
+
+		for z = -2, 2 do
+			if z ~= 0 then
+				local newp = {x=p.x, y=p.y, z=p.z+z}
+				if y ~= p1.y then
+					if minetest.registered_nodes[
+							minetest.get_node(newp).name].is_ground_content then
+						minetest.remove_node(newp)
+					end
+				else
+					if minetest.get_node(newp).name == "air" then
+						minetest.set_node(newp, {name="mcl_core:obsidian"})
+					end
+
+				end
+			end
+		end
+	end
+	end
+end
+
+local function find_end_target3_y2(target3_x, target3_z)
+	local start_y = math.random(SPAWN_MIN, SPAWN_MAX) -- Search start
+	if not nobj_cave then
+		nobj_cave = minetest.get_perlin(np_cave)
+	end
+	local air = 0 -- Consecutive air nodes found
+
+	for y = start_y, SPAWN_MIN, -1 do
+		local nval_cave = nobj_cave:get3d({x = target3_x, y = y, z = target3_z})
+
+		if nval_cave > TCAVE then -- Cavern
+			air = air + 1
+		else -- Not cavern, check if 4 nodes of space above
+			if air >= 4 then
+				return y + 2
+			else -- Not enough space, reset air to zero
+				air = 0
+			end
+		end
+	end
+
+	return start_y -- Fallback
+end
+
+local function move_check2(p1, max, dir)
+	local p = {x = p1.x, y = p1.y, z = p1.z}
+	local d = math.abs(max - p1[dir]) / (max - p1[dir])
+
+	while p[dir] ~= max do
+		p[dir] = p[dir] + d
+		if minetest.get_node(p).name ~= portal_frame then
+			return false
+		end
+		-- Abort if any of the portal frame blocks already has metadata.
+		-- This mod does not yet portals which neighbor each other directly.
+		-- TODO: Reorganize the way how portal frame coordinates are stored.
+		local meta = minetest.get_meta(p)
+		local p1 = meta:get_string("portal_frame1")
+		if minetest.string_to_pos(p1) ~= nil then
+			return false
+		end
+	end
+
+	return true
+end
+
+local function check_end_portal(p1, p2)
+	if p1.x ~= p2.x then
+		if not move_check2(p1, p2.x, "x") then
+			return false
+		end
+		if not move_check2(p2, p1.x, "x") then
+			return false
+		end
+	elseif p1.z ~= p2.z then
+		if not move_check2(p1, p2.z, "z") then
+			return false
+		end
+		if not move_check2(p2, p1.z, "z") then
+			return false
+		end
+	else
+		return false
+	end
+
+	if not move_check2(p1, p2.y, "y") then
+		return false
+	end
+	if not move_check2(p2, p1.y, "y") then
+		return false
+	end
+
+	return true
+end
+
+local function is_end_portal(pos)
+	for d = -3, 3 do
+		for y = -4, 4 do
+			local px = {x = pos.x + d, y = pos.y + y, z = pos.z}
+			local pz = {x = pos.x, y = pos.y + y, z = pos.z + d}
+
+			if check_end_portal(px, {x = px.x + 3, y = px.y + 4, z = px.z}) then
+				return px, {x = px.x + 3, y = px.y + 4, z = px.z}
+			end
+			if check_end_portal(pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}) then
+				return pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}
+			end
+		end
+	end
+end
+
+local function make_end_portal(pos)
+	local p1, p2 = is_end_portal(pos)
+	if not p1 or not p2 then
+		return false
+	end
+
+	for d = 1, 2 do
+	for y = p1.y + 1, p2.y - 1 do
+		local p
+		if p1.z == p2.z then
+			p = {x = p1.x + d, y = y, z = p1.z}
+		else
+			p = {x = p1.x, y = y, z = p1.z + d}
+		end
+		if minetest.get_node(p).name ~= "air" then
+			return false
+		end
+	end
+	end
+
+	local param2
+	if p1.z == p2.z then
+		param2 = 0
+	else
+		param2 = 1
+	end
+
+	local target3 = {x = p1.x, y = p1.y, z = p1.z}
+	target3.x = target3.x + 1
+	if target3.y < mcl_vars.mg_end_max and target3.y > mcl_vars.mg_end_min then
+		target3.y = math.random(mcl_vars.mg_overworld_min + 40, mcl_vars.mg_overworld_min + 96)
+	else
+		target3.y = find_end_target3_y2(target3.x, target3.z)
+	end
+
+	for d = 0, 3 do
+	for y = p1.y, p2.y do
+		local p = {}
+		if param2 == 0 then
+			p = {x = p1.x + d, y = y, z = p1.z}
+		else
+			p = {x = p1.x, y = y, z = p1.z + d}
+		end
+		if minetest.get_node(p).name == "air" then
+			minetest.set_node(p, {name = "mcl_portals:portal_end", param2 = param2})
+		end
+		local meta = minetest.get_meta(p)
+
+		-- Portal frame corners
+		meta:set_string("portal_frame1", minetest.pos_to_string(p1))
+		meta:set_string("portal_frame2", minetest.pos_to_string(p2))
+
+		-- Portal target coordinates
+		meta:set_string("portal_target", minetest.pos_to_string(target3))
+	end
+	end
+
+	return true
+end
+
+minetest.register_abm({
+	label = "End portal teleportation",
+	nodenames = {"mcl_portals:portal_end"},
+	interval = 1,
+	chance = 2,
+	action = function(pos, node)
+		for _,obj in ipairs(minetest.get_objects_inside_radius(pos,1)) do --maikerumine added for objects to travel
+		local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel
+			if obj:is_player() or lua_entity then
+				-- No rapid back-and-forth teleportatio
+				if portal_cooloff[obj] then
+					return
+				end
+				local meta = minetest.get_meta(pos)
+				local target3 = minetest.string_to_pos(meta:get_string("portal_target"))
+				if target3 then
+					-- force emerge of target3 area
+					minetest.get_voxel_manip():read_from_map(target3, target3)
+					if not minetest.get_node_or_nil(target3) then
+						minetest.emerge_area(
+							vector.subtract(target3, 4), vector.add(target3, 4))
+					end
+
+					-- teleport the object
+					minetest.after(3, function(obj, pos, target3)
+						-- No rapid back-and-forth teleportatio
+						if portal_cooloff[obj] then
+							return
+						end
+						local objpos = obj:getpos()
+						if objpos == nil then
+							return
+						end
+						-- If player stands, player is at ca. something+0.5
+						-- which might cause precision problems, so we used ceil.
+						objpos.y = math.ceil(objpos.y)
+						if minetest.get_node(objpos).name ~= "mcl_portals:portal_end" then
+							return
+						end
+
+						-- Build destination
+						local function check_and_build_end_portal(pos, target3)
+							local n = minetest.get_node_or_nil(target3)
+							if n and n.name ~= "mcl_portals:portal_end" then
+								build_end_portal(target3, pos)
+								minetest.after(2, check_and_build_end_portal, pos, target3)
+							elseif not n then
+								minetest.after(1, check_and_build_end_portal, pos, target3)
+							end
+						end
+
+						check_and_build_end_portal(pos, target3)
+
+						-- Teleport
+						obj:setpos(target3)
+						minetest.sound_play("mcl_portals_teleport", {pos=target3, gain=0.5, max_hear_distance = 16})
+
+						-- Enable teleportation cooloff to prevent frequent back-and-forth teleportation
+						portal_cooloff[obj] = true
+						minetest.after(3, function(o)
+							portal_cooloff[o] = false
+						end, obj)
+
+					end, obj, pos, target3)
+				end
+			end
+		end
+	end,
+})
+
+
+--[[ ITEM OVERRIDES ]]
+
+local portal_open_help = "To open an End portal, place an upright frame of quartz blocks with a length of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, use an eye of ender on the frame. The eye of ender is destroyed in the process."
+
+-- Frame material
+minetest.override_item(portal_frame, {
+	_doc_items_longdesc = "A block of quartz can be used to create End portals.",
+	_doc_items_usagehelp = portal_open_help,
+	on_destruct = destroy_portal,
+})
+
+-- Portal opener
+minetest.override_item("mcl_end:ender_eye", {
+	_doc_items_longdesc = "An eye of ender can be used to open End portals.",
+	_doc_items_usagehelp = portal_open_help,
+	on_place = function(itemstack, user, pointed_thing)
+		-- Use pointed node's on_rightclick function first, if present
+		local node = minetest.get_node(pointed_thing.under)
+		if user and not user:get_player_control().sneak then
+			if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
+				return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack
+			end
+		end
+
+		-- If used on portal frame, open a portal
+		if pointed_thing.under and node.name == portal_frame then
+			local opened = make_end_portal(pointed_thing.under)
+			if opened then
+				if minetest.get_modpath("doc") then
+					doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal_end")
+				end
+				minetest.sound_play(
+					"fire_flint_and_steel",
+					{pos = pointed_thing.above, gain = 0.5, max_hear_distance = 16})
+				if not minetest.settings:get_bool("creative_mode") then
+					itemstack:take_item() -- 1 use
+				end
+			end
+		end
+
+		return itemstack
+	end,
+})
+
diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua
new file mode 100644
index 000000000..7789de420
--- /dev/null
+++ b/mods/ITEMS/mcl_portals/portal_nether.lua
@@ -0,0 +1,453 @@
+-- Parameters
+
+local TCAVE = 0.6
+local nobj_cave = nil
+
+-- Portal frame sizes
+local FRAME_SIZE_X_MIN = 4
+local FRAME_SIZE_Y_MIN = 5
+local FRAME_SIZE_X_MAX = 23
+local FRAME_SIZE_Y_MAX = 23
+
+-- 3D noise
+local np_cave = {
+	offset = 0,
+	scale = 1,
+	spread = {x = 384, y = 128, z = 384},
+	seed = 59033,
+	octaves = 5,
+	persist = 0.7
+}
+
+-- Table of objects (including players) which recently teleported by a
+-- Nether portal. Those objects have a brief cooloff period before they
+-- can teleport again. This prevents annoying back-and-forth teleportation.
+local portal_cooloff = {}
+
+-- Destroy portal if pos (portal frame or portal node) got destroyed
+local destroy_portal = function(pos)
+	-- Deactivate Nether portal
+	local meta = minetest.get_meta(pos)
+	local p1 = minetest.string_to_pos(meta:get_string("portal_frame1"))
+	local p2 = minetest.string_to_pos(meta:get_string("portal_frame2"))
+	if not p1 or not p2 then
+		return
+	end
+
+	local counter = 1
+
+	local mp1
+	for x = p1.x, p2.x do
+	for y = p1.y, p2.y do
+	for z = p1.z, p2.z do
+		local p = vector.new(x, y, z)
+		local m = minetest.get_meta(p)
+		if counter == 2 then
+			--[[ Only proceed if the second node still has metadata.
+			(first node is a corner and not needed for the portal)
+			If it doesn't have metadata, another node propably triggred the delection
+			routine earlier, so we bail out earlier to avoid an infinite cascade
+			of on_destroy events. ]]
+			mp1 = minetest.string_to_pos(m:get_string("portal_frame1"))
+			if not mp1 then
+				return
+			end
+		end
+		local nn = minetest.get_node(p).name
+		if nn == "mcl_core:obsidian" or nn == "mcl_portals:portal" then
+			-- Remove portal nodes, but not myself
+			if nn == "mcl_portals:portal" and not vector.equals(p, pos) then
+				minetest.remove_node(p)
+			end
+			-- Clear metadata of portal nodes and the frame
+			m:set_string("portal_frame1", "")
+			m:set_string("portal_frame2", "")
+			m:set_string("portal_target", "")
+		end
+		counter = counter + 1
+	end
+	end
+	end
+end
+
+minetest.register_node("mcl_portals:portal", {
+	description = "Nether Portal",
+	_doc_items_longdesc = "A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!",
+	_doc_items_usagehelp = "Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.",
+
+	tiles = {
+		"blank.png",
+		"blank.png",
+		"blank.png",
+		"blank.png",
+		{
+			name = "mcl_portals_portal.png",
+			animation = {
+				type = "vertical_frames",
+				aspect_w = 16,
+				aspect_h = 16,
+				length = 0.5,
+			},
+		},
+		{
+			name = "mcl_portals_portal.png",
+			animation = {
+				type = "vertical_frames",
+				aspect_w = 16,
+				aspect_h = 16,
+				length = 0.5,
+			},
+		},
+	},
+	drawtype = "nodebox",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	sunlight_propagates = true,
+	use_texture_alpha = true,
+	walkable = false,
+	diggable = false,
+	pointable = false,
+	buildable_to = false,
+	is_ground_content = false,
+	drop = "",
+	light_source = 11,
+	post_effect_color = {a = 180, r = 128, g = 23, b = 23},
+	alpha = 192,
+	node_box = {
+		type = "fixed",
+		fixed = {
+			{-0.5, -0.5, -0.1,  0.5, 0.5, 0.1},
+		},
+	},
+	groups = {not_in_creative_inventory = 1},
+	on_destruct = destroy_portal,
+
+	_mcl_hardness = -1,
+	_mcl_blast_resistance = 0,
+})
+
+-- Functions
+--Build arrival portal
+local function build_portal(pos, target)
+	local p = {x = pos.x - 1, y = pos.y - 1, z = pos.z}
+	local p1 = {x = pos.x - 1, y = pos.y - 1, z = pos.z}
+	local p2 = {x = p1.x + 3, y = p1.y + 4, z = p1.z}
+
+	for i = 1, FRAME_SIZE_Y_MIN - 1 do
+		minetest.set_node(p, {name = "mcl_core:obsidian"})
+		p.y = p.y + 1
+	end
+	for i = 1, FRAME_SIZE_X_MIN - 1 do
+		minetest.set_node(p, {name = "mcl_core:obsidian"})
+		p.x = p.x + 1
+	end
+	for i = 1, FRAME_SIZE_Y_MIN - 1 do
+		minetest.set_node(p, {name = "mcl_core:obsidian"})
+		p.y = p.y - 1
+	end
+	for i = 1, FRAME_SIZE_X_MIN - 1 do
+		minetest.set_node(p, {name = "mcl_core:obsidian"})
+		p.x = p.x - 1
+	end
+
+	for x = p1.x, p2.x do
+	for y = p1.y, p2.y do
+		p = {x = x, y = y, z = p1.z}
+		if not ((x == p1.x or x == p2.x) and (y == p1.y or y == p2.y)) then
+			if not (x == p1.x or x == p2.x or y == p1.y or y == p2.y) then
+				minetest.set_node(p, {name = "mcl_portals:portal", param2 = 0})
+			end
+			local meta = minetest.get_meta(p)
+			meta:set_string("portal_frame1", minetest.pos_to_string(p1))
+			meta:set_string("portal_frame2", minetest.pos_to_string(p2))
+			meta:set_string("portal_target", minetest.pos_to_string(target))
+		end
+
+		if y ~= p1.y then
+			for z = -2, 2 do
+				if z ~= 0 then
+					p.z = p.z + z
+					if minetest.registered_nodes[
+							minetest.get_node(p).name].is_ground_content then
+						minetest.remove_node(p)
+					end
+					p.z = p.z - z
+				end
+			end
+		end
+	end
+	end
+end
+
+local function find_nether_target_y(target_x, target_z)
+	local start_y = mcl_vars.mg_nether_min + math.random(38, 117) -- Search start
+	if not nobj_cave then
+		nobj_cave = minetest.get_perlin(np_cave)
+	end
+	local air = 4
+
+	for y = start_y, start_y -117, -1 do
+		local nval_cave = nobj_cave:get3d({x = target_x, y = y, z = target_z})
+
+		if nval_cave > TCAVE then -- Cavern
+			air = air + 1
+		else -- Not cavern, check if 4 nodes of space above
+			if air >= 4 then
+				return y + 2
+			else -- Not enough space, reset air to zero
+				air = 0
+			end
+		end
+	end
+
+	return start_y -- Fallback
+end
+
+local function move_check(p1, max, dir)
+	local p = {x = p1.x, y = p1.y, z = p1.z}
+	local d = math.sign(max - p1[dir])
+	local min = p[dir]
+
+	for k = min, max, d do
+		p[dir] = k
+		local node = minetest.get_node(p)
+		-- Check for obsidian (except at corners)
+		if k ~= min and k ~= max and node.name ~= "mcl_core:obsidian" then
+			return false
+		end
+		-- Abort if any of the portal frame blocks already has metadata.
+		-- This mod does not yet portals which neighbor each other directly.
+		-- TODO: Reorganize the way how portal frame coordinates are stored.
+		if node.name == "mcl_core:obsidian" then
+			local meta = minetest.get_meta(p)
+			local pframe1 = meta:get_string("portal_frame1")
+			if minetest.string_to_pos(pframe1) ~= nil then
+				return false
+			end
+		end
+	end
+
+	return true
+end
+
+local function check_portal(p1, p2)
+	if p1.x ~= p2.x then
+		if not move_check(p1, p2.x, "x") then
+			return false
+		end
+		if not move_check(p2, p1.x, "x") then
+			return false
+		end
+	elseif p1.z ~= p2.z then
+		if not move_check(p1, p2.z, "z") then
+			return false
+		end
+		if not move_check(p2, p1.z, "z") then
+			return false
+		end
+	else
+		return false
+	end
+
+	if not move_check(p1, p2.y, "y") then
+		return false
+	end
+	if not move_check(p2, p1.y, "y") then
+		return false
+	end
+
+	return true
+end
+
+local function is_portal(pos)
+	local xsize, ysize = FRAME_SIZE_X_MIN-1, FRAME_SIZE_Y_MIN-1
+	for d = -xsize, xsize do
+		for y = -ysize, ysize do
+			local px = {x = pos.x + d, y = pos.y + y, z = pos.z}
+			local pz = {x = pos.x, y = pos.y + y, z = pos.z + d}
+
+			if check_portal(px, {x = px.x + xsize, y = px.y + ysize, z = px.z}) then
+				return px, {x = px.x + xsize, y = px.y + ysize, z = px.z}
+			end
+			if check_portal(pz, {x = pz.x, y = pz.y + ysize, z = pz.z + xsize}) then
+				return pz, {x = pz.x, y = pz.y + ysize, z = pz.z + xsize}
+			end
+		end
+	end
+end
+
+local function make_portal(pos)
+	local p1, p2 = is_portal(pos)
+	if not p1 or not p2 then
+		return false
+	end
+
+	for d = 1, 2 do
+	for y = p1.y + 1, p2.y - 1 do
+		local p
+		if p1.z == p2.z then
+			p = {x = p1.x + d, y = y, z = p1.z}
+		else
+			p = {x = p1.x, y = y, z = p1.z + d}
+		end
+		if minetest.get_node(p).name ~= "air" then
+			return false
+		end
+	end
+	end
+
+	local param2
+	if p1.z == p2.z then
+		param2 = 0
+	else
+		param2 = 1
+	end
+
+	local target = {x = p1.x, y = p1.y, z = p1.z}
+	target.x = target.x + 1
+	if target.y < mcl_vars.mg_nether_max and target.y > mcl_vars.mg_nether_min then
+		target.y = math.random(mcl_vars.mg_overworld_min + 40, mcl_vars.mg_overworld_min + 96)
+	else
+		target.y = find_nether_target_y(target.x, target.z)
+	end
+
+	local dmin, dmax, ymin, ymax = 0, FRAME_SIZE_X_MIN - 1, p1.y, p2.y
+	for d = dmin, dmax do
+	for y = ymin, ymax do
+	if not ((d == dmin or d == dmax) and (y == ymin or y == ymax)) then
+		local p
+		if param2 == 0 then
+			p = {x = p1.x + d, y = y, z = p1.z}
+		else
+			p = {x = p1.x, y = y, z = p1.z + d}
+		end
+		if minetest.get_node(p).name == "air" then
+			minetest.set_node(p, {name = "mcl_portals:portal", param2 = param2})
+		end
+		local meta = minetest.get_meta(p)
+
+		-- Portal frame corners
+		meta:set_string("portal_frame1", minetest.pos_to_string(p1))
+		meta:set_string("portal_frame2", minetest.pos_to_string(p2))
+
+		-- Portal target coordinates
+		meta:set_string("portal_target", minetest.pos_to_string(target))
+	end
+	end
+	end
+
+	return true
+end
+
+
+minetest.register_abm({
+	label = "Nether portal teleportation and particles",
+	nodenames = {"mcl_portals:portal"},
+	interval = 1,
+	chance = 2,
+	action = function(pos, node)
+		minetest.add_particlespawner(
+			32, --amount
+			4, --time
+			{x = pos.x - 0.25, y = pos.y - 0.25, z = pos.z - 0.25}, --minpos
+			{x = pos.x + 0.25, y = pos.y + 0.25, z = pos.z + 0.25}, --maxpos
+			{x = -0.8, y = -0.8, z = -0.8}, --minvel
+			{x = 0.8, y = 0.8, z = 0.8}, --maxvel
+			{x = 0, y = 0, z = 0}, --minacc
+			{x = 0, y = 0, z = 0}, --maxacc
+			0.5, --minexptime
+			1, --maxexptime
+			1, --minsize
+			2, --maxsize
+			false, --collisiondetection
+			"mcl_portals_particle.png" --texture
+		)
+		for _,obj in ipairs(minetest.get_objects_inside_radius(pos,1)) do		--maikerumine added for objects to travel
+			local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel
+			if obj:is_player() or lua_entity then
+				-- Prevent quick back-and-forth teleportation
+				if portal_cooloff[obj] then
+					return
+				end
+				local meta = minetest.get_meta(pos)
+				local target = minetest.string_to_pos(meta:get_string("portal_target"))
+				if target then
+					-- force emerge of target area
+					minetest.get_voxel_manip():read_from_map(target, target)
+					if not minetest.get_node_or_nil(target) then
+						minetest.emerge_area(
+							vector.subtract(target, 4), vector.add(target, 4))
+					end
+					-- teleport the object
+					minetest.after(3, function(obj, pos, target)
+						-- Prevent quick back-and-forth teleportation
+						if portal_cooloff[obj] then
+							return
+						end
+						local objpos = obj:getpos()
+						if objpos == nil then
+							return
+						end
+						-- If player stands, player is at ca. something+0.5
+						-- which might cause precision problems, so we used ceil.
+						objpos.y = math.ceil(objpos.y)
+
+						if minetest.get_node(objpos).name ~= "mcl_portals:portal" then
+							return
+						end
+
+						-- Build target portal
+						local function check_and_build_portal(pos, target)
+							local n = minetest.get_node_or_nil(target)
+							if n and n.name ~= "mcl_portals:portal" then
+								build_portal(target, pos)
+								minetest.after(2, check_and_build_portal, pos, target)
+							elseif not n then
+								minetest.after(1, check_and_build_portal, pos, target)
+							end
+						end
+
+						check_and_build_portal(pos, target)
+
+						-- Teleport
+						obj:setpos(target)
+						minetest.sound_play("mcl_portals_teleport", {pos=target, gain=0.5, max_hear_distance = 16})
+
+						-- Enable teleportation cooloff for 4 seconds, to prevent back-and-forth teleportation
+						portal_cooloff[obj] = true
+						minetest.after(4, function(o)
+							portal_cooloff[o] = false
+						end, obj)
+
+					end, obj, pos, target)
+				end
+			end
+		end
+	end,
+})
+
+
+--[[ ITEM OVERRIDES ]]
+
+local longdesc = minetest.registered_nodes["mcl_core:obsidian"]._doc_items_longdesc
+longdesc = longdesc .. "\n" .. "Obsidian is also used as the frame of Nether portals."
+local usagehelp = "To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, ignite the obsidian with an appropriate tool, such as flint of steel."
+
+minetest.override_item("mcl_core:obsidian", {
+	_doc_items_longdesc = longdesc,
+	_doc_items_usagehelp = usagehelp,
+	on_destruct = destroy_portal,
+	_on_ignite = function(user, pointed_thing)
+		local pos = pointed_thing.under
+		local portal_placed = make_portal(pos)
+		if portal_placed and minetest.get_modpath("doc") then
+			doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal")
+		else
+			local node = minetest.get_node(pointed_thing.above)
+			if node.name ~= "mcl_portals:portal" then
+				mcl_fire.set_fire(pointed_thing)
+			end
+		end
+	end,
+})
+
diff --git a/mods/ITEMS/mcl_portals/sounds/mcl_portals_teleport.ogg b/mods/ITEMS/mcl_portals/sounds/mcl_portals_teleport.ogg
new file mode 100644
index 000000000..b943a8325
Binary files /dev/null and b/mods/ITEMS/mcl_portals/sounds/mcl_portals_teleport.ogg differ
diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_end_portal.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_end_portal.png
new file mode 100644
index 000000000..975be7f7d
Binary files /dev/null and b/mods/ITEMS/mcl_portals/textures/mcl_portals_end_portal.png differ
diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_particle.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_particle.png
new file mode 100644
index 000000000..56a5b78c4
Binary files /dev/null and b/mods/ITEMS/mcl_portals/textures/mcl_portals_particle.png differ
diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_portal.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_portal.png
new file mode 100644
index 000000000..4fad43cbd
Binary files /dev/null and b/mods/ITEMS/mcl_portals/textures/mcl_portals_portal.png differ
diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua
index ff91b0f44..84094a5ac 100644
--- a/mods/ITEMS/mcl_tnt/init.lua
+++ b/mods/ITEMS/mcl_tnt/init.lua
@@ -71,8 +71,8 @@ minetest.register_node("mcl_tnt:tnt", {
 	mesecons = {effector = {
 		action_on = tnt.ignite
 	}},
-	_on_ignite = function(pos, player)
-		tnt.ignite(pos)
+	_on_ignite = function(player, pointed_thing)
+		tnt.ignite(pointed_thing.under)
 	end,
 	sounds = sounds,
 })
diff --git a/mods/MAPGEN/mcl_biomes/LICENSE b/mods/MAPGEN/mcl_biomes/LICENSE
new file mode 100644
index 000000000..1f95d26c5
--- /dev/null
+++ b/mods/MAPGEN/mcl_biomes/LICENSE
@@ -0,0 +1,5 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/mods/MAPGEN/mcl_biomes/README.md b/mods/MAPGEN/mcl_biomes/README.md
new file mode 100644
index 000000000..e4f3edc5e
--- /dev/null
+++ b/mods/MAPGEN/mcl_biomes/README.md
@@ -0,0 +1 @@
+Biomes mod. By Wuzzy and maikerumine.
diff --git a/mods/MAPGEN/mcl_biomes/depends.txt b/mods/MAPGEN/mcl_biomes/depends.txt
index 442501faa..39cd4d88a 100644
--- a/mods/MAPGEN/mcl_biomes/depends.txt
+++ b/mods/MAPGEN/mcl_biomes/depends.txt
@@ -1,3 +1,4 @@
+mcl_init
 mcl_core
 mcl_farming
-mcl_flowers
+mcl_flowers
\ No newline at end of file
diff --git a/mods/MAPGEN/mcl_biomes/description.txt b/mods/MAPGEN/mcl_biomes/description.txt
new file mode 100644
index 000000000..496ffb217
--- /dev/null
+++ b/mods/MAPGEN/mcl_biomes/description.txt
@@ -0,0 +1 @@
+Adds the various biomes and biome-related things for non-v6 map generators.
diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua
index ddbd8456e..fc3fc07f0 100644
--- a/mods/MAPGEN/mcl_biomes/init.lua
+++ b/mods/MAPGEN/mcl_biomes/init.lua
@@ -1,7 +1,7 @@
+local mg_name = minetest.get_mapgen_setting("mg_name")
 
 --
--- Register biomes for mapgens other than v6
--- EXPERIMENTAL!
+-- Register biomes
 --
 
 local function register_classic_superflat_biome()
@@ -13,8 +13,8 @@ local function register_classic_superflat_biome()
 		node_filler = "mcl_core:dirt",
 		depth_filler = 3,
 		node_stone = "mcl_core:dirt",
-		y_min = -512,
-		y_max = 512,
+		y_min = mcl_vars.mg_overworld_min - 512,
+		y_max = mcl_vars.mg_overworld_max,
 		heat_point = 50,
 		humidity_point = 50,
 	})
@@ -23,38 +23,234 @@ end
 -- All mapgens except mgv6, flat and singlenode
 local function register_biomes()
 
+	local upper_limit = mcl_vars.mg_overworld_max
+	--[[ OVERWORLD ]]
+
+	-- Icesheet
 	minetest.register_biome({
-		name = "ice_plains",
+		name = "icesheet",
+		node_dust = "mcl_core:snowblock",
+		node_top = "mcl_core:snowblock",
+		depth_top = 1,
+		node_filler = "mcl_core:snowblock",
+		depth_filler = 3,
+		node_stone = "mcl_core:packed_ice",
+		node_water_top = "mcl_core:ice",
+		depth_water_top = 10,
+		node_river_water = "mcl_core:ice",
+		node_riverbed = "mcl_core:gravel",
+		depth_riverbed = 2,
+		y_min = -8,
+		y_max = upper_limit,
+		heat_point = 0,
+		humidity_point = 73,
+	})
+
+	minetest.register_biome({
+		name = "icesheet_ocean",
+		node_dust = "mcl_core:snowblock",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_water_top = "mcl_core:ice",
+		depth_water_top = 10,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = -9,
+		heat_point = 0,
+		humidity_point = 73,
+	})
+
+	-- Tundra
+
+	minetest.register_biome({
+		name = "tundra",
+		node_dust = "mcl_core:snowblock",
+		node_riverbed = "mcl_core:gravel",
+		depth_riverbed = 2,
+		y_min = 2,
+		y_max = upper_limit,
+		heat_point = 0,
+		humidity_point = 40,
+	})
+
+	minetest.register_biome({
+		name = "tundra_beach",
+		node_top = "mcl_core:gravel",
+		depth_top = 1,
+		node_filler = "mcl_core:gravel",
+		depth_filler = 2,
+		node_riverbed = "mcl_core:gravel",
+		depth_riverbed = 2,
+		y_min = -3,
+		y_max = 1,
+		heat_point = 0,
+		humidity_point = 40,
+	})
+
+	minetest.register_biome({
+		name = "tundra_ocean",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:dirt",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = -4,
+		heat_point = 0,
+		humidity_point = 40,
+	})
+
+	-- Taiga
+	minetest.register_biome({
+		name = "taiga",
+		node_top = "mcl_core:podzol",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = 15,
+		y_max = upper_limit,
+		heat_point = 26,
+		humidity_point = 72,
+	})
+
+	minetest.register_biome({
+		name = "taiga_ocean",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:dirt",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = 1,
+		heat_point = 26,
+		humidity_point = 72,
+	})
+
+	-- Snowy grassland
+	minetest.register_biome({
+		name = "snowy_grassland",
 		node_dust = "mcl_core:snow",
 		node_top = "mcl_core:dirt_with_grass_snow",
 		depth_top = 1,
 		node_filler = "mcl_core:dirt",
-		depth_filler = 3,
-		node_riverbed = "mcl_core:dirt",
+		depth_filler = 1,
+		node_riverbed = "mcl_core:sand",
 		depth_riverbed = 2,
-		y_min = 1,
-		y_max = 31000,
-		heat_point = 5,
-		humidity_point = 50,
+		y_min = 5,
+		y_max = upper_limit,
+		heat_point = 13,
+		humidity_point = 79,
 	})
 
 	minetest.register_biome({
-		name = "ice_plains2",
-		node_dust = "mcl_core:snowblock",
-		node_top = "mcl_core:dirt_with_grass_snow",
+		name = "snowy_grassland_ocean",
+		node_top = "mcl_core:dirt",
 		depth_top = 1,
 		node_filler = "mcl_core:dirt",
 		depth_filler = 3,
 		node_riverbed = "mcl_core:dirt",
 		depth_riverbed = 2,
-		y_min = 1,
-		y_max = 31000,
-		heat_point = 0,
-		humidity_point = 50,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = 4,
+		heat_point = 13,
+		humidity_point = 79,
+	})
+
+	-- Grassland
+	minetest.register_biome({
+		name = "grassland",
+		node_top = "mcl_core:dirt_with_grass",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 1,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = 6,
+		y_max = upper_limit,
+		heat_point = 26,
+		humidity_point = 45,
 	})
 
 	minetest.register_biome({
-		name = "plains",
+		name = "grassland_dunes",
+		node_top = "mcl_core:sand",
+		depth_top = 1,
+		node_filler = "mcl_core:sand",
+		depth_filler = 2,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = 5,
+		y_max = 1,
+		heat_point = 26,
+		humidity_point = 45,
+	})
+
+
+	minetest.register_biome({
+		name = "grassland_ocean",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:dirt",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = 0,
+		heat_point = 26,
+		humidity_point = 45,
+	})
+
+	-- Coniferous forest
+	minetest.register_biome({
+		name = "coniferous_forest",
+		node_top = "mcl_core:dirt_with_grass",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = 6,
+		y_max = upper_limit,
+		heat_point = 47,
+		humidity_point = 73,  --was 70
+	})
+
+	minetest.register_biome({
+		name = "coniferous_forest_dunes",
+		node_top = "mcl_core:sand",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = 1,
+		y_max = 56,
+		heat_point = 47,
+		humidity_point = 73,  --was 70
+	})
+
+	minetest.register_biome({
+		name = "coniferous_forest_ocean",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:dirt",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = 0,
+		heat_point = 47,
+		humidity_point = 73,  --was 70
+	})
+
+	-- Deciduous forest
+	minetest.register_biome({
+		name = "deciduous_forest",
 		node_top = "mcl_core:dirt_with_grass",
 		depth_top = 1,
 		node_filler = "mcl_core:dirt",
@@ -62,151 +258,1353 @@ local function register_biomes()
 		node_riverbed = "mcl_core:sand",
 		depth_riverbed = 2,
 		y_min = 1,
-		y_max = 31000,
-		heat_point = 40,
-		humidity_point = 50,
+		y_max = upper_limit,
+		heat_point = 33,
+		humidity_point = 44,  --was 68
 	})
 
 	minetest.register_biome({
-		name = "beach",
-		node_top = "mcl_core:sand",
+		name = "deciduous_forest_shore",
+		node_top = "mcl_core:dirt",
 		depth_top = 1,
-		node_filler = "mcl_core:sand",
+		node_filler = "mcl_core:dirt",
 		depth_filler = 3,
 		node_riverbed = "mcl_core:sand",
 		depth_riverbed = 2,
-		y_min = 1,
-		y_max = 5,
-		heat_point = 40,
-		humidity_point = 50,
+		y_min = -1,
+		y_max = 0,
+		heat_point = 33,
+		humidity_point = 44,  --was 68
 	})
 
+	minetest.register_biome({
+		name = "deciduous_forest_ocean",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:dirt",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = -2,
+		heat_point = 33,
+		humidity_point = 44,  --was 68
+	})
+
+	-- Desert
 	minetest.register_biome({
 		name = "desert",
-		node_top = "mcl_core:sand",
+		node_top = "mcl_core:redsand",
 		depth_top = 1,
-		node_filler = "mcl_core:sand",
-		depth_filler = 3,
+		node_filler = "mcl_core:redsand",
+		depth_filler = 1,
+		node_stone = "mcl_core:redsandstone",
 		node_riverbed = "mcl_core:sand",
 		depth_riverbed = 2,
-		node_stone = "mcl_core:sandstone",
 		y_min = 1,
-		y_max = 31000,
-		heat_point = 100,
-		humidity_point = 50,
+		y_max = upper_limit,
+		heat_point = 64,
+		humidity_point = 37,  --was 16
 	})
 
 	minetest.register_biome({
-		name = "mesa",
+		name = "desert_ocean",
 		node_top = "mcl_core:redsand",
 		depth_top = 1,
-		node_filler = "mcl_core:hardened_clay",
+		node_filler = "mcl_core:redsand",
 		depth_filler = 3,
 		node_riverbed = "mcl_core:redsand",
 		depth_riverbed = 2,
-		node_stone = "mcl_core:hardened_clay",
-		y_min = 1,
-		y_max = 5,
-		heat_point = 100,
-		humidity_point = 50,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = 0,
+		heat_point = 64,
+		humidity_point = 37,  --was 16
 	})
 
+	-- Sandstone desert
 	minetest.register_biome({
-		name = "mesa2",
-		node_top = "mcl_colorblocks:hardened_clay",
+		name = "sandstone_desert",
+		node_top = "mcl_core:redsand",
 		depth_top = 1,
-		node_filler = "mcl_colorblocks:hardened_clay_orange",
+		node_filler = "mcl_core:redsand",
 		depth_filler = 1,
 		node_riverbed = "mcl_core:redsand",
 		depth_riverbed = 2,
-		node_stone = "mcl_core:hardened_clay",
-		y_min = 1,
-		y_max = 5,
-		heat_point = 100,
-		humidity_point = 50,
+		y_min = 0,
+		y_max = upper_limit,
+		heat_point = 57,
+		humidity_point = 0,  --was 0
+	})
+
+	minetest.register_biome({
+		name = "sandstone_desert_ocean",
+		node_top = "mcl_core:sand",
+		depth_top = 1,
+		node_filler = "mcl_core:sand",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = 4,
+		heat_point = 57,
+		humidity_point = 0,  --was 0
+	})
+
+	-- TODO: Remove cold desert
+	-- Cold desert
+	minetest.register_biome({
+		name = "cold_desert",
+		--node_dust = "",
+		node_top = "mcl_core:coarse_dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:coarse_dirt",
+		depth_filler = 1,
+		node_riverbed = "mcl_core:stone",
+		depth_riverbed = 2,
+		y_min = 5,
+		y_max = upper_limit,
+		heat_point = 26,
+		humidity_point = 0,  --was 0
+	})
+
+	minetest.register_biome({
+		name = "cold_desert_ocean",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 1,
+		node_riverbed = "mcl_core:stone",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = 4,
+		heat_point = 26,
+		humidity_point = 0,  --was 0
+	})
+
+	-- Hot biomes
+	minetest.register_biome({
+		name = "mesa",
+		node_top = "mcl_colorblocks:hardened_clay_orange",
+		depth_top = 1,
+		node_filler = "mcl_colorblocks:hardened_clay_orange",
+		depth_filler = 1,
+		node_stone = "mcl_colorblocks:hardened_clay_orange",
+		y_min = -35,
+		y_max = upper_limit,
+		heat_point = 88,
+		humidity_point = 20,  --was 40
 	})
 
 
+	-- Savanna
+	minetest.register_biome({
+		name = "savanna",
+		node_top = "mcl_core:dirt_with_grass",
+		depth_top = 1,
+		node_filler = "mcl_core:coarse_dirt",
+		depth_filler = 2,
+		node_riverbed = "mcl_core:coarse_dirt",
+		depth_riverbed = 2,
+		y_min = 1,
+		y_max = upper_limit,
+		heat_point = 50,
+		humidity_point = 46,  --was 42
+	})
+
+	minetest.register_biome({
+		name = "savanna_shore",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = -1,
+		y_max = 0,
+		heat_point = 50,
+		humidity_point = 46,  --was 42
+	})
+
+	minetest.register_biome({
+		name = "savanna_ocean",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:coarse_dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:dirt",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = -2,
+		heat_point = 50,
+		humidity_point = 46,  --was 42
+	})
+
+	-- Rainforest
+	minetest.register_biome({
+		name = "rainforest",
+		node_top = "mcl_core:podzol",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = 1,
+		y_max = upper_limit,
+		heat_point = 90,
+		humidity_point = 91,
+	})
+
+	minetest.register_biome({
+		name = "rainforest_swamp",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = -1,
+		y_max = 0,
+		heat_point = 90,
+		humidity_point = 91,
+	})
+
+	minetest.register_biome({
+		name = "rainforest_ocean",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:dirt",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = -2,
+		heat_point = 90,
+		humidity_point =  91,
+	})
+
+	-- Mushroom biomes
+	minetest.register_biome({
+		name = "mushroom",
+		node_top = "mcl_core:mycelium",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:sand",
+		depth_riverbed = 2,
+		y_min = 1,
+		y_max = 20,
+		heat_point = 99,
+		humidity_point = 99,
+	})
+
+	minetest.register_biome({
+		name = "mushroom_ocean",
+		node_top = "mcl_core:dirt",
+		depth_top = 1,
+		node_filler = "mcl_core:dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:dirt",
+		depth_riverbed = 2,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = 0,
+		heat_point = 99,
+		humidity_point = 99,
+	})
+
+
+	--cold
+	minetest.register_biome({
+		name = "mushroom_cold",
+		node_dust = "mcl_core:snow",
+		node_top = "mcl_core:mycelium_snow",
+		depth_top = 1,
+		node_filler = "mcl_core:coarse_dirt",
+		depth_filler = 3,
+		node_riverbed = "mcl_core:stone",
+		depth_riverbed = 2,
+		y_min = 56,
+		y_max = upper_limit,
+		heat_point = -13,
+		humidity_point = 30,
+	})
+
+
+
+	-- Underground in Overworld
 	minetest.register_biome({
 		name = "underground",
-		y_min = -31000,
-		y_max = -113,
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = mcl_util.layer_to_y(61),
 		heat_point = 50,
 		humidity_point = 50,
 	})
 end
 
+-- Register biomes of non-Overworld biomes
+local function register_dimension_biomes()
+	--[[ REALMS ]]
+
+	--[[ THE NETHER ]]
+	minetest.register_biome({
+		name = "nether",
+		node_filler = "mcl_nether:netherrack",
+		node_stone = "mcl_nether:netherrack",
+		node_water = "air",
+		node_river_water = "air",
+		y_min = mcl_vars.mg_nether_min,
+		-- FIXME: For some reason the Nether stops generating early if this constant is not added.
+		-- Figure out why.
+		y_max = mcl_vars.mg_nether_max + 80,
+		heat_point = 100,
+		humidity_point = 0,
+	})
+
+	--[[ THE END ]]
+	minetest.register_biome({
+		name = "end",
+		node_stone = "air",
+		node_filler = "air",
+		node_water = "air",
+		node_river_water = "air",
+		y_min = mcl_vars.mg_end_min,
+		y_max = mcl_vars.mg_end_max,
+		heat_point = 50,
+		humidity_point = 50,
+	})
+
+end
+
+-- Register “fake” ores directly related to the biomes
+local function register_biomelike_ores()
+
+	-- Fake moss stone boulder
+	-- TODO: Remove when real boulders are added
+	minetest.register_ore({
+		ore_type       = "blob",
+		ore            = "mcl_core:mossycobble",
+		wherein        = "mcl_core:podzol",
+		biomes         = {"taiga"},
+		clust_scarcity  = 16 * 16 * 16,
+		clust_size      = 3,
+		y_min           = 25,
+		y_max           = mcl_vars.mg_overworld_max,
+		noise_threshold = 0.0,
+		noise_params    = {
+			offset = 0.5,
+			scale = 0.2,
+			spread = {x = 3, y = 3, z = 3},
+			seed = 17676,
+			octaves = 1,
+			persist = 0.0
+		},
+	})
+
+	--mcl_core STRATA
+	minetest.register_ore({
+		ore_type       = "blob",
+		ore            = "mcl_core:stone",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_scarcity = 1,
+		clust_num_ores = 3,
+		clust_size     = 4,
+		y_min     = 50,
+		y_max     = 90,
+		noise_threshold = 0.4,
+		noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}
+	})
+
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_core:clay",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_scarcity = 1,
+		clust_num_ores = 12,
+		clust_size     = 8,
+		y_min     = 24,
+		y_max     = 50,
+		noise_threshold = 0.4,
+		noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}
+	})
+
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_core:sandstone",
+		wherein        ={"mcl_colorblocks:hardened_clay_orange"},
+		clust_scarcity = 1,
+		clust_num_ores = 12,
+		clust_size     = 10,
+		y_min     = 10,
+		y_max     = 30,
+		noise_threshold = 0.2,
+		noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}
+	})
+
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_core:dirt",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_scarcity = 1,
+		clust_num_ores = 12,
+		clust_size     = 4,
+		y_min     = -12,
+		y_max     = 7,
+		noise_threshold = 0.4,
+		noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}
+	})
+
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_core:redsand",
+		wherein        = { "mcl_colorblocks:hardened_clay_orange"},
+		clust_scarcity = 1,
+		clust_num_ores = 12,
+		clust_size     = 10,
+		y_min     = 44,
+		y_max     = 70,
+		noise_threshold = 0.7,
+		noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}
+	})
+
+
+	-- MESA STRATA
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_core:redsand",
+		wherein        = {"mcl_core:redsandstone", "mcl_colorblocks:hardened_clay_orange"},
+		clust_scarcity = 1,
+		clust_num_ores = 8,
+		clust_size     = 4,
+		y_min     = 4,
+		y_max     = 70,
+		noise_threshold = 0.4,
+		noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}
+	})
+
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_white",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 1,
+		y_min     = 5,
+		y_max     = 14,
+		noise_threshold = 0.0,
+		noise_params =     {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_black",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 1,
+		y_min     = 15,
+		y_max     = 17,
+		noise_threshold = 0.0,
+		noise_params =     {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70},
+	})
+
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_brown",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 6,
+		y_min     = 20,
+		y_max     = 29,
+		noise_threshold = 0.0,
+		noise_params =     {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_red",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 2,
+		y_min     = 34,
+		y_max     = 37,
+		noise_threshold = 0.0,
+		noise_params =     {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_yellow",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 1,
+		y_min     = 42,
+		y_max     = 43,
+		noise_threshold = 0.0,
+		noise_params =     {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_blue",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 1,
+		y_min = 43,
+		y_max = 44,
+		noise_threshold = 0.0,
+		noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_yellow",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 1,
+		y_min = 44,
+		y_max = 45,
+		noise_threshold = 0.0,
+		noise_params =     {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_yellow",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 1,
+		y_min     = 45,
+		y_max     = 47,
+		noise_threshold = 0.0,
+		noise_params =     {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_light_blue",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 1,
+		y_min     = 49,
+		y_max     = 52,
+		noise_threshold = 0.0,
+		noise_params =     {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_yellow",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size = 4,
+		y_min = 53,
+		y_max = 59,
+		noise_threshold = 0.0,
+		noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_white",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 8,
+		y_min = 61,
+		y_max = 70,
+		noise_threshold = 0.0,
+		noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+	minetest.register_ore({
+		ore_type       = "sheet",
+		ore            = "mcl_colorblocks:hardened_clay_purple",
+		wherein        = {"mcl_colorblocks:hardened_clay_orange"},
+		clust_size     = 8,
+		y_min     = 66,
+		y_max     = 75,
+		noise_threshold = 0.0,
+		noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} ,
+	})
+end
+
+-- Non-Overworld ores
+local function register_dimension_ores()
+
+	--[[ NETHER GENERATION ]]
+
+	-- Soul sand
+	minetest.register_ore({
+		ore_type        = "sheet",
+		ore             = "mcl_nether:soul_sand",
+		-- Note: Stone is included only for v6 mapgen support. Netherrack is not generated naturally
+		-- in v6, but instead set with the on_generated function in mcl_mapgen_core.
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity  = 13 * 13 * 13,
+		clust_size      = 5,
+		y_min           = mcl_vars.mg_nether_min,
+		y_max           = mcl_util.layer_to_y(64, "nether"),
+		noise_threshold = 0.0,
+		noise_params    = {
+			offset = 0.5,
+			scale = 0.1,
+			spread = {x = 5, y = 5, z = 5},
+			seed = 2316,
+			octaves = 1,
+			persist = 0.0
+		},
+	})
+
+	-- Magma blocks
+	minetest.register_ore({
+		ore_type       = "blob",
+		ore            = "mcl_nether:magma",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity = 8*8*8,
+		clust_num_ores = 45,
+		clust_size     = 6,
+		y_min          = mcl_util.layer_to_y(23, "nether"),
+		y_max          = mcl_util.layer_to_y(37, "nether"),
+	})
+	minetest.register_ore({
+		ore_type       = "blob",
+		ore            = "mcl_nether:magma",
+		wherein        = {"mcl_nether:netherrack"},
+		clust_scarcity = 10*10*10,
+		clust_num_ores = 65,
+		clust_size     = 8,
+		y_min          = mcl_util.layer_to_y(23, "nether"),
+		y_max          = mcl_util.layer_to_y(37, "nether"),
+	})
+
+	-- Glowstone
+	minetest.register_ore({
+		ore_type        = "blob",
+		ore             = "mcl_nether:glowstone",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity  = 26 * 26 * 26,
+		clust_size      = 5,
+		y_min           = mcl_vars.mg_lava_nether_max + 10,
+		y_max           = mcl_vars.mg_nether_max,
+		noise_threshold = 0.0,
+		noise_params    = {
+			offset = 0.5,
+			scale = 0.1,
+			spread = {x = 5, y = 5, z = 5},
+			seed = 17676,
+			octaves = 1,
+			persist = 0.0
+		},
+	})
+
+	-- Gravel (Nether)
+	minetest.register_ore({
+		ore_type        = "sheet",
+		ore             = "mcl_core:gravel",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		column_height_min = 1,
+		column_height_max = 1,
+		y_min           = mcl_util.layer_to_y(63, "nether"),
+		y_max           = mcl_util.layer_to_y(65, "nether"),
+		noise_threshold = 0.0,
+		noise_params    = {
+			offset = 0.0,
+			scale = 0.2,
+			spread = {x = 50, y = 50, z = 50},
+			seed = 766,
+			octaves = 1,
+			persist = 0.6,
+		},
+	})
+
+	-- Nether quartz
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "mcl_nether:quartz_ore",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity = 850,
+		clust_num_ores = 4, -- MC cluster amount: 4-10
+		clust_size     = 3,
+		y_min = mcl_vars.mg_nether_min,
+		y_max = mcl_vars.mg_nether_max,
+	})
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "mcl_nether:quartz_ore",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity = 1650,
+		clust_num_ores = 8, -- MC cluster amount: 4-10
+		clust_size     = 4,
+		y_min = mcl_vars.mg_nether_min,
+		y_max = mcl_vars.mg_nether_max,
+	})
+
+	-- Lava springs in the Nether
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "mcl_nether:nether_lava_source",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity = 500,
+		clust_num_ores = 1,
+		clust_size     = 1,
+		y_min           = mcl_vars.mg_nether_min,
+		y_max           = mcl_vars.mg_lava_nether_max + 1,
+	})
+
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "mcl_nether:nether_lava_source",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity = 1000,
+		clust_num_ores = 1,
+		clust_size     = 1,
+		y_min           = mcl_vars.mg_lava_nether_max + 2,
+		y_max           = mcl_vars.mg_lava_nether_max + 12,
+	})
+
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "mcl_nether:nether_lava_source",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity = 2000,
+		clust_num_ores = 1,
+		clust_size     = 1,
+		y_min           = mcl_vars.mg_lava_nether_max + 13,
+		y_max           = mcl_vars.mg_lava_nether_max + 48,
+	})
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "mcl_nether:nether_lava_source",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity = 3500,
+		clust_num_ores = 1,
+		clust_size     = 1,
+		y_min           = mcl_vars.mg_lava_nether_max + 49,
+		y_max           = mcl_vars.mg_nether_max,
+	})
+
+	-- Fire in the Nether (hacky)
+	-- FIXME: Remove this when fire as decoration is available
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "mcl_fire:eternal_fire",
+		wherein         = {"mcl_nether:netherrack", "mcl_core:stone"},
+		clust_scarcity =12 *22 * 12,
+		clust_num_ores = 5,
+		clust_size     = 5,
+		y_min           = mcl_vars.mg_nether_min,
+		y_max           = mcl_vars.mg_nether_max,
+	})
+
+	--[[ THE END ]]
+
+	-- Generate fake End
+	-- TODO: Remove both "ores" when there's a better End generator
+
+	minetest.register_ore({
+		ore_type        = "sheet",
+		ore             = "mcl_end:end_stone",
+		wherein         = {"air"},
+		y_min           = mcl_vars.mg_end_min+64,
+		y_max           = mcl_vars.mg_end_min+94,
+		column_height_min = 6,
+		column_height_max = 7,
+		column_midpoint_factor = 0.0,
+		noise_params = {
+			offset  = -2,
+			scale   = 8,
+			spread  = {x=100, y=100, z=100},
+			seed    = 2999,
+			octaves = 5,
+			persist = 0.55,
+		},
+		noise_threshold = 0,
+	})
+
+	minetest.register_ore({
+		ore_type        = "sheet",
+		ore             = "mcl_end:end_stone",
+		wherein         = {"air"},
+		y_min           = mcl_vars.mg_end_min+64,
+		y_max           = mcl_vars.mg_end_min+94,
+		column_height_min = 4,
+		column_height_max = 4,
+		column_midpoint_factor = 0.0,
+		noise_params = {
+			offset  = -4,
+			scale   = 3,
+			spread  = {x=200, y=200, z=200},
+			seed    = 5390,
+			octaves = 5,
+			persist = 0.6,
+		},
+		noise_threshold = 0,
+	})
+
+end
+
 
 -- All mapgens except mgv6
 
 local function register_grass_decoration(offset, scale)
+	local noise_grass = {
+		offset = offset,
+		scale = scale,
+		spread = {x = 200, y = 200, z = 200},
+		seed = 329,
+		octaves = 3,
+		persist = 0.6
+	}
 	minetest.register_decoration({
 		deco_type = "simple",
-		place_on = {"mcl_core:dirt_with_grass"},
+		place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"},
 		sidelen = 16,
-		noise_params = {
-			offset = offset,
-			scale = scale,
-			spread = {x = 200, y = 200, z = 200},
-			seed = 329,
-			octaves = 3,
-			persist = 0.6
-		},
-		biomes = {"plains"},
+		noise_params = noise_grass,
+		biomes = {"grassland", "coniferous_forest", "deciduous_forest", "savanna"},
 		y_min = 1,
-		y_max = 31000,
+		y_max = mcl_vars.mg_overworld_max,
 		decoration = "mcl_flowers:tallgrass",
 	})
+
+	local noise_fern = table.copy(noise_grass)
+	noise_fern.seed = 923
+
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow", "mcl_core:podzol", "mcl_core:podzol_snow"},
+		sidelen = 16,
+		noise_params = noise_fern,
+		biomes = { "rainforest", "taiga", "cold_taiga", "mega_taiga" },
+		y_min = 1,
+		y_max = mcl_vars.mg_overworld_max,
+		decoration = "mcl_flowers:fern",
+	})
 end
 
-local function register_decorations()
-
-	-- Cactus
+-- Decorations which can be used by all mapgens, including v6, but not flat
+local function register_shared_decorations()
 
+	-- Doubletall grass
 	minetest.register_decoration({
-		deco_type = "simple",
-		place_on = {"mcl_core:sand", "mcl_core:redsand"},
+		deco_type = "schematic",
+		schematic = {
+			size = { x=1, y=3, z=1 },
+			data = {
+				{ name = "air", prob = 0 },
+				{ name = "mcl_flowers:double_grass", param1=255, },
+				{ name = "mcl_flowers:double_grass_top", param1=255, },
+			},
+		},
+		replacements = {
+			["mcl_flowers:tallgrass"] = "mcl_flowers:double_grass"
+		},
+		place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"},
 		sidelen = 16,
 		noise_params = {
-			offset = -0.0003,
-			scale = 0.0009,
-			spread = {x = 200, y = 200, z = 200},
-			seed = 230,
+			offset = -0.01,
+			scale = 0.03,
+			spread = {x = 300, y = 300, z = 300},
+			seed = 420,
+			octaves = 2,
+			persist = 0.6,
+		},
+		y_min = 1,
+		y_max = mcl_vars.mg_overworld_max,
+		biomes = {"grassland", "coniferous_forest", "deciduous_forest", "savanna"},
+	})
+
+	-- v6 hack: This makes sure large ferns only appear in jungles
+	local spawn_by, num_spawn_by
+	if mg_name == "v6" then
+		spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }
+		num_spawn_by = 1
+	end
+	-- Large ferns
+	minetest.register_decoration({
+		deco_type = "schematic",
+		schematic = {
+			size = { x=1, y=3, z=1 },
+			data = {
+				{ name = "air", prob = 0 },
+				{ name = "mcl_flowers:double_fern", param1=255, },
+				{ name = "mcl_flowers:double_fern_top", param1=255, },
+			},
+		},
+		replacements = {
+			["mcl_flowers:fern"] = "mcl_flowers:double_fern"
+		},
+		spawn_by = spawn_by,
+		num_spawn_by = num_spawn_by,
+		place_on = {"mcl_core:podzol", "mcl_core:podzol_snow"},
+
+		sidelen = 16,
+		noise_params = {
+			offset = 0,
+			scale = 0.01,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 333,
+			octaves = 2,
+			persist = 0.66,
+		},
+		biomes = { "rainforest", "taiga", "cold_taiga", "mega_taiga" },
+		y_min = 1,
+		y_max = mcl_vars.mg_overworld_max,
+	})
+
+	-- Cacti
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"group:sand"},
+		sidelen = 16,
+		noise_params = {
+			offset = -0.012,
+			scale = 0.024,
+			spread = {x = 100, y = 100, z = 100},
+			seed = 257,
 			octaves = 3,
 			persist = 0.6
 		},
-		biomes = {"desert"},
-		y_min = 5,
-		y_max = 31000,
+		y_min = 4,
+		y_max = mcl_vars.mg_overworld_max,
 		decoration = "mcl_core:cactus",
+		biomes = {"desert","sandstone_desert","grassland_dunes", "coniferous_forest_dunes"},
 		height = 1,
 		height_max = 3,
 	})
 
-	-- Papyrus
-
+	-- Sugar canes
 	minetest.register_decoration({
 		deco_type = "schematic",
-		place_on = {"mcl_core:dirt", "mcl_core:dirt_with_grass"},
+		place_on = {"mcl_core:dirt", "mcl_core:dirt_with_grass", "group:sand", "mcl_core:podzol"},
 		sidelen = 16,
 		noise_params = {
 			offset = -0.3,
 			scale = 0.7,
-			spread = {x = 200, y = 200, z = 200},
-			seed = 354,
+			spread = {x = 100, y = 100, z = 100},
+			seed = 2,
 			octaves = 3,
 			persist = 0.7
 		},
-		biomes = {"plains", "beach", "desert"},
-		y_min = 0,
-		y_max = 0,
+		biomes = {"grassland", "beach", "desert", "sandstone_desert", "swamp"},
+		y_min = 1,
+		y_max = 1,
 		decoration = "mcl_core:reeds",
 		height = 1,
 		height_max = 3,
+		spawn_by = { "mcl_core:water_source", "group:frosted_ice" },
+		num_spawn_by = 1,
+	})
+
+	-- Pumpkin
+	minetest.register_decoration({
+		deco_type = "schematic",
+		schematic = {
+			size = { x=1, y=2, z=1 },
+			data = {
+				{ name = "air", prob = 0 },
+				{ name = "mcl_farming:pumpkin_face", param1=255, },
+			},
+		},
+		place_on = {"mcl_core:dirt_with_grass"},
+		sidelen = 16,
+		noise_params = {
+			offset = -0.008,
+			scale = 0.00666,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 666,
+			octaves = 6,
+			persist = 0.666
+		},
+		biomes = {"grassland"},
+		y_min = 3,
+		y_max = 29,
+		rotation = "random",
+	})
+
+	local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"}
+	local mseeds = { 7133, 8244 }
+	for m=1, #mushrooms do
+		-- Mushrooms next to trees
+		minetest.register_decoration({
+			deco_type = "simple",
+			place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"},
+			sidelen = 16,
+			noise_params = {
+				offset = 0,
+				scale = 0.04,
+				spread = {x = 100, y = 100, z = 100},
+				seed = mseeds[m],
+				octaves = 3,
+				persist = 0.6
+			},
+			y_min = 1,
+			y_max = mcl_vars.mg_overworld_max,
+			decoration = mushrooms[m],
+			spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree", "mcl_core:jungletree", "mcl_core:acaciatree" },
+			num_spawn_by = 1,
+		})
+	end
+
+end
+
+local function register_decorations()
+
+	-- Oak tree and log
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass"},
+		sidelen = 16,
+		noise_params = {
+			offset = 0.0036,
+			scale = 0.0022,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 2,
+			octaves = 3,
+			persist = 0.66
+		},
+		biomes = {"deciduous_forest"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = minetest.get_modpath("mcl_core").."/schematics/apple_tree.mts",
+		flags = "place_center_x, place_center_z",
+	})
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass"},
+		sidelen = 16,
+		noise_params = {
+			offset = 0.00018,
+			scale = 0.00011,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 2,
+			octaves = 3,
+			persist = 0.66
+		},
+		biomes = {"deciduous_forest"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = {
+			size = {x = 3, y = 3, z = 1},
+			data = {
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "mcl_core:tree", param2 = 12, prob = 191},
+				{name = "mcl_core:tree", param2 = 12},
+				{name = "mcl_core:tree", param2 = 12, prob = 127},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+			},
+		},
+		flags = "place_center_x",
+		rotation = "random",
+	})
+
+	-- Jungle tree and log
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol"},
+		sidelen = 80,
+		fill_ratio = 0.09,
+		biomes = {"rainforest", "rainforest_swamp"},
+		y_min = 0,
+		y_max = 31000,
+		schematic = minetest.get_modpath("mcl_core").."/schematics/jungle_tree.mts",
+		flags = "place_center_x, place_center_z",
+		rotation = "random",
+	})
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol"},
+		sidelen = 80,
+		fill_ratio = 0.01,
+		biomes = {"rainforest", "rainforest_swamp"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = {
+			size = {x = 3, y = 3, z = 1},
+			data = {
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "mcl_core:jungletree", param2 = 12, prob = 191},
+				{name = "mcl_core:jungletree", param2 = 12},
+				{name = "mcl_core:jungletree", param2 = 12, prob = 127},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+			},
+		},
+		flags = "place_center_x",
+		rotation = "random",
+	})
+
+	-- Taiga and temperate coniferous forest pine tree and log
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass_snow", "mcl_core:dirt_with_grass", "mcl_core:podzol"},
+		sidelen = 16,
+		noise_params = {
+			offset = 0.0096,
+			scale = 0.0022,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 2,
+			octaves = 3,
+			persist = 0.66
+		},
+		biomes = {"taiga", "coniferous_forest","coniferous_forest_dunes"},
+		y_min = 2,
+		y_max = 31000,
+		schematic = minetest.get_modpath("mcl_core").."/schematics/pine_tree.mts",
+		flags = "place_center_x, place_center_z",
+	})
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass_snow", "mcl_core:dirt_with_grass", "mcl_core:podzol"},
+		sidelen = 80,
+		noise_params = {
+			offset = 0.00018,
+			scale = 0.00011,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 2,
+			octaves = 3,
+			persist = 0.66
+		},
+		biomes = {"taiga", "coniferous_forest","coniferous_forest_dunes"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = {
+			size = {x = 3, y = 3, z = 1},
+			data = {
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "mcl_core:sprucetree", param2 = 12, prob = 191},
+				{name = "mcl_core:sprucetree", param2 = 12},
+				{name = "mcl_core:sprucetree", param2 = 12, prob = 127},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+			},
+		},
+		flags = "place_center_x",
+		rotation = "random",
+	})
+
+	-- Acacia tree and log
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass", "mcl_core:coarse_dirt"},
+		sidelen = 16,
+		noise_params = {
+			offset = 0,
+			scale = 0.002,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 2,
+			octaves = 3,
+			persist = 0.66
+		},
+		biomes = {"savanna"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = minetest.get_modpath("mcl_core").."/schematics/acacia_tree.mts",
+		flags = "place_center_x, place_center_z",
+		rotation = "random",
+	})
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass"},
+		sidelen = 16,
+		noise_params = {
+			offset = 0,
+			scale = 0.001,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 2,
+			octaves = 3,
+			persist = 0.66
+		},
+		biomes = {"savanna"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = {
+			size = {x = 3, y = 2, z = 1},
+			data = {
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "mcl_core:acaciatree", param2 = 12, prob = 191},
+				{name = "mcl_core:acaciatree", param2 = 12},
+				{name = "mcl_core:acaciatree", param2 = 12, prob = 127},
+			},
+		},
+		flags = "place_center_x",
+		rotation = "random",
+	})
+
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:sand"},
+		sidelen = 16,
+		noise_params = {
+			offset = 0,
+			scale = 0.0002,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 2,
+			octaves = 3,
+			persist = 0.66
+		},
+		biomes = {"savanna"},
+		y_min = 7,
+		y_max = 31000,
+		schematic = minetest.get_modpath("mcl_core").."/schematics/acacia_tree.mts",
+		flags = "place_center_x, place_center_z",
+		rotation = "random",
+	})
+
+
+	-- Aspen tree and log
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass"},
+		sidelen = 16,
+		noise_params = {
+			offset = 0.0,
+			scale = -0.0015,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 2,
+			octaves = 3,
+			persist = 0.66
+		},
+		biomes = {"deciduous_forest"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = minetest.get_modpath("mcl_core").."/schematics/aspen_tree.mts",
+		flags = "place_center_x, place_center_z",
+	})
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:dirt_with_grass"},
+		sidelen = 16,
+		noise_params = {
+			offset = 0.0,
+			scale = -0.00008,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 2,
+			octaves = 3,
+			persist = 0.66
+		},
+		biomes = {"deciduous_forest"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = {
+			size = {x = 3, y = 3, z = 1},
+			data = {
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "mcl_core:birchtree", param2 = 12},
+				{name = "mcl_core:birchtree", param2 = 12},
+				{name = "mcl_core:birchtree", param2 = 12, prob = 127},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+				{name = "air", prob = 0},
+			},
+		},
+		flags = "place_center_x",
+		rotation = "random",
+	})
+
+
+	--Big dark oak  W.I.P.
+
+	--TODO  MAKE SCHEMATICS
+
+
+	--Huge Brown Mushroom
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"mcl_core:mycelium", "mcl_core:mycelium_snow"},
+		sidelen = 80,
+		fill_ratio = 0.002,
+		biomes = {"mushroom", "mushroom_cold"},
+		y_min = -6000,
+		y_max = 31000,
+		schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts",
+		flags = "place_center_x",
+		rotation = "random",
+	})
+
+	--Huge Red Mushroom
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = { "mcl_core:dirt_with_grass"},
+		sidelen = 50,
+		fill_ratio = 0.0002,
+		biomes = { "deciduous_forest"},
+		y_min = -6000,
+		y_max = 31000,
+		schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_red.mts",
+		flags = "place_center_x",
+		rotation = "random",
+	})
+
+	-- Large flowers
+	local register_large_flower = function(name, biomes, seed, offset)
+		minetest.register_decoration({
+			deco_type = "schematic",
+			schematic = {
+				size = { x=1, y=3, z=1 },
+				data = {
+					{ name = "air", prob = 0 },
+					{ name = "mcl_flowers:"..name, param1=255, },
+					{ name = "mcl_flowers:"..name.."_top", param1=255, },
+				},
+			},
+			place_on = {"mcl_core:dirt_with_grass"},
+
+			sidelen = 16,
+			noise_params = {
+				offset = offset,
+				scale = 0.01,
+				spread = {x = 300, y = 300, z = 300},
+				seed = seed,
+				octaves = 5,
+				persist = 0.62,
+			},
+			y_min = 1,
+			y_max = mcl_vars.mg_overworld_max,
+			flags = "",
+			biomes = biomes,
+		})
+	end
+
+	register_large_flower("rose_bush", {"deciduous_forest", "coniferous_forest", "flower_forest"}, 9350, -0.008)
+	register_large_flower("peony", {"deciduous_forest", "coniferous_forest", "flower_forest"}, 10450, -0.008)
+	register_large_flower("lilac", {"deciduous_forest", "coniferous_forest", "flower_forest"}, 10600, -0.007)
+	-- TODO: Make exclusive to sunflower plains
+	register_large_flower("sunflower", {"grassland", "sunflower_plains"}, 2940, -0.005)
+
+	-- Melon
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"mcl_core:dirt_with_grass", "mcl_core:podzol"},
+		sidelen = 16,
+		noise_params = {
+			offset = 0.003,
+			scale = 0.006,
+			spread = {x = 250, y = 250, z = 250},
+			seed = 333,
+			octaves = 3,
+			persist = 0.6
+		},
+		y_min = 1,
+		y_max = mcl_vars.mg_overworld_max,
+		decoration = "mcl_farming:melon",
+		biomes = { "rainforest" },
+	})
+
+	-- Simple 1×1×1 moss stone
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"mcl_core:podzol"},
+		sidelen = 80,
+		fill_ratio = 0.004,
+		biomes = {"taiga"},
+		y_min = 10,
+		y_max = 31000,
+		decoration = "mcl_core:mossycobble",
 	})
 
 	-- Grasses
-
 	register_grass_decoration(-0.03,  0.09)
 	register_grass_decoration(-0.015, 0.075)
 	register_grass_decoration(0,      0.06)
@@ -218,39 +1616,155 @@ local function register_decorations()
 	register_grass_decoration(0.07, -0.01)
 	register_grass_decoration(0.09, -0.03)
 
-	-- Dead bushes
-
+	--Red Mushroom
 	minetest.register_decoration({
 		deco_type = "simple",
-		place_on = {"mcl_core:sand", "mcl_core:redsand"},
+		place_on = {"mcl_core:mycelium"},
+		sidelen = 80,
+		fill_ratio = 0.003,
+		biomes = {"mushroom"},
+		y_min = -6000,
+		y_max = 31000,
+		decoration = "mcl_mushrooms:mushroom_red",
+	})
+
+	--Brown Mushroom
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"mcl_core:mycelium"},
+		sidelen = 80,
+		fill_ratio = 0.003,
+		biomes = {"mushroom"},
+		y_min = mcl_vars.mg_overworld_min,
+		y_max = mcl_vars.mg_overworld_max,
+		decoration = "mcl_mushrooms:mushroom_brown",
+	})
+
+	-- Dead bushes
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"group:sand", "mcl_core:podzol", "mcl_core:podzol_snow", "mcl_core:dirt", "mcl_core:coarse_dirt", "group:hardened_clay"},
 		sidelen = 16,
 		noise_params = {
 			offset = 0,
-			scale = 0.02,
-			spread = {x = 200, y = 200, z = 200},
-			seed = 329,
+			scale = 0.035,
+			spread = {x = 100, y = 100, z = 100},
+			seed = 1972,
 			octaves = 3,
 			persist = 0.6
 		},
-		biomes = {"desert"},
-		y_min = 2,
-		y_max = 31000,
+		y_min = 4,
+		y_max = mcl_vars.mg_overworld_max,
+		-- TODO: Remove cold desert
+		biomes = {"desert", "sandstone_desert", "mesa", "taiga", "mega_taiga", "cold_desert"},
 		decoration = "mcl_core:deadbush",
 		height = 1,
 	})
 
+	local function register_flower(name, biomes, seed)
+		minetest.register_decoration({
+			deco_type = "simple",
+			place_on = {"mcl_core:dirt_with_grass", "mcl_core:podzol"},
+			sidelen = 16,
+			noise_params = {
+				offset = 0.0,
+				scale = 0.006,
+				spread = {x = 100, y = 100, z = 100},
+				seed = seed,
+				octaves = 3,
+				persist = 0.6
+			},
+			y_min = 1,
+			y_max = mcl_vars.mg_overworld_max,
+			biomes = biomes,
+			decoration = "mcl_flowers:"..name,
+		})
+	end
+
+	local flower_biomes1 = {"grassland", "sunflower_plains", "flower_forest", "deciduous_forest", "coniferous_forest", "taiga"}
+
+	register_flower("dandelion", flower_biomes1, 8)
+	register_flower("poppy", flower_biomes1, 9439)
+
+	local flower_biomes2 = {"grassland", "sunflower_plains", "flower_forest"}
+	register_flower("tulip_red", flower_biomes2, 436)
+	register_flower("tulip_orange", flower_biomes2, 536)
+	register_flower("tulip_pink", flower_biomes2, 636)
+	register_flower("tulip_white", flower_biomes2, 736)
+	register_flower("azure_bluet", flower_biomes2, 800)
+	register_flower("oxeye_daisy", flower_biomes2, 3490)
+
+	-- TODO: Make exclusive to flower forest
+	register_flower("allium", {"deciduous_forest", "flower_forest"}, 0)
+	-- TODO: Make exclusive to swamp
+	register_flower("blue_orchid", {"coniferous_forest", "swamp"}, 64500)
+
+
 end
 
+-- Decorations in non-Overworld dimensions
+local function register_dimension_decorations()
+	--[[ NETHER decorations ]]
+
+	-- Red Mushroom
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"mcl_nether:netherrack"},
+		sidelen = 80,
+		fill_ratio = 0.01,
+		biomes = {"nether"},
+		y_min = mcl_vars.mg_nether_min,
+		y_max = mcl_vars.mg_nether_max,
+		decoration = "mcl_mushrooms:mushroom_red",
+	})
+	-- Brown Mushroom
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"mcl_nether:netherrack"},
+		sidelen = 80,
+		fill_ratio = 0.01,
+		biomes = {"nether"},
+		y_min = mcl_vars.mg_nether_min,
+		y_max = mcl_vars.mg_nether_max,
+		decoration = "mcl_mushrooms:mushroom_brown",
+	})
+
+	-- Eternal Fire
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"mcl_nether:netherrack"},
+		sidelen = 16,
+		fill_ratio = 0.2,
+		biomes = {"nether"},
+		y_min = mcl_vars.mg_nether_min,
+		y_max = mcl_vars.mg_nether_max,
+		decoration = "mcl_fire:eternal_fire",
+	})
+	-- Nether Wart
+	minetest.register_decoration({
+		deco_type = "simple",
+		place_on = {"mcl_nether:soul_sand"},
+		sidelen = 80,
+		fill_ratio = 0.1,
+		biomes = {"nether"},
+		y_min = mcl_vars.mg_nether_min,
+		y_max = mcl_vars.mg_nether_max,
+		decoration = "mcl_nether:nether_wart",
+	})
+end
 
 --
 -- Detect mapgen to select functions
 --
-local mg_name = minetest.get_mapgen_setting("mg_name")
+minetest.clear_registered_biomes()
+minetest.clear_registered_decorations()
+minetest.clear_registered_schematics()
+if mg_name ~= "flat" then
+	register_shared_decorations()
+end
 if mg_name ~= "v6" and mg_name ~= "flat" then
-	minetest.clear_registered_biomes()
-	minetest.clear_registered_decorations()
-	minetest.clear_registered_schematics()
 	register_biomes()
+	register_biomelike_ores()
 	register_decorations()
 elseif mg_name == "flat" then
 	-- Implementation of Minecraft's Superflat mapgen, classic style
@@ -259,3 +1773,10 @@ elseif mg_name == "flat" then
 	minetest.clear_registered_schematics()
 	register_classic_superflat_biome()
 end
+
+-- Non-overworld stuff is registered independently
+register_dimension_biomes()
+register_dimension_ores()
+register_dimension_decorations()
+
+-- Overworld decorations for v6 are handled in mcl_mapgen_core
diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua
index 612dc32a5..2ef5654e2 100644
--- a/mods/MAPGEN/mcl_mapgen_core/init.lua
+++ b/mods/MAPGEN/mcl_mapgen_core/init.lua
@@ -594,120 +594,14 @@ minetest.register_ore({
 	clust_scarcity = monster_egg_scarcity,
 	clust_num_ores = 3,
 	clust_size     = 2,
-	y_min          = -31000,
-	y_max          = 31000,
+	y_min          = mcl_vars.mg_overworld_min,
+	y_max          = mcl_vars.mg_overworld_max,
 	-- TODO: Limit by biome
 })
 
 
 local function register_mgv6_decorations()
 
-	-- Sugar canes
-
-	minetest.register_decoration({
-		deco_type = "simple",
-		place_on = {"mcl_core:dirt_with_grass"},
-		sidelen = 16,
-		noise_params = {
-			offset = -0.3,
-			scale = 0.7,
-			spread = {x = 100, y = 100, z = 100},
-			seed = 2,
-			octaves = 3,
-			persist = 0.7
-		},
-		y_min = 1,
-		y_max = 1,
-		decoration = "mcl_core:reeds",
-		height = 2,
-		height_max = 4,
-		spawn_by = "mcl_core:water_source",
-		num_spawn_by = 1,
-	})
-
-	-- Cacti
-
-	minetest.register_decoration({
-		deco_type = "simple",
-		place_on = {"group:sand"},
-		sidelen = 16,
-		noise_params = {
-			offset = -0.012,
-			scale = 0.024,
-			spread = {x = 100, y = 100, z = 100},
-			seed = 257,
-			octaves = 3,
-			persist = 0.6
-		},
-		y_min = 4,
-		y_max = 30,
-		decoration = "mcl_core:cactus",
-		height = 1,
-	        height_max = 3,
-	})
-
-	-- Doubletall grass
-	minetest.register_decoration({
-		deco_type = "schematic",
-		schematic = {
-			size = { x=1, y=3, z=1 },
-			data = {
-				{ name = "air", prob = 0 },
-				{ name = "mcl_flowers:double_grass", param1=255, },
-				{ name = "mcl_flowers:double_grass_top", param1=255, },
-			},
-		},
-		replacements = {
-			["mcl_flowers:tallgrass"] = "mcl_flowers:double_grass"
-		},
-		place_on = {"mcl_core:dirt_with_grass"},
-		sidelen = 8,
-		noise_params = {
-			offset = -0.01,
-			scale = 0.03,
-			spread = {x = 500, y = 500, z = 500},
-			seed = 420,
-			octaves = 2,
-			persist = 0.6,
-		},
-		y_min = 1,
-		y_max = 40,
-		flags = "",
-	})
-
-	-- Large ferns
-	minetest.register_decoration({
-		deco_type = "schematic",
-		schematic = {
-			size = { x=1, y=3, z=1 },
-			data = {
-				{ name = "air", prob = 0 },
-				{ name = "mcl_flowers:double_fern", param1=255, },
-				{ name = "mcl_flowers:double_fern_top", param1=255, },
-			},
-		},
-		replacements = {
-			["mcl_flowers:fern"] = "mcl_flowers:double_fern"
-		},
-		-- This makes sure large ferns only appear in jungles
-		spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" },
-		num_spawn_by = 1,
-		place_on = {"mcl_core:dirt_with_grass"},
-
-		sidelen = 16,
-		noise_params = {
-			offset = 0,
-			scale = 0.01,
-			spread = {x = 250, y = 250, z = 250},
-			seed = 333,
-			octaves = 2,
-			persist = 0.66,
-		},
-		y_min = 1,
-		y_max = 30,
-		flags = "",
-	})
-
 	-- Large flowers
 	local register_large_flower = function(name, seed, offset)
 		minetest.register_decoration({
@@ -771,35 +665,10 @@ local function register_mgv6_decorations()
 		decoration = "mcl_flowers:tallgrass",
 	})
 
-	local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"}
-	local mseeds = { 7133, 8244 }
-	for m=1, #mushrooms do
-		-- Mushrooms next to trees
-		minetest.register_decoration({
-			deco_type = "simple",
-			place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"},
-			sidelen = 16,
-			noise_params = {
-				offset = 0,
-				scale = 0.04,
-				spread = {x = 100, y = 100, z = 100},
-				seed = mseeds[m],
-				octaves = 3,
-				persist = 0.6
-			},
-			y_min = 1,
-			y_max = 128,
-			decoration = mushrooms[m],
-			spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree", "mcl_core:jungletree", "mcl_core:acaciatree" },
-			num_spawn_by = 1,
-		})
-	end
-
 	-- Dead bushes
-
 	minetest.register_decoration({
 		deco_type = "simple",
-		place_on = {"group:sand", "mcl_core:podzol", "mcl_core:coarse_dirt", "mcl_colorblocks:hardened_clay"},
+		place_on = {"group:sand", "mcl_core:podzol", "mcl_core:podzol_snow", "mcl_core:dirt", "mcl_core:coarse_dirt", "group:hardened_clay"},
 		sidelen = 16,
 		noise_params = {
 			offset = 0,
@@ -849,60 +718,12 @@ local function register_mgv6_decorations()
 	register_mgv6_flower("oxeye_daisy", 3490)
 	register_mgv6_flower("poppy", 9439)
 
-	-- Pumpkin
-	minetest.register_decoration({
-		deco_type = "schematic",
-		schematic = {
-			size = { x=1, y=2, z=1 },
-			data = {
-				{ name = "air", prob = 0 },
-				{ name = "mcl_farming:pumpkin_face", param1=255, },
-			},
-		},
-		place_on = {"mcl_core:dirt_with_grass"},
-		sidelen = 16,
-		noise_params = {
-			offset = -0.008,
-			scale = 0.00666,
-			spread = {x = 250, y = 250, z = 250},
-			seed = 666,
-			octaves = 6,
-			persist = 0.666
-		},
-		y_min = 3,
-		y_max = 29,
-		rotation = "random",
-	})
-
-	-- Melon
-	minetest.register_decoration({
-		deco_type = "simple",
-		place_on = {"mcl_core:dirt_with_grass"},
-		sidelen = 16,
-		noise_params = {
-			offset = 0.003,
-			scale = 0.006,
-			spread = {x = 250, y = 250, z = 250},
-			seed = 333,
-			octaves = 3,
-			persist = 0.6
-		},
-		-- Small trick to make sure melon spawn in jungles
-		spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" },
-		num_spawn_by = 1,
-		y_min = 1,
-		y_max = 40,
-		decoration = "mcl_farming:melon",
-	})
-
-
 end
 
 -- Apply mapgen-specific mapgen code
 if mg_name == "v6" then
 	register_mgv6_decorations()
-end
-if mg_name == "flat" then
+elseif mg_name == "flat" then
 	local classic = minetest.get_mapgen_setting("mcl_superflat_classic")
 	if classic == nil then
 		classic = minetest.settings:get_bool("mcl_superflat_classic")
@@ -953,7 +774,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
 					num_water_around = num_water_around + 1 end
 				if num_water_around >= 2 then
 					is_shallow = false
-				end	
+				end
 				if is_shallow then
 					for x1=-divlen,divlen do
 					for z1=-divlen,divlen do
@@ -994,7 +815,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
 						break
 					end
 				end
-				
+
 				if ground_y then
 					local p = {x=x,y=ground_y+1,z=z}
 					local nn = minetest.get_node(p).name
@@ -1041,7 +862,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
 						end
 					end
 				end
-				
+
 			end
 		end
 		end
@@ -1050,25 +871,178 @@ end)
 
 
 -- Generate bedrock layer or layers
-local BEDROCK_MIN = mcl_vars.mg_bedrock_overworld_min
-local BEDROCK_MAX = mcl_vars.mg_bedrock_overworld_max
-local GEN_MAX = mcl_vars.mg_lava_overworld_max or BEDROCK_MAX
+local GEN_MAX = mcl_vars.mg_lava_overworld_max or mcl_vars.mg_bedrock_overworld_max
 
 -- Buffer for LuaVoxelManip
 local lvm_buffer = {}
 
+
+-- Generate cocoas and vines at jungle trees within the bounding box
+local function generate_jungle_tree_decorations(minp, maxp)
+	if maxp.y < 0 then
+		return
+	end
+
+	local pos, treepos, dir
+	local jungletree = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungletree")
+	local jungleleaves = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungleleaves")
+
+	-- Pass 1: Generate cocoas
+	for n = 1, #jungletree do
+
+		pos = jungletree[n]
+		treepos = table.copy(pos)
+
+		if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then
+
+			dir = math.random(1, 40)
+
+			if dir == 1 then
+				pos.z = pos.z + 1
+			elseif dir == 2 then
+				pos.z = pos.z - 1
+			elseif dir == 3 then
+				pos.x = pos.x + 1
+			elseif dir == 4 then
+				pos.x = pos.x -1
+			end
+
+			local nn = minetest.get_node(pos).name
+
+			if dir < 5
+			and nn == "air"
+			and minetest.get_node_light(pos) > 12 then
+				minetest.swap_node(pos, {
+					name = "mcl_cocoas:cocoa_" .. tostring(math.random(1, 3)),
+					param2 = minetest.dir_to_facedir(vector.subtract(treepos, pos))
+				})
+			end
+
+		end
+	end
+
+	-- Pass 2: Generate vines at jungle wood and jungle leaves
+	perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500)
+	perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1)
+	perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75)
+	perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10)
+	perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500)
+	local junglething
+	for i=1, 2 do
+		if i==1 then junglething = jungletree
+		else junglething = jungleleaves end
+
+		for n = 1, #junglething do
+			pos = junglething[n]
+
+			treepos = table.copy(pos)
+
+			local dirs = {
+				{x=1,y=0,z=0},
+				{x=-1,y=0,z=0},
+				{x=0,y=0,z=1},
+				{x=0,y=0,z=-1},
+			}
+
+			for d = 1, #dirs do
+			local pos = vector.add(pos, dirs[d])
+
+			local nn = minetest.get_node(pos).name
+
+			if perlin_vines:get2d(pos) > 0.1 and perlin_vines_fine:get3d(pos) > math.max(0.3333, perlin_vines_density:get2d(pos)) and nn == "air" then
+
+				local newnode = {
+					name = "mcl_core:vine",
+					param2 = minetest.dir_to_wallmounted(vector.subtract(treepos, pos))
+				}
+
+				-- Determine growth direction
+				local grow_upwards = false
+				-- Only possible on the wood, not on the leaves
+				if i == 1 then
+					grow_upwards = perlin_vines_upwards:get3d(pos) > 0.8
+				end
+				if grow_upwards then
+					-- Grow vines up 1-4 nodes, even through jungleleaves.
+					-- This may give climbing access all the way to the top of the tree :-)
+					-- But this will be fairly rare.
+					local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 4)
+					for l=0, length-1 do
+						local tnn = minetest.get_node(treepos).name
+						local nn = minetest.get_node(pos).name
+						if (nn == "air" or nn == "mcl_core:jungleleaves") and mcl_core.supports_vines(tnn) then
+							minetest.set_node(pos, newnode)
+						else
+							break
+						end
+						pos.y = pos.y + 1
+						treepos.y = treepos.y + 1
+					end
+				else
+					-- Grow vines down 1-7 nodes
+					local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 7)
+					for l=0, length-1 do
+						if minetest.get_node(pos).name == "air" then
+							minetest.set_node(pos, newnode)
+						else
+							break
+						end
+						pos.y = pos.y - 1
+					end
+				end
+			end
+			end
+		end
+	end
+end
+
+-- Generate mushrooms in caves
+local generate_underground_mushrooms = function(minp, maxp)
+	-- Generate rare underground mushrooms
+	-- TODO: Make them appear in groups, use Perlin noise
+	if minp.y > 0 or maxp.y < -32 then
+		return
+	end
+
+	local bpos
+	local stone = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_core:stone", "mcl_core:dirt", "mcl_core:mycelium", "mcl_core:podzol", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:stone_with_iron", "mcl_core:stone_with_gold"})
+
+	for n = 1, #stone do
+		bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z }
+
+		if math.random(1,1000) < 4 and minetest.get_node_light(bpos, 0.5) <= 12 then
+			if math.random(1,2) == 1 then
+				minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"})
+			else
+				minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"})
+			end
+		end
+	end
+end
+
+
 -- Below the bedrock, generate air/void
 minetest.register_on_generated(function(minp, maxp)
 	local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
 	local data = vm:get_data(lvm_buffer)
 	local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax})
 	local lvm_used = false
+	local liquids_used = false
 
 	-- Generate bedrock and lava layers
 	if minp.y <= GEN_MAX then
 		local c_bedrock = minetest.get_content_id("mcl_core:bedrock")
+		local c_stone = minetest.get_content_id("mcl_core:stone")
+		local c_dirt = minetest.get_content_id("mcl_core:dirt")
+		local c_sand = minetest.get_content_id("mcl_core:sand")
 		local c_void = minetest.get_content_id("mcl_core:void")
 		local c_lava = minetest.get_content_id("mcl_core:lava_source")
+		local c_water = minetest.get_content_id("mcl_core:water_source")
+		local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand")
+		local c_netherrack = minetest.get_content_id("mcl_nether:netherrack")
+		local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source")
+		local c_end_stone = minetest.get_content_id("mcl_end:end_stone")
+		local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier")
 		local c_air = minetest.get_content_id("air")
 
 		local max_y = math.min(maxp.y, GEN_MAX)
@@ -1079,43 +1053,99 @@ minetest.register_on_generated(function(minp, maxp)
 					local p_pos = area:index(x, y, z)
 					local setdata = nil
 					if mcl_vars.mg_bedrock_is_rough then
-						-- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer
-						-- This code assumes a bedrock height of 5 layers.
-						if y == BEDROCK_MAX then
-							-- 50% bedrock chance
-							if math.random(1,2) == 1 then setdata = c_bedrock end
-						elseif y == BEDROCK_MAX -1 then
-							-- 66.666...%
-							if math.random(1,3) <= 2 then setdata = c_bedrock end
-						elseif y == BEDROCK_MAX -2 then
-							-- 75%
-							if math.random(1,4) <= 3 then setdata = c_bedrock end
-						elseif y == BEDROCK_MAX -3 then
-							-- 90%
-							if math.random(1,10) <= 9 then setdata = c_bedrock end
-						elseif y == BEDROCK_MAX -4 then
-							-- 100%
+						local is_bedrock = function(y)
+							-- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer
+							-- This code assumes a bedrock height of 5 layers.
+
+							local diff = mcl_vars.mg_bedrock_overworld_max - y -- Overworld bedrock
+							local ndiff1 = mcl_vars.mg_bedrock_nether_bottom_max - y -- Nether bedrock, bottom
+							local ndiff2 = mcl_vars.mg_bedrock_nether_top_max - y -- Nether bedrock, ceiling
+
+							local top
+							if diff == 0 or ndiff1 == 0 or ndiff2 == 4 then
+								-- 50% bedrock chance
+								top = 2
+							elseif diff == 1 or ndiff1 == 1 or ndiff2 == 3 then
+								-- 66.666...%
+								top = 3
+							elseif diff == 2 or ndiff1 == 2 or ndiff2 == 2 then
+								-- 75%
+								top = 4
+							elseif diff == 3 or ndiff1 == 3 or ndiff2 == 1 then
+								-- 90%
+								top = 10
+							elseif diff == 4 or ndiff1 == 4 or ndiff2 == 0 then
+								-- 100%
+								return true
+							else
+								-- Not in bedrock layer
+								return false
+							end
+
+							return math.random(1, top) <= top-1
+						end
+						if is_bedrock(y) then
 							setdata = c_bedrock
-						elseif y < BEDROCK_MIN then
-							setdata = c_void
 						end
 					else
 						-- Perfectly flat bedrock layer(s)
-						if y >= BEDROCK_MIN and y <= BEDROCK_MAX then
+						if (y >= mcl_vars.mg_bedrock_overworld_min and y <= mcl_vars.mg_bedrock_overworld_max) or
+								(y >= mcl_vars.mg_bedrock_nether_bottom_min and y <= mcl_vars.mg_bedrock_nether_bottom_max) or
+								(y >= mcl_vars.mg_bedrock_nether_top_min and y <= mcl_vars.mg_bedrock_nether_top_max) then
 							setdata = c_bedrock
-						elseif y < BEDROCK_MIN then
-							setdata = c_void
 						end
 					end
 
 					if setdata then
 						data[p_pos] = setdata
 						lvm_used = true
-					elseif mcl_vars.mg_lava and y <= mcl_vars.mg_lava_overworld_max then
-						if data[p_pos] == c_air then
-							data[p_pos] = c_lava
-						end
+					elseif mcl_util.is_in_void({x=x,y=y,z=z}) then
+						data[p_pos] = c_void
 						lvm_used = true
+					-- Big lava seas by replacing air below a certain height
+					elseif mcl_vars.mg_lava and data[p_pos] == c_air then
+						if y <= mcl_vars.mg_lava_overworld_max and y >= mcl_vars.mg_overworld_min then
+							data[p_pos] = c_lava
+							lvm_used = true
+							liquids_used = true
+						elseif y <= mcl_vars.mg_lava_nether_max and y >= mcl_vars.mg_nether_min then
+							data[p_pos] = c_nether_lava
+							lvm_used = true
+							liquids_used = true
+						end
+					-- Water in the Nether or End? No way!
+					elseif data[p_pos] == c_water then
+						if y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then
+							data[p_pos] = c_nether_lava
+							lvm_used = true
+							liquids_used = true
+						elseif y <= mcl_vars.mg_end_min + 104 and y >= mcl_vars.mg_end_min + 40 then
+							data[p_pos] = c_end_stone
+							lvm_used = true
+						elseif y <= mcl_vars.mg_end_max and y >= mcl_vars.mg_end_min then
+							data[p_pos] = c_air
+							lvm_used = true
+						end
+					-- Realm barrier between the Overworld void and the End
+					elseif y >= mcl_vars.mg_realm_barrier_overworld_end_min and y <= mcl_vars.mg_realm_barrier_overworld_end_max then
+						data[p_pos] = c_realm_barrier
+						lvm_used = true
+					-- Nether and End support for v6 because v6 does not support the biomes API
+					elseif mg_name == "v6" then
+						if y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then
+							if data[p_pos] == c_stone then
+								data[p_pos] = c_netherrack
+								lvm_used = true
+							elseif data[p_pos] == c_sand or data[p_pos] == c_dirt then
+								data[p_pos] = c_soul_sand
+								lvm_used = true
+							end
+						elseif y <= mcl_vars.mg_end_max and y >= mcl_vars.mg_end_min then
+							if data[p_pos] == c_stone or data[p_pos] == c_dirt or data[p_pos] == c_sand then
+								data[p_pos] = c_air
+								lvm_used = true
+							end
+						end
 					end
 				end
 			end
@@ -1139,154 +1169,23 @@ minetest.register_on_generated(function(minp, maxp)
 		end
 	end
 
+	-- Set high light level in the End. This is very hacky and messes up the shadows below the End islands.
+	-- FIXME: Find a better way to do light.
+	if minp.y >= mcl_vars.mg_end_min and maxp.y <= mcl_vars.mg_end_max then
+		vm:set_lighting({day=14, night=14})
+		lvm_used = true
+	end
 	if lvm_used then
 		vm:set_data(data)
 		vm:calc_lighting()
-		vm:update_liquids()
+		if liquids_used then
+			vm:update_liquids()
+		end
 		vm:write_to_map()
 	end
 
-	-- Generate rare underground mushrooms
-	-- TODO: Make them appear in groups, use Perlin noise
-	if minp.y > 0 or maxp.y < -32 then
-		return
-	end
-
-	local bpos
-	local stone = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_core:stone", "mcl_core:dirt", "mcl_core:mycelium", "mcl_core:podzol", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:stone_with_iron", "mcl_core:stone_with_gold"})
-
-	for n = 1, #stone do
-		bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z }
-
-		if math.random(1,1000) < 4 and minetest.get_node_light(bpos, 0.5) <= 12 then
-			if math.random(1,2) == 1 then
-				minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"})
-			else
-				minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"})
-			end
-		end
-	end
-
-	-- Generate cocoas and vines at jungle trees (v6 only)
-	if minetest.get_mapgen_setting("mg_name") == "v6" then
-
-		if maxp.y < 0 then
-			return
-		end
-
-		local pos, treepos, dir
-		local jungletree = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungletree")
-		local jungleleaves = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungleleaves")
-
-		-- Pass 1: Generate cocoas
-		for n = 1, #jungletree do
-
-			pos = jungletree[n]
-			treepos = table.copy(pos)
-
-			if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then
-
-				dir = math.random(1, 40)
-
-				if dir == 1 then
-					pos.z = pos.z + 1
-				elseif dir == 2 then
-					pos.z = pos.z - 1
-				elseif dir == 3 then
-					pos.x = pos.x + 1
-				elseif dir == 4 then
-					pos.x = pos.x -1
-				end
-
-				local nn = minetest.get_node(pos).name
-
-				if dir < 5
-				and nn == "air"
-				and minetest.get_node_light(pos) > 12 then
-					minetest.swap_node(pos, {
-						name = "mcl_cocoas:cocoa_" .. tostring(math.random(1, 3)),
-						param2 = minetest.dir_to_facedir(vector.subtract(treepos, pos))
-					})
-				end
-
-			end
-		end
-
-		-- Pass 2: Generate vines at jungle wood and jungle leaves
-		perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500)
-		perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1)
-		perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75)
-		perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10)
-		perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500)
-		local junglething
-		for i=1, 2 do
-			if i==1 then junglething = jungletree
-			else junglething = jungleleaves end
-
-			for n = 1, #junglething do
-				pos = junglething[n]
-
-				treepos = table.copy(pos)
-
-				local dirs = {
-					{x=1,y=0,z=0},
-					{x=-1,y=0,z=0},
-					{x=0,y=0,z=1},
-					{x=0,y=0,z=-1},
-				}
-
-				for d = 1, #dirs do
-				local pos = vector.add(pos, dirs[d])
-
-				local nn = minetest.get_node(pos).name
-
-				if perlin_vines:get2d(pos) > 0.1 and perlin_vines_fine:get3d(pos) > math.max(0.3333, perlin_vines_density:get2d(pos)) and nn == "air" then
-
-					local newnode = {
-						name = "mcl_core:vine",
-						param2 = minetest.dir_to_wallmounted(vector.subtract(treepos, pos))
-					}
-
-					-- Determine growth direction
-					local grow_upwards = false
-					-- Only possible on the wood, not on the leaves
-					if i == 1 then
-						grow_upwards = perlin_vines_upwards:get3d(pos) > 0.8
-					end
-					if grow_upwards then
-						-- Grow vines up 1-4 nodes, even through jungleleaves.
-						-- This may give climbing access all the way to the top of the tree :-)
-						-- But this will be fairly rare.
-						local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 4)
-						for l=0, length-1 do
-							local tnn = minetest.get_node(treepos).name
-							local nn = minetest.get_node(pos).name
-							if (nn == "air" or nn == "mcl_core:jungleleaves") and mcl_core.supports_vines(tnn) then
-								minetest.set_node(pos, newnode)
-							else
-								break
-							end
-							pos.y = pos.y + 1
-							treepos.y = treepos.y + 1
-						end
-					else
-						-- Grow vines down 1-7 nodes
-						local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 7)
-						for l=0, length-1 do
-							if minetest.get_node(pos).name == "air" then
-								minetest.set_node(pos, newnode)
-							else
-								break
-							end
-							pos.y = pos.y - 1
-						end
-					end
-				end
-				end
-			end
-		end
-	end
-
+	generate_underground_mushrooms(minp, maxp)
+	generate_jungle_tree_decorations(minp, maxp)
 end)
 
 
diff --git a/mods/MISC/gt2mc2/LICENSE b/mods/MISC/gt2mc2/LICENSE
new file mode 100644
index 000000000..8864d4a39
--- /dev/null
+++ b/mods/MISC/gt2mc2/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/mods/MISC/gt2mc2/craftitems.lua b/mods/MISC/gt2mc2/craftitems.lua
new file mode 100644
index 000000000..d87be2887
--- /dev/null
+++ b/mods/MISC/gt2mc2/craftitems.lua
@@ -0,0 +1,317 @@
+-- mods/gt2mc/craftitems.lua
+
+--======================
+--default to mcl_core
+--======================
+--tools
+minetest.register_alias("default:stick", "mcl_core:stick")
+minetest.register_alias("default:pick_wood", "mcl_tools:pick_wood")
+minetest.register_alias("default:pick_stone", "mcl_tools:pick_stone")
+minetest.register_alias("default:pick_steel", "mcl_tools:pick_iron")
+minetest.register_alias("default:pick_gold", "mcl_tools:pick_gold")
+minetest.register_alias("default:pick_mese", "mcl_tools:pick_gold")
+minetest.register_alias("default:pick_diamond", "mcl_tools:pick_diamond")
+minetest.register_alias("default:shovel_wood", "mcl_tools:shovel_wood")
+minetest.register_alias("default:shovel_stone", "mcl_tools:shovel_stone")
+minetest.register_alias("default:shovel_steel", "mcl_tools:shovel_iron")
+minetest.register_alias("default:shovel_gold", "mcl_tools:shovel_gold")
+minetest.register_alias("default:shovel_mese", "mcl_tools:shovel_gold")
+minetest.register_alias("default:shovel_diamond", "mcl_tools:shovel_diamond")
+minetest.register_alias("default:axe_wood", "mcl_tools:axe_wood")
+minetest.register_alias("default:axe_stone", "mcl_tools:axe_stone")
+minetest.register_alias("default:axe_steel", "mcl_tools:axe_iron")
+minetest.register_alias("default:axe_gold", "mcl_tools:axe_gold")
+minetest.register_alias("default:axe_diamond", "mcl_tools:axe_diamond")
+minetest.register_alias("default:sword_wood", "mcl_tools:sword_wood")
+minetest.register_alias("default:sword_stone", "mcl_tools:sword_stone")
+minetest.register_alias("default:sword_steel", "mcl_tools:sword_iron")
+minetest.register_alias("default:sword_gold", "mcl_tools:sword_gold")
+minetest.register_alias("default:sword_mese", "mcl_tools:sword_gold")
+minetest.register_alias("default:sword_diamond", "mcl_tools:sword_diamond")
+minetest.register_alias("default:shears", "mcl_tools:shears")
+minetest.register_alias("mobs:shears", "mcl_tools:shears")
+--farming tools
+minetest.register_alias("farming:hoe_stone", "mcl_farming:hoe_stone")
+minetest.register_alias("farming:hoe_iron", "mcl_farming:hoe_iron")
+minetest.register_alias("farming:hoe_steel", "mcl_farming:hoe_iron")
+minetest.register_alias("farming:hoe_diamond", "mcl_farming:hoe_diamond")
+minetest.register_alias("farming:hoe_gold", "mcl_farming:hoe_gold")
+minetest.register_alias("farming:hoe_mese", "mcl_farming:hoe_gold")
+--moredefault misc
+minetest.register_alias("default:paper", "mcl_core:paper")
+minetest.register_alias("mcl_books:paper", "mcl_core:paper")
+minetest.register_alias("default:book", "mcl_books:book")
+minetest.register_alias("default:book_written", "mcl_books:written_book")
+minetest.register_alias("mcl_books:book_written", "mcl_books:written_book")
+minetest.register_alias("default:bowl", "mcl_core:bowl")
+minetest.register_alias("mobs:bowl", "mcl_core:bowl")
+--default ores, ingots
+minetest.register_alias("default:coal_lump", "mcl_core:coal_lump")
+minetest.register_alias("default:charcoal", "mcl_core:charcoal")
+minetest.register_alias("default:iron_lump", "mcl_core:stone_with_iron")
+minetest.register_alias("default:steel_lump", "mcl_core:stone_with_iron")
+minetest.register_alias("default:gold_lump", "mcl_core:stone_with_gold")
+minetest.register_alias("default:steel_ingot", "mcl_core:iron_ingot")
+minetest.register_alias("default:gold_ingot", "mcl_core:gold_ingot")
+minetest.register_alias("mcl_core:steel_ingot", "mcl_core:iron_ingot")
+minetest.register_alias("default:clay_lump", "mcl_core:clay_lump")
+minetest.register_alias("default:mese_crystal_fragment", "mcl_core:iron_ingot")
+minetest.register_alias("default:obsidian_shard", "mcl_core:iron_ingot")
+minetest.register_alias("default:stone_with_coal", "mcl_core:stone_with_coal")
+minetest.register_alias("default:iron_nugget", "mcl_core:ironnugget")
+minetest.register_alias("default:gold_nugget", "mcl_core:goldnugget")
+minetest.register_alias("default:mese_crystal", "mcl_core:redstone")
+minetest.register_alias("mcl_core:redstone", "mesecons:redstone")
+minetest.register_alias("default:emerald_crystal", "mcl_core:emerald")
+minetest.register_alias("mcl_nether:quartz_crystal", "mcl_nether:quartz")
+minetest.register_alias("default:quartz_crystal_piece", "mcl_nether:quartz")
+minetest.register_alias("default:diamond", "mcl_core:diamond")
+minetest.register_alias("default:clay_brick", "mcl_core:brick")
+
+--======================
+--bonemeal
+--======================
+minetest.register_alias("bonemeal:bonemeal", "mcl_dye:white")
+minetest.register_alias("bonemeal:bone", "mcl_mobitems:bone")
+
+--======================
+--armor
+--======================
+minetest.register_alias("3d_armor:helmet_wood", "3d_armor:helmet_leather")
+minetest.register_alias("3d_armor:chestplate_wood", "3d_armor:chestplate_leather")
+minetest.register_alias("3d_armor:leggings_wood", "3d_armor:leggings_leather")
+minetest.register_alias("3d_armor:boots_wood", "3d_armor:boots_leather")
+
+minetest.register_alias("3d_armor:helmet_bronze", "3d_armor:helmet_gold")
+minetest.register_alias("3d_armor:chestplate_bronze", "3d_armor:chestplate_gold")
+minetest.register_alias("3d_armor:leggings_bronze", "3d_armor:leggings_gold")
+minetest.register_alias("3d_armor:boots_bronze", "3d_armor:boots_gold")
+
+--======================
+--Cake
+--======================
+minetest.register_alias("cake:cake", "mcl_cake:cake")
+
+--======================
+--carts
+--======================
+minetest.register_alias("carts:cart", "mcl_minecarts:minecart")
+
+--======================
+--clock and compass
+--======================
+minetest.register_alias("clock:clock", "mcl_clock:clock")
+minetest.register_alias("compass:compass", "mcl_compass:compass")
+
+--clocks compass
+minetest.register_alias("clock:1", "mcl_clock:clock_1")
+minetest.register_alias("clock:2", "mcl_clock:clock_2")
+minetest.register_alias("clock:3", "mcl_clock:clock_3")
+minetest.register_alias("clock:4", "mcl_clock:clock_4")
+minetest.register_alias("clock:5", "mcl_clock:clock_5")
+minetest.register_alias("clock:6", "mcl_clock:clock_6")
+minetest.register_alias("clock:7", "mcl_clock:clock_7")
+minetest.register_alias("clock:8", "mcl_clock:clock_8")
+minetest.register_alias("clock:9", "mcl_clock:clock_9")
+minetest.register_alias("clock:10", "mcl_clock:clock_10")
+minetest.register_alias("clock:11", "mcl_clock:clock_11")
+minetest.register_alias("clock:12", "mcl_clock:clock_12")
+minetest.register_alias("clock:13", "mcl_clock:clock_13")
+minetest.register_alias("clock:14", "mcl_clock:clock_14")
+minetest.register_alias("clock:15", "mcl_clock:clock_15")
+minetest.register_alias("clock:16", "mcl_clock:clock_16")
+minetest.register_alias("clock:17", "mcl_clock:clock_17")
+minetest.register_alias("clock:18", "mcl_clock:clock_18")
+minetest.register_alias("clock:19", "mcl_clock:clock_19")
+minetest.register_alias("clock:20", "mcl_clock:clock_20")
+minetest.register_alias("clock:21", "mcl_clock:clock_21")
+minetest.register_alias("clock:22", "mcl_clock:clock_22")
+minetest.register_alias("clock:23", "mcl_clock:clock_23")
+minetest.register_alias("clock:24", "mcl_clock:clock_24")
+minetest.register_alias("clock:25", "mcl_clock:clock_25")
+minetest.register_alias("clock:26", "mcl_clock:clock_26")
+minetest.register_alias("clock:27", "mcl_clock:clock_27")
+minetest.register_alias("clock:28", "mcl_clock:clock_28")
+minetest.register_alias("clock:29", "mcl_clock:clock_29")
+minetest.register_alias("clock:30", "mcl_clock:clock_30")
+minetest.register_alias("clock:31", "mcl_clock:clock_31")
+minetest.register_alias("clock:32", "mcl_clock:clock_32")
+minetest.register_alias("clock:33", "mcl_clock:clock_33")
+minetest.register_alias("mcl_clock:33", "mcl_clock:clock_33")
+minetest.register_alias("clock:34", "mcl_clock:clock_34")
+minetest.register_alias("clock:35", "mcl_clock:clock_35")
+minetest.register_alias("clock:36", "mcl_clock:clock_36")
+minetest.register_alias("clock:37", "mcl_clock:clock_37")
+minetest.register_alias("clock:38", "mcl_clock:clock_38")
+minetest.register_alias("clock:39", "mcl_clock:clock_39")
+minetest.register_alias("clock:40", "mcl_clock:clock_40")
+
+--this is template
+--minetest.register_alias("clock:57", "mcl_clock:clock_57")
+--
+--minetest.register_alias("compass:0", "mcl_compass:0")
+--
+
+
+minetest.register_alias("compass:compass", "mcl_compass:compass")
+minetest.register_alias("compass:0", "mcl_compass:0")
+minetest.register_alias("compass:1", "mcl_compass:1")
+minetest.register_alias("compass:2", "mcl_compass:2")
+minetest.register_alias("compass:3", "mcl_compass:3")
+minetest.register_alias("compass:4", "mcl_compass:4")
+minetest.register_alias("compass:5", "mcl_compass:5")
+minetest.register_alias("compass:6", "mcl_compass:6")
+minetest.register_alias("compass:7", "mcl_compass:7")
+minetest.register_alias("compass:8", "mcl_compass:8")
+minetest.register_alias("compass:9", "mcl_compass:9")
+minetest.register_alias("compass:10", "mcl_compass:10")
+minetest.register_alias("compass:11", "mcl_compass:11")
+minetest.register_alias("compass:12", "mcl_compass:12")
+minetest.register_alias("compass:13", "mcl_compass:13")
+minetest.register_alias("compass:14", "mcl_compass:14")
+minetest.register_alias("compass:15", "mcl_compass:15")
+minetest.register_alias("compass:16", "mcl_compass:16")
+minetest.register_alias("compass:17", "mcl_compass:17")
+minetest.register_alias("compass:18", "mcl_compass:18")
+minetest.register_alias("compass:19", "mcl_compass:19")
+minetest.register_alias("compass:20", "mcl_compass:20")
+minetest.register_alias("compass:21", "mcl_compass:17")
+minetest.register_alias("compass:22", "mcl_compass:17")
+minetest.register_alias("compass:23", "mcl_compass:17")
+minetest.register_alias("compass:24", "mcl_compass:17")
+minetest.register_alias("compass:25", "mcl_compass:17")
+minetest.register_alias("compass:26", "mcl_compass:17")
+minetest.register_alias("compass:27", "mcl_compass:17")
+minetest.register_alias("compass:28", "mcl_compass:17")
+minetest.register_alias("compass:29", "mcl_compass:29")
+minetest.register_alias("compass:30", "mcl_compass:30")
+minetest.register_alias("compass:31", "mcl_compass:31")
+minetest.register_alias("compass:32", "mcl_compass:32")
+minetest.register_alias("compass:33", "mcl_compass:33")
+
+
+--======================
+--dye
+--======================
+minetest.register_alias("dye:white", "mcl_dye:white")
+minetest.register_alias("dye:brown", "mcl_dye:brown")
+minetest.register_alias("dye:dark_grey", "mcl_dye:dark_grey")
+minetest.register_alias("dye:lightblue", "mcl_dye:lightblue")
+minetest.register_alias("dye:grey", "mcl_dye:grey")
+minetest.register_alias("dye:green", "mcl_dye:green")
+minetest.register_alias("dye:magenta", "mcl_dye:magenta")
+minetest.register_alias("dye:pink", "mcl_dye:pink")
+minetest.register_alias("dye:cyan", "mcl_dye:cyan")
+minetest.register_alias("dye:violet", "mcl_dye:violet")
+minetest.register_alias("dye:orange", "mcl_dye:orange")
+minetest.register_alias("dye:yellow", "mcl_dye:yellow")
+minetest.register_alias("dye:red", "mcl_dye:red")
+minetest.register_alias("dye:black", "mcl_dye:black")
+minetest.register_alias("dye:blue", "mcl_dye:blue")
+minetest.register_alias("dye:dark_green", "mcl_dye:dark_green")
+
+--======================
+--farorb
+--======================
+minetest.register_alias("farorb:farorb", "mcl_end:ender_eye")
+
+--======================
+--flintsteel
+--======================
+minetest.register_alias("default:flint_and_steel", "mcl_fire:flint_and_steel")
+minetest.register_alias("default:flint", "mcl_fire:flint")
+minetest.register_alias("mcl_fire:flint", "mcl_core:flint")
+
+--======================
+--fishing
+--======================
+minetest.register_alias("fishing:fish_raw", "mcl_fishing:fish_raw")
+minetest.register_alias("fishing:fish_cooked", "mcl_fishing:fish_raw")
+minetest.register_alias("fishing:sushi", "mcl_fishing:fish_raw")
+minetest.register_alias("fishing:salmon_raw", "mcl_fishing:salmon_raw")
+minetest.register_alias("fishing:salmon_cooked", "mcl_fishing:salmon_cooked")
+minetest.register_alias("fishing:clownfish_raw", "mcl_fishing:clownfish_raw")
+minetest.register_alias("fishing:bluewhite_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:exoticfish_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:carp_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:perch_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:carp_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:catfish_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:shark_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:pike_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:pike_cooked", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:shark_cooked", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:shark_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:shark_raw", "mcl_fishing:pufferfish_raw")
+minetest.register_alias("fishing:pole_wood", "mcl_fishing:fishing_rod")
+minetest.register_alias("fishing:pole_perfect", "mcl_fishing:fishing_rod")
+minetest.register_alias("fishing:bait_worm", "mcl_fishing:fishing_rod")
+minetest.register_alias("fishing:bait_corn", "mcl_fishing:fishing_rod")
+minetest.register_alias("fishing:bait_bread", "mcl_fishing:fishing_rod")
+minetest.register_alias("fishing:baitball", "mcl_fishing:fishing_rod")
+minetest.register_alias("fishing:baitball_shark", "mcl_fishing:fishing_rod")
+
+--======================
+--GoldenApple
+--======================
+minetest.register_alias("golden_apple:golden_apple", "mcl_core:apple_gold")
+minetest.register_alias("default:golden_apple", "mcl_core:apple_gold")
+
+--======================
+--MC2 jukebox
+--======================
+minetest.register_alias("jdukebox:box", "mcl_jukebox:jukebox")
+minetest.register_alias("jdukebox:disc_1", "mcl_jukebox:record_1")
+minetest.register_alias("jdukebox:disc_2", "mcl_jukebox:record_2")
+minetest.register_alias("jdukebox:disc_3", "mcl_jukebox:record_3")
+minetest.register_alias("jdukebox:disc_4", "mcl_jukebox:record_4")
+minetest.register_alias("jdukebox:disc_5", "mcl_jukebox:record_5")
+minetest.register_alias("jdukebox:disc_6", "mcl_jukebox:record_6")
+minetest.register_alias("jdukebox:disc_7", "mcl_jukebox:record_7")
+minetest.register_alias("jdukebox:disc_8", "mcl_jukebox:record_8")
+
+
+
+--======================
+--hoppers
+--======================
+minetest.register_alias("hoppers:hopper", "mcl_hoppers:hopper")
+minetest.register_alias("hoppers:hopper_side", "mcl_hoppers:hopper_side")
+
+--======================
+--MC2 boats
+--======================
+minetest.register_alias("boats:boat", "mcl_boats:boat_spruce")
+minetest.register_alias("boats:boat_oak", "mcl_boats:boat_oak")
+minetest.register_alias("boats:boat_spruce", "mcl_boats:boat_spruce")
+minetest.register_alias("boats:boat_birch", "mcl_boats:boat_birch")
+minetest.register_alias("boats:boat_jungle", "mcl_boats:boat_jungle")
+minetest.register_alias("boats:boat_acacia", "mcl_boats:boat_acacia")
+minetest.register_alias("boats:boat_dark_oak", "mcl_boats:boat_dark_oak")
+
+--======================
+--screwdriver
+--======================
+minetest.register_alias("screwdriver:screwdriver", "mcl_core:bowl")
+
+
+--======================
+--tnt
+--======================
+minetest.register_alias("tnt:tnt", "mcl_tnt:tnt")
+minetest.register_alias("tnt:gunpowder", "mcl_tnt:tnt")
+
+--======================
+--vessels
+--======================
+minetest.register_alias("vessels:shelf", "mcl_core:bowl")
+minetest.register_alias("vessels:glass_bottle", "bucket:bucket_empty")
+minetest.register_alias("vessels:drinking_glass", "bucket:bucket_empty")
+minetest.register_alias("vessels:steel_bottle", "bucket:bucket_empty")
+minetest.register_alias("vessels:glass_fragments", "bucket:bucket_empty")
+
+--======================
+--xdecor
+--======================
+minetest.register_alias("xdecor:hammer", "bucket:bucket_empty")
+
diff --git a/mods/MISC/gt2mc2/depends.txt b/mods/MISC/gt2mc2/depends.txt
new file mode 100644
index 000000000..c7458965e
--- /dev/null
+++ b/mods/MISC/gt2mc2/depends.txt
@@ -0,0 +1,2 @@
+mobs?
+
diff --git a/mods/MISC/gt2mc2/enchanted.lua b/mods/MISC/gt2mc2/enchanted.lua
new file mode 100644
index 000000000..c6e232d90
--- /dev/null
+++ b/mods/MISC/gt2mc2/enchanted.lua
@@ -0,0 +1,55 @@
+
+
+minetest.register_alias("xdecor:enchantment_table", "mcl_enchanting:enchantment_table")
+minetest.register_alias("xdecor:book_open", "mcl_enchanting:book_open")
+mobs:alias_mob("xdecor:book_open", "mcl_enchanting:book_open")
+
+
+
+
+-- mods/gt2mc/init.lua
+
+--		axe    = {enchants = "durable, fast"},
+--		pick   = {enchants = "durable, fast"}, 
+--		shovel = {enchants = "durable, fast"},
+--		sword  = {enchants = "sharp"}
+
+
+minetest.register_alias("default:pick_stone", "mcl_tools:pick_stone")
+minetest.register_alias("default:pick_steel", "mcl_tools:pick_iron")
+minetest.register_alias("default:pick_gold", "mcl_tools:pick_gold")
+minetest.register_alias("default:pick_mese", "mcl_tools:pick_gold")
+
+
+
+minetest.register_alias("default:enchanted_pick_diamond_durable", "mcl_tools:enchanted_pick_diamond_durable")
+minetest.register_alias("default:enchanted_pick_diamond_fast", "mcl_tools:enchanted_pick_diamond_fast")
+
+minetest.register_alias("default:shovel_stone", "mcl_tools:shovel_stone")
+minetest.register_alias("default:shovel_steel", "mcl_tools:shovel_iron")
+minetest.register_alias("default:shovel_gold", "mcl_tools:shovel_gold")
+minetest.register_alias("default:shovel_mese", "mcl_tools:shovel_gold")
+
+
+
+minetest.register_alias("default:enchanted_shovel_diamond_durable", "mcl_tools:enchanted_shovel_diamond_durable")
+minetest.register_alias("default:enchanted_shovel_diamond_fast", "mcl_tools:enchanted_shovel_diamond_fast")
+
+minetest.register_alias("default:axe_stone", "mcl_tools:axe_stone")
+minetest.register_alias("default:axe_steel", "mcl_tools:axe_iron")
+minetest.register_alias("default:axe_gold", "mcl_tools:axe_gold")
+
+
+
+minetest.register_alias("default:enchanted_axe_diamond_durable", "mcl_tools:enchanted_axe_diamond_durable")
+minetest.register_alias("default:enchanted_axe_diamond_fast", "mcl_tools:enchanted_axe_diamond_fast")
+
+minetest.register_alias("default:sword_stone", "mcl_tools:sword_stone")
+minetest.register_alias("default:sword_steel", "mcl_tools:sword_iron")
+minetest.register_alias("default:sword_gold", "mcl_tools:sword_gold")
+minetest.register_alias("default:sword_mese", "mcl_tools:sword_gold")
+
+
+
+minetest.register_alias("default:enchanted_sword_diamond_sharp", "mcl_tools:enchanted_sword_diamond_sharp")
+
diff --git a/mods/MISC/gt2mc2/init.lua b/mods/MISC/gt2mc2/init.lua
new file mode 100644
index 000000000..c120277e0
--- /dev/null
+++ b/mods/MISC/gt2mc2/init.lua
@@ -0,0 +1,792 @@
+-- mods/gt2mc/init.lua
+
+dofile(minetest.get_modpath("gt2mc2").."/craftitems.lua")
+dofile(minetest.get_modpath("gt2mc2").."/enchanted.lua")
+dofile(minetest.get_modpath("gt2mc2").."/mob_items.lua")
+
+--======================
+--MC2 beds
+--======================
+minetest.register_alias("beds:fancy_bed", "beds:bed")
+minetest.register_alias("beds:simple_bed", "beds:bed")
+
+--======================
+--MC2 colorblocks
+--======================
+minetest.register_alias("hardenedclay:hardened_clay_red", "mcl_colorblocks:hardened_clay_red")
+minetest.register_alias("hardenedclay:hardened_clay_yellow", "mcl_colorblocks:hardened_clay_yellow")
+minetest.register_alias("hardenedclay:hardened_clay_orange", "mcl_colorblocks:hardened_clay_orange")
+minetest.register_alias("hardenedclay:hardened_clay_brown", "mcl_colorblocks:hardened_clay_brown")
+minetest.register_alias("hardenedclay:hardened_clay_blue", "mcl_colorblocks:hardened_clay_blue")
+minetest.register_alias("hardenedclay:hardened_clay_light_blue", "mcl_colorblocks:hardened_clay_light_blue")
+minetest.register_alias("hardenedclay:hardened_clay_cyan", "mcl_colorblocks:hardened_clay_cyan")
+minetest.register_alias("hardenedclay:hardened_clay_pink", "mcl_colorblocks:hardened_clay_pink")
+minetest.register_alias("hardenedclay:hardened_clay_magenta", "mcl_colorblocks:hardened_clay_magenta")
+minetest.register_alias("hardenedclay:hardened_clay_purple", "mcl_colorblocks:hardened_clay_purple")
+minetest.register_alias("hardenedclay:hardened_clay_green", "mcl_colorblocks:hardened_clay_green")
+minetest.register_alias("hardenedclay:hardened_clay_dark_green", "mcl_colorblocks:hardened_clay_dark_green")
+minetest.register_alias("hardenedclay:hardened_clay_white", "mcl_colorblocks:hardened_clay_white")
+minetest.register_alias("hardenedclay:hardened_clay_gray", "mcl_colorblocks:hardened_clay_grey")
+minetest.register_alias("hardenedclay:hardened_clay_light_gray", "mcl_colorblocks:hardened_clay_grey")
+minetest.register_alias("hardenedclay:hardened_clay_dark_gray", "mcl_colorblocks:hardened_clay_dark_grey")
+minetest.register_alias("hardenedclay:hardened_clay_black", "mcl_colorblocks:hardened_clay_black")
+
+--======================
+--carpet3d
+--======================
+minetest.register_alias("carpet3d:white", "mcl_wool:white_carpet")
+minetest.register_alias("carpet3d:grey", "mcl_wool:grey_carpet")
+minetest.register_alias("carpet3d:silver", "mcl_wool:silver_carpet")
+minetest.register_alias("carpet3d:black", "mcl_wool:black_carpet")
+minetest.register_alias("carpet3d:red", "mcl_wool:red_carpet")
+minetest.register_alias("carpet3d:yellow", "mcl_wool:yellow_carpet")
+minetest.register_alias("carpet3d:green", "mcl_wool:green_carpet")
+minetest.register_alias("carpet3d:cyan", "mcl_wool:cyan_carpet")
+minetest.register_alias("carpet3d:blue", "mcl_wool:blue_carpet")
+minetest.register_alias("carpet3d:magenta", "mcl_wool:magenta_carpet")
+minetest.register_alias("carpet3d:orange", "mcl_wool:orange_carpet")
+minetest.register_alias("carpet3d:purple", "mcl_wool:purple_carpet")
+minetest.register_alias("carpet3d:brown", "mcl_wool:brown_carpet")
+minetest.register_alias("carpet3d:pink", "mcl_wool:pink_carpet")
+minetest.register_alias("carpet3d:lime", "mcl_wool:lime_carpet")
+minetest.register_alias("carpet3d:light_blue", "mcl_wool:light_blue_carpet")
+minetest.register_alias("carpet3d:dark_grey", "mcl_wool:dark_grey_carpet")
+minetest.register_alias("carpet3d:dark_green", "mcl_wool:dark_green_carpet")
+
+--======================
+--carts
+--======================
+minetest.register_alias("carts:rail", "mcl_minecarts:rail")
+minetest.register_alias("carts:powerrail", "mcl_minecarts:golden_rail")
+minetest.register_alias("carts:brakerail", "mcl_minecarts:rail")
+
+--======================
+--default to mcl_core
+--======================
+minetest.register_alias("default:stone", "mcl_core:stone")
+minetest.register_alias("default:savannastone", "mcl_core:stone")
+minetest.register_alias("default:desert_stone", "mcl_core:redsandstone")
+minetest.register_alias("default:granite", "mcl_core:granite")
+minetest.register_alias("default:granite_smooth", "mcl_core:granite_smooth")
+minetest.register_alias("default:diorite", "mcl_core:diorite")
+minetest.register_alias("default:diorite_smooth", "mcl_core:diorite_smooth")
+minetest.register_alias("default:andesite", "mcl_core:andesite")
+minetest.register_alias("default:andesite_smooth", "mcl_core:andesite_smooth")
+
+
+minetest.register_alias("default:stone_with_coal", "mcl_core:stone_with_coal")
+minetest.register_alias("default:desert_stone_with_coal", "mcl_core:stone_with_coal")
+minetest.register_alias("default:stone_with_iron", "mcl_core:stone_with_iron")
+minetest.register_alias("default:desert_stone_with_iron", "mcl_core:stone_with_iron")
+minetest.register_alias("default:stone_with_gold", "mcl_core:stone_with_gold")
+minetest.register_alias("default:desert_stone_with_gold", "mcl_core:stone_with_gold")
+minetest.register_alias("default:stone_with_diamond", "mcl_core:stone_with_diamond")
+minetest.register_alias("default:stone_with_emerald", "mcl_core:stone_with_emerald")
+minetest.register_alias("default:sand_with_diamond", "mcl_core:stone_with_diamond")
+minetest.register_alias("default:rack_with_diamond", "mcl_core:stone_with_diamond")
+minetest.register_alias("default:stone_with_mese", "mcl_core:stone_with_redstone")
+minetest.register_alias("mcl_core:stone_with_mese", "mcl_core:stone_with_redstone")
+
+
+minetest.register_alias("default:dirt_with_grass", "mcl_core:dirt_with_grass")
+minetest.register_alias("default:dirt_with_dry_grass", "mcl_core:coarse_dirt")
+minetest.register_alias("default:grass_path", "mcl_core:grass_path")
+minetest.register_alias("default:dirt_with_snow", "mcl_core:dirt_with_grass_snow")
+minetest.register_alias("default:dirt_with_grass_footsteps", "mcl_core:dirt_with_grass_footsteps")
+minetest.register_alias("default:podzol", "mcl_core:podzol")
+minetest.register_alias("default:dirt_with_rainforest_litter", "mcl_core:podzol")
+minetest.register_alias("default:mycelium", "mcl_core:mycelium")
+minetest.register_alias("default:mycelium_snow", "mcl_core:mycelium_snow")
+minetest.register_alias("default:dirt", "mcl_core:dirt")
+minetest.register_alias("default:coarse_dirt", "mcl_core:coarse_dirt")
+
+minetest.register_alias("default:sand", "mcl_core:sand")
+minetest.register_alias("default:sandstone", "mcl_core:sandstone")
+minetest.register_alias("default:sandstone_block", "mcl_core:sandstonesmooth")
+minetest.register_alias("default:sandstonebrick", "mcl_core:sandstonecarved")
+minetest.register_alias("default:desert_sand", "mcl_core:redsand")
+minetest.register_alias("default:desertsandstone", "mcl_core:redsandstone")
+minetest.register_alias("default:desert_stone_block", "mcl_core:redsandstonesmooth")
+minetest.register_alias("default:desert_stonebrick", "mcl_core:redsandstonecarved")
+
+minetest.register_alias("default:gravel", "mcl_core:gravel")
+minetest.register_alias("default:clay", "mcl_core:clay")
+minetest.register_alias("default:brick", "mcl_core:brick_block")
+minetest.register_alias("default:fossil", "mcl_core:bone_block")
+minetest.register_alias("default:coalblock", "mcl_core:coalblock")
+
+minetest.register_alias("default:stonebrick", "mcl_core:stonebrick")
+minetest.register_alias("default:stone_block", "mcl_core:stonebrickcarved")
+minetest.register_alias("default:stonebrickcarved", "mcl_core:stonebrickcarved")
+minetest.register_alias("default:stonebrickcracked", "mcl_core:stonebrickcracked")
+
+
+minetest.register_alias("default:obsidian", "mcl_core:obsidian")
+minetest.register_alias("default:obsidianbrick", "mcl_nether:nether_brick")
+minetest.register_alias("default:obsidianblock", "mcl_nether:nether_brick")
+
+minetest.register_alias("default:bush_leaves", "mcl_core:leaves")
+minetest.register_alias("default:bush_stem", "mcl_core:tree")
+minetest.register_alias("default:bush_sapling", "mcl_core:sapling")
+minetest.register_alias("default:bush_acacia_leaves", "mcl_core:acacialeaves")
+minetest.register_alias("default:acacia_bush_leaves", "mcl_core:acacialeaves")
+minetest.register_alias("default:bush_acacia_stem", "mcl_core:acaciatree")
+minetest.register_alias("default:acacia_bush_stem", "mcl_core:acaciatree")
+minetest.register_alias("default:bush_acacia_sapling", "mcl_core:acaciasapling")
+
+minetest.register_alias("default:tree", "mcl_core:tree")
+minetest.register_alias("default:jungletree", "mcl_core:jungletree")
+minetest.register_alias("default:aspen_tree", "mcl_core:birchtree")
+--minetest.register_alias("default:acacia_tree", "mcl_core:acaciatree")
+minetest.register_alias("default:pine_tree", "mcl_core:sprucetree")
+
+minetest.register_alias("default:wood", "mcl_core:wood")
+minetest.register_alias("default:junglewood", "mcl_core:junglewood")
+minetest.register_alias("default:aspen_wood", "mcl_core:birchwood")
+minetest.register_alias("default:acacia_wood", "mcl_core:acaciawood")
+minetest.register_alias("default:pine_wood", "mcl_core:sprucewood")
+
+minetest.register_alias("default:leaves", "mcl_core:leaves")
+minetest.register_alias("default:jungleleaves", "mcl_core:jungleleaves")
+minetest.register_alias("default:aspen_leaves", "mcl_core:birchleaves")
+--minetest.register_alias("default:acacia_leaves", "mcl_core:acacialeaves")
+minetest.register_alias("default:pine_needles", "mcl_core:spruceleaves")
+
+minetest.register_alias("default:sapling", "mcl_core:sapling")
+minetest.register_alias("default:junglesapling", "mcl_core:junglesapling")
+minetest.register_alias("default:aspen_sapling", "mcl_core:birchsapling")
+minetest.register_alias("default:acacia_sapling", "mcl_core:acaciasapling")
+minetest.register_alias("default:pine_sapling", "mcl_core:sprucesapling")
+
+minetest.register_alias("default:junglegrass", "mcl_flowers:fern")
+minetest.register_alias("default:grass", "mcl_flowers:tallgrass")
+minetest.register_alias("default:grass_1", "mcl_flowers:tallgrass")
+minetest.register_alias("default:grass_2", "mcl_flowers:tallgrass")
+minetest.register_alias("default:grass_3", "mcl_flowers:tallgrass")
+minetest.register_alias("default:grass_4", "mcl_flowers:tallgrass")
+minetest.register_alias("default:grass_5", "mcl_flowers:tallgrass")
+minetest.register_alias("default:dry_grass", "mcl_flowers:tallgrass")
+minetest.register_alias("default:dry_grass_1", "mcl_flowers:tallgrass")
+minetest.register_alias("default:dry_grass_2", "mcl_flowers:tallgrass")
+minetest.register_alias("default:dry_grass_3", "mcl_flowers:tallgrass")
+minetest.register_alias("default:dry_grass_4", "mcl_flowers:tallgrass")
+minetest.register_alias("default:dry_grass_5", "mcl_flowers:tallgrass")
+
+
+minetest.register_alias("default:cactus", "mcl_core:cactus")
+minetest.register_alias("default:dry_shrub", "mcl_core:deadbush")
+minetest.register_alias("default:papyrus", "mcl_core:reeds")
+
+minetest.register_alias("default:bookshelf", "mcl_books:bookshelf")
+minetest.register_alias("default:glass", "mcl_core:glass")
+minetest.register_alias("default:obsidian_glass", "mcl_core:glass")
+
+minetest.register_alias("default:ladder_wood", "mcl_core:ladder")
+minetest.register_alias("default:ladder", "mcl_core:ladder")
+minetest.register_alias("default:wood", "mcl_core:wood")
+minetest.register_alias("default:mese", "mcl_core:redstone_block")
+minetest.register_alias("default:cloud", "mcl_core:cloud")
+minetest.register_alias("default:void", "mcl_core:void")
+minetest.register_alias("default:dummy", "mcl_core:void")
+minetest.register_alias("default:bedrock", "mcl_core:bedrock")
+minetest.register_alias("default:water_flowing", "mcl_core:water_flowing")
+minetest.register_alias("default:water_source", "mcl_core:water_source")
+minetest.register_alias("default:river_water_flowing", "mcl_core:water_flowing")
+minetest.register_alias("default:river_water_source", "mcl_core:water_source")
+minetest.register_alias("default:lava_flowing", "mcl_core:lava_flowing")
+minetest.register_alias("default:lava_source", "mcl_core:lava_source")
+minetest.register_alias("default:torch", "mcl_core:torch")
+minetest.register_alias("default:sign_wall", "mcl_signs:wall_sign")
+minetest.register_alias("default:sign_wall_wood", "mcl_signs:wall_sign")
+
+minetest.register_alias("default:furnace", "mcl_core:furnace")
+minetest.register_alias("bones:bones", "mcl_chests:chest")
+minetest.register_alias("default:chest", "mcl_chests:chest")
+minetest.register_alias("default:locked_chest", "mcl_chests:chest")
+minetest.register_alias("default:cobble", "mcl_core:cobble")
+minetest.register_alias("default:mossycobble", "mcl_core:mossycobble")
+minetest.register_alias("default:stonebrickmossy", "mcl_core:stonebrickmossy")
+minetest.register_alias("default:desert_cobble", "mcl_core:mossycobble")
+
+minetest.register_alias("default:steelblock", "mcl_core:ironblock")
+minetest.register_alias("default:goldblock", "mcl_core:goldblock")
+minetest.register_alias("default:diamondblock", "mcl_core:diamondblock")
+minetest.register_alias("default:emeraldblock", "mcl_core:emeraldblock")
+minetest.register_alias("default:meselamp", "mcl_nether:glowstone")
+minetest.register_alias("default:meselamp", "mcl_nether:glowstone")
+minetest.register_alias("default:mese", "mesecons_torch:redstoneblock")
+
+minetest.register_alias("default:coral_brown", "mcl_core:coalblock")
+minetest.register_alias("default:coral_orange", "mcl_core:coalblock")
+minetest.register_alias("default:coral_skeleton", "mcl_core:coalblock")
+
+
+
+minetest.register_alias("default:nyancat", "mcl_core:nyancat")
+minetest.register_alias("default:nyancat_rainbow", "mcl_core:nyancat_rainbow")
+minetest.register_alias("default:apple", "mcl_flowers:tallgrass")  --did this to fix map
+
+
+
+
+minetest.register_alias("default:torch", "mcl_torches:torch")
+minetest.register_alias("torches:torch", "mcl_torches:torch")
+minetest.register_alias("default:torch_wall", "mcl_torches:torch_wall")
+minetest.register_alias("torches:wall", "mcl_torches:torch")
+minetest.register_alias("default:torch_floor", "mcl_torches:torch_floor")
+minetest.register_alias("torches:floor", "mcl_torches:torch")
+minetest.register_alias("default:torch_ceiling", "mcl_torches:torch")
+minetest.register_alias("torches:ceiling", "mcl_torches:torch")
+
+
+minetest.register_alias("default:furnace", "mcl_furnaces:furnace")
+minetest.register_alias("default:furnace_active", "mcl_furnaces:furnace_active")
+
+
+minetest.register_alias("default:snow", "mcl_core:snow")
+minetest.register_alias("default:snowblock", "mcl_core:snowblock")
+minetest.register_alias("default:ice", "mcl_core:ice")
+
+-- Aliases for corrected pine node names
+minetest.register_alias("default:pinetree", "mcl_core:sprucetree")
+minetest.register_alias("default:pinewood", "mcl_core:sprucewood")
+
+minetest.register_alias("default:sign_wall", "mcl_core:sign_wall_wood")
+minetest.register_alias("default:fence_wood", "mcl_fences:fence")
+minetest.register_alias("default:fence_oak_wood", "mcl_fences:dark_oak_fence")
+minetest.register_alias("default:fence_pine_wood", "mcl_fences:spruce_fence")
+minetest.register_alias("default:fence_aspen_wood", "mcl_fences:birch_fence")
+minetest.register_alias("default:fence_acacia_wood", "mcl_fences:acacia_fence")
+minetest.register_alias("default:fence_junglewood", "mcl_fences:jungle_fence")
+
+--======================
+--door
+--======================
+minetest.register_alias("doors:door_wood", "mcl_doors:dark_oak_door")
+minetest.register_alias("doors:trapdoor_wood", "mcl_doors:dark_oak_door")
+minetest.register_alias("doors:trapdoor_steel", "mcl_doors:dark_oak_door")
+minetest.register_alias("doors:hidden", "air")
+--minetest.register_alias("doors:hidden", "mcl_doors:dark_oak_door_t_1")
+minetest.register_alias("doors:door_wood_a", "mcl_doors:dark_oak_door_b_1")
+minetest.register_alias("doors:door_wood_a_2", "mcl_doors:dark_oak_door_b_1")
+minetest.register_alias("doors:door_wood_b", "mcl_doors:dark_oak_door_b_2")
+
+--old style
+minetest.register_alias("doors:door_wood_b_1", "mcl_doors:dark_oak_door_b_1")
+minetest.register_alias("doors:door_wood_b_2", "mcl_doors:dark_oak_door_b_2")
+minetest.register_alias("doors:door_wood_t_1", "mcl_doors:dark_oak_door_t_1")
+minetest.register_alias("doors:door_wood_t_2", "mcl_doors:dark_oak_door_t_2")
+
+minetest.register_alias("doors:door_steel_b", "mcl_doors:iron_door_b_1")
+minetest.register_alias("doors:door_steel_b_1", "mcl_doors:iron_door_b_1")
+minetest.register_alias("doors:door_steel_b_2", "mcl_doors:iron_door_b_2")
+minetest.register_alias("doors:door_steel_a", "mcl_doors:iron_door_t_1")
+minetest.register_alias("doors:door_steel_t_1", "mcl_doors:iron_door_t_1")
+minetest.register_alias("doors:door_steel_t_2", "mcl_doors:iron_door_t_2")
+
+
+--======================
+--farming oh boy...
+--======================
+--tomato
+minetest.register_alias("farming:tomato", "farming:carrot")
+minetest.register_alias("farming:tomato_1", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:tomato_2", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:tomato_3", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:tomato_4", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:tomato_5", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:tomato_6", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:tomato_7", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:tomato_8", "mcl_farming:melon")
+
+--cucumber
+minetest.register_alias("farming:cucumber", "farming:carrot")
+minetest.register_alias("farming:cucumber_1", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:cucumber_2", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:cucumber_3", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:cucumber_4", "mcl_flowers:tallgrass")
+
+--raspberry
+minetest.register_alias("farming:raspberries", "farming:carrot")
+minetest.register_alias("farming:smoothie_raspberry", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:raspberry_1", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:raspberry_2", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:raspberry_3", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:raspberry_4", "mcl_flowers:tallgrass")
+
+--blueberry
+minetest.register_alias("farming:blueberries", "farming:carrot")
+minetest.register_alias("farming:muffin_blueberry", "farming:bread")
+minetest.register_alias("farming:blueberry_1", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:blueberry_2", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:blueberry_3", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:blueberry_4", "mcl_flowers:tallgrass")
+
+--rhubarb
+minetest.register_alias("farming:rhubarb", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:rhubarb_pie", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:rhubarb_1", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:rhubarb_2", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:rhubarb_3", "mcl_flowers:tallgrass")
+
+--beans
+minetest.register_alias("farming:beanpole", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:beans", "farming:carrot")
+minetest.register_alias("farming:beanbush", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:beanpole_1", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:beanpole_2", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:beanpole_3", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:beanpole_4", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:beanpole_5", "mcl_flowers:tallgrass")
+
+--grapes
+minetest.register_alias("farming:grapes", "mcl_farming:carrot")
+minetest.register_alias("farming:trellis", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:grapebush", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:grapes_1", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:grapes_2", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:grapes_3", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:grapes_4", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:grapes_5", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:grapes_6", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:grapes_7", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:grapes_8", "mcl_flowers:tallgrass")
+
+--barley
+minetest.register_alias("farming:barley", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:barley_1", "mcl_farming:hay_block")
+minetest.register_alias("farming:barley_2", "mcl_farming:hay_block")
+minetest.register_alias("farming:barley_3", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:barley_4", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:barley_5", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:barley_6", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:barley_7", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:seed_barley", "mcl_farming:hay_block")
+
+--coffee
+minetest.register_alias("farming:coffee", "mcl_farming:carrot")
+minetest.register_alias("farming:coffee_cup_hot", "mcl_farming:carrot")
+minetest.register_alias("farming:coffee_cup", "mcl_farming:carrot")
+minetest.register_alias("farming:drinking_cup", "mcl_farming:carrot")
+minetest.register_alias("farming:coffee_beans", "mcl_farming:carrot")
+minetest.register_alias("farming:coffee_1", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:coffee_2", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:coffee_3", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:coffee_4", "mcl_flowers:tallgrass")
+minetest.register_alias("farming:coffee_5", "mcl_flowers:tallgrass")
+
+--FARMING EXISTING
+minetest.register_alias("farming:soil", "mcl_farming:soil")
+minetest.register_alias("farming:soil_wet", "mcl_farming:soil_wet")
+
+
+minetest.register_alias("farming:pumpkin", "mcl_farming:pumpkin_7")
+minetest.register_alias("farming:pumpkin_slice", "mcl_farming:melon_slice")
+minetest.register_alias("farming:pumpkin_1", "mcl_farming:pumpkin_7")
+minetest.register_alias("farming:pumpkin_2", "mcl_farming:pumpkin_7")
+minetest.register_alias("farming:pumpkin_3", "mcl_farming:pumpkin_7")
+minetest.register_alias("farming:pumpkin_4", "mcl_farming:pumpkin_7")
+minetest.register_alias("farming:pumpkin_5", "mcl_farming:pumpkin_7")
+minetest.register_alias("farming:pumpkin_6", "mcl_farming:pumpkin_7")
+minetest.register_alias("farming:pumpkin_7", "mcl_farming:pumpkin_7")
+minetest.register_alias("farming:pumpkin_8", "mcl_farming:pumpkin_7")
+
+
+minetest.register_alias("farming:cocoa", "mcl_cocoas:cocoa")
+minetest.register_alias("mcl_cocoas:cocoa", "mcl_dye:brown")
+minetest.register_alias("farming:cocoa_beans", "mcl_dye:brown")
+minetest.register_alias("farming:cocoa_1", "mcl_cocoas:cocoa_1")
+minetest.register_alias("farming:cocoa_2", "mcl_cocoas:cocoa_2")
+minetest.register_alias("farming:cocoa_3", "mcl_cocoas:cocoa_3")
+minetest.register_alias("farming:cookie", "mcl_farming:carrot")
+
+minetest.register_alias("farming:melon", "mcl_farming:melon")
+minetest.register_alias("farming:melon_slice", "mcl_farming:melon_slice")
+minetest.register_alias("mcl_farming:melon_slice", "mcl_farming:melon")
+minetest.register_alias("farming:melon_1", "mcl_farming:melontige_7")
+minetest.register_alias("farming:melon_2", "mcl_farming:melontige_7")
+minetest.register_alias("farming:melon_3", "mcl_farming:melontige_7")
+minetest.register_alias("farming:melon_4", "mcl_farming:melontige_7")
+minetest.register_alias("farming:melon_5", "mcl_farming:melontige_7")
+minetest.register_alias("farming:melon_6", "mcl_farming:melontige_7")
+minetest.register_alias("farming:melon_7", "mcl_farming:melontige_7")
+minetest.register_alias("farming:melon_8", "mcl_farming:melontige_7")
+
+minetest.register_alias("farming:potato", "mcl_farming:potato")
+minetest.register_alias("farming:potato_1", "mcl_farming:potato")
+minetest.register_alias("farming:potato_2", "mcl_farming:potato")
+minetest.register_alias("farming:potato_3", "mcl_farming:potato")
+minetest.register_alias("farming:potato_4", "mcl_farming:potato")
+minetest.register_alias("farming:potato_5", "mcl_farming:potato")
+minetest.register_alias("farming:potato_6", "mcl_farming:potato")
+minetest.register_alias("farming:potato_7", "mcl_farming:potato")
+minetest.register_alias("farming:potato_8", "mcl_farming:potato")
+
+
+minetest.register_alias("farming:carrot_gold", "mcl_farming:carrot_item_gold")
+minetest.register_alias("farming:carrot", "mcl_farming:carrot")
+minetest.register_alias("farming:carrot_1", "mcl_farming:carrot")
+minetest.register_alias("farming:carrot_2", "mcl_farming:carrot")
+minetest.register_alias("farming:carrot_3", "mcl_farming:carrot")
+minetest.register_alias("farming:carrot_4", "mcl_farming:carrot")
+minetest.register_alias("farming:carrot_5", "mcl_farming:carrot")
+minetest.register_alias("farming:carrot_6", "mcl_farming:carrot")
+minetest.register_alias("farming:carrot_7", "mcl_farming:carrot")
+minetest.register_alias("farming:carrot_8", "mcl_farming:carrot")
+
+minetest.register_alias("farming:corn", "mcl_farming:carrot")
+minetest.register_alias("farming:corn_1", "mcl_farming:carrot")
+minetest.register_alias("farming:corn_2", "mcl_farming:carrot")
+minetest.register_alias("farming:corn_3", "mcl_farming:carrot")
+minetest.register_alias("farming:corn_4", "mcl_farming:carrot")
+minetest.register_alias("farming:corn_5", "mcl_farming:carrot")
+minetest.register_alias("farming:corn_6", "mcl_farming:carrot")
+minetest.register_alias("farming:corn_7", "mcl_farming:carrot")
+minetest.register_alias("farming:corn_8", "mcl_farming:carrot")
+
+minetest.register_alias("farming:wheat", "mcl_farming:wheat")
+minetest.register_alias("farming:straw", "mcl_farming:wheat")
+minetest.register_alias("farming:bread", "mcl_core:snow")
+minetest.register_alias("farming:flour", "mcl_farming:bread")
+minetest.register_alias("farming:seed_wheat", "mcl_farming:hay_block")
+minetest.register_alias("mcl_farming:seed_wheat", "mcl_farming:hay_block")
+minetest.register_alias("farming:wheat_1", "mcl_farming:wheat_5")
+minetest.register_alias("farming:wheat_2", "mcl_farming:wheat_5")
+minetest.register_alias("farming:wheat_3", "mcl_farming:wheat_5")
+minetest.register_alias("farming:wheat_4", "mcl_farming:wheat_5")
+minetest.register_alias("farming:wheat_5", "mcl_farming:wheat_5")
+minetest.register_alias("farming:wheat_6", "mcl_farming:wheat_5")
+minetest.register_alias("farming:wheat_7", "mcl_farming:wheat_5")
+minetest.register_alias("farming:wheat_8", "mcl_farming:wheat_5")
+
+minetest.register_alias("farming:cotton", "mcl_farming:wheat")
+minetest.register_alias("farming:seed_cotton", "mcl_farming:wheat")
+minetest.register_alias("farming:cotton_1", "mcl_farming:wheat_5")
+minetest.register_alias("farming:cotton_2", "mcl_farming:wheat_5")
+minetest.register_alias("farming:cotton_3", "mcl_farming:wheat_5")
+minetest.register_alias("farming:cotton_4", "mcl_farming:wheat_5")
+minetest.register_alias("farming:cotton_5", "mcl_farming:wheat_5")
+minetest.register_alias("farming:cotton_6", "mcl_farming:wheat_5")
+minetest.register_alias("farming:cotton_7", "mcl_farming:wheat_5")
+minetest.register_alias("farming:cotton_8", "mcl_farming:wheat_5")
+
+
+--======================
+--Fire
+--======================
+minetest.register_alias("default:underground_fire", "mcl_fire:eternal_fire")
+minetest.register_alias("nether:permanent_flame", "mcl_fire:eternal_fire")
+minetest.register_alias("default:permanent_flame", "mcl_fire:eternal_fire")
+minetest.register_alias("fire:permanent_flame", "mcl_fire:eternal_fire")
+minetest.register_alias("default:basic_flame", "mcl_fire:fire")
+minetest.register_alias("fire:basic_flame", "mcl_fire:fire")
+
+--======================
+--flowers
+--======================
+minetest.register_alias("flowers:rose", "mcl_flowers:poppy")
+minetest.register_alias("flowers:tulip", "mcl_flowers:blue_orchid")
+minetest.register_alias("flowers:dandelion_yellow", "mcl_flowers:dandelion")
+minetest.register_alias("flowers:geranium", "mcl_flowers:tulip_orange")
+minetest.register_alias("flowers:viola", "mcl_flowers:tulip_pink")
+minetest.register_alias("flowers:dandelion_white", "mcl_flowers:oxeye_daisy")
+minetest.register_alias("flowers:waterlily", "mcl_flowers:waterlily")
+minetest.register_alias("flowers:mushroom_brown", "mcl_mushrooms:mushroom_brown")
+minetest.register_alias("flowers:mushroom_red", "mcl_mushrooms:mushroom_red")
+
+--======================
+--hoppers
+--======================
+minetest.register_alias("hopper:hopper_item", "mcl_hoppers:hopper")
+minetest.register_alias("hopper:hopper", "mcl_hoppers:hopper")
+minetest.register_alias("hopper:hopper_side", "mcl_hoppers:hopper_side")
+
+--======================
+--mesecons
+--======================
+minetest.register_alias("dispenser:dispenser", "mcl_dispensers:dispenser")
+minetest.register_alias("dropper:dropper", "mcl_droppers:dropper")
+minetest.register_alias("dropper:dropper", "mcl_droppers:dropper")
+minetest.register_alias("mesecons_button:button_off", "mesecons_button:button_stone_off")
+minetest.register_alias("mesecons_button:button_on", "mesecons_button:button_stone_on")
+minetest.register_alias("mesecons_luacontroller:luacontroller0000", "mesecons_delayer:delayer_off_1")
+minetest.register_alias("mesecons_random:ghoststone", "mesecons_delayer:delayer_off_1")
+
+
+--======================
+--MC2 Andisite,granite,diorite
+--======================
+minetest.register_alias("default:marble", "mcl_core:andesite")
+minetest.register_alias("default:marble_bricks", "mcl_core:andesite_smooth")
+minetest.register_alias("default:granite_bricks", "mcl_core:granite_smooth")
+
+--======================
+--Enderchest
+--======================
+minetest.register_alias("enderchest:enderchest", "mcl_chests:ender_chest")
+minetest.register_alias("mcl_core:enderchest", "mcl_chests:ender_chest")
+
+--======================
+--End
+--======================
+minetest.register_alias("default:end_stone", "mcl_end:end_stone")
+minetest.register_alias("default:end_bricks", "mcl_end:end_bricks")
+minetest.register_alias("default:purpur_block", "mcl_end:purpur_block")
+minetest.register_alias("default:purpur_pillar", "mcl_end:purpur_pillar")
+minetest.register_alias("default:chorus_flower_dead", "mcl_end:chorus_flower_dead")
+minetest.register_alias("default:chorus_plant", "mcl_end:chorus_plant")
+minetest.register_alias("default:chorus_fruit", "mcl_end:chorus_fruit")
+minetest.register_alias("default:chorus_fruit_popped", "mcl_end:chorus_fruit_popped")
+
+--======================
+--MC2 chests
+--======================
+minetest.register_alias("mcl_core:chest", "mcl_chests:chest")
+minetest.register_alias("default:chest", "mcl_chests:chest")
+minetest.register_alias("default:chest_locked", "mcl_chests:chest")
+
+--======================
+--nssm
+--======================
+minetest.register_alias("nssm:ant_dirt", "mcl_core:coarse_dirt")
+
+--======================
+--Nyancat
+--======================
+minetest.register_alias("nyancat:nyancat", "mcl_core:diamondblock")
+minetest.register_alias("nyancat:rainbow", "mcl_core:emeraldblock")
+minetest.register_alias("nyancat:nyancat_rainbow", "mcl_core:emeraldblock")
+
+
+--======================
+--alias to remove old quartz from maps
+--======================
+--minetest.register_alias("default:quartz_crystal", "mcl_nether:quartz")
+minetest.register_alias("default:quartz_ore", "mcl_nether:quartz_ore")
+minetest.register_alias("default:block", "mcl_nether:quartz_block")
+minetest.register_alias("default:chiseled", "mcl_nether:quartz_chiseled")
+minetest.register_alias("default:pillar", "mcl_nether:quartz_pillar")
+minetest.register_alias("default:pillar_horizontal", "mcl_nether:quartz_pillar_horizontal")
+
+--======================
+--alias to merge default-nether to mcl_core
+--======================
+minetest.register_alias("default:rack", "mcl_nether:netherrack")
+minetest.register_alias("default:quartz_ore", "mcl_nether:quartz_ore")
+minetest.register_alias("default:quartz_crystal", "mcl_nether:quartz_crystal")
+minetest.register_alias("default:nitherbrick", "mcl_nether:nether_brick")
+minetest.register_alias("default:obsidiannitherbrick", "mcl_nether:nether_brick")
+minetest.register_alias("default:glowstone", "mcl_nether:glowstone")
+minetest.register_alias("default:glowstone_dust", "mcl_nether:glowstone_dust")
+minetest.register_alias("default:rack_with_diamond", "mcl_core:stone_with_diamond")
+minetest.register_alias("default:slowsand", "mcl_nether:soul_sand")
+minetest.register_alias("default:fence_nither", "mcl_fences:nether_brick_fence")
+
+--======================
+--alias to merge nether to mcl_core
+--======================
+minetest.register_alias("nether:rack", "mcl_nether:netherrack")
+minetest.register_alias("nether:quartz_ore", "mcl_nether:quartz_ore")
+minetest.register_alias("nether:quartz_crystal", "mcl_nether:quartz_crystal")
+minetest.register_alias("nether:nitherbrick", "mcl_nether:nether_brick")
+minetest.register_alias("nether:obsidiannitherbrick", "mcl_nether:nether_brick")
+minetest.register_alias("nether:glowstone", "mcl_nether:glowstone")
+minetest.register_alias("nether:glowstone_dust", "mcl_nether:glowstone_dust")
+minetest.register_alias("nether:rack_with_diamond", "mcl_core:stone_with_diamond")
+minetest.register_alias("nether:sand", "mcl_nether:soul_sand")
+minetest.register_alias("nether:portal", "mcl_portals:portal")
+minetest.register_alias("nether:fence_nither", "mcl_fences:nether_brick_fence")
+
+
+--======================
+--stairs
+--======================
+minetest.register_alias("stairs:slab_marble", "mcl_stairs:slab_stone")
+minetest.register_alias("stairs:stair_marble", "mcl_stairs:stair_stone")
+minetest.register_alias("stairs:slab_marble_bricks", "mcl_stairs:slab_stone")
+minetest.register_alias("stairs:stair_marble_bricks", "mcl_stairs:stair_stone")
+minetest.register_alias("stairs:slab_granite", "mcl_stairs:slab_sandstone")
+minetest.register_alias("stairs:stair_granite", "mcl_stairs:stair_sandstone")
+minetest.register_alias("stairs:slab_granite_bricks", "mcl_stairs:slab_stone")
+minetest.register_alias("stairs:stair_granite_bricks", "mcl_stairs:stair_stone")
+
+minetest.register_alias("stairs:stair_andesite", "mcl_stairs:stair_sandstone")
+minetest.register_alias("stairs:slab_andesite", "mcl_stairs:slab_stone")
+minetest.register_alias("stairs:stair_diorite", "mcl_stairs:stair_sandstone")
+minetest.register_alias("stairs:slab_diorite", "mcl_stairs:slab_stone")
+
+minetest.register_alias("stairs:stair_mossycobble", "mcl_stairs:stair_cobble")
+minetest.register_alias("stairs:slab_mossycobble", "mcl_stairs:slab_cobble")
+minetest.register_alias("stairs:stair_desert_cobble", "mcl_stairs:stair_sandstone")
+minetest.register_alias("stairs:slab_desert_cobble", "mcl_stairs:slab_sandstone")
+minetest.register_alias("stairs:stair_desert_stone", "mcl_stairs:stair_redsandstone")
+minetest.register_alias("stairs:slab_desert_stone", "mcl_stairs:slab_redsandstone")
+minetest.register_alias("stairs:stair_desert_stonebrick", "mcl_stairs:stair_redsandstone")
+minetest.register_alias("stairs:slab_desert_stonebrick", "mcl_stairs:slab_redsandstone")
+
+minetest.register_alias("stairs:stair_stone", "mcl_stairs:stair_stonebrick")
+
+minetest.register_alias("stairs:stair_obsidianbrick", "mcl_stairs:stair_cobble")
+minetest.register_alias("stairs:slab_obsidianbrick", "mcl_stairs:slab_stone")
+minetest.register_alias("stairs:stair_obsidian", "mcl_stairs:stair_cobble")
+minetest.register_alias("stairs:slab_obsidian", "mcl_stairs:slab_stone")
+
+minetest.register_alias("stairs:stair_sandstonebrick", "mcl_stairs:stair_sandstone")
+minetest.register_alias("stairs:slab_sandstonebrick", "mcl_stairs:slab_sandstone")
+
+minetest.register_alias("stairs:stair_nitherbrick", "mcl_stairs:stair_nether_brick")
+minetest.register_alias("stairs:slab_nitherbrick", "mcl_stairs:slab_nether_brick")
+minetest.register_alias("stairs:stair_netherbrick", "mcl_stairs:stair_nether_brick")
+minetest.register_alias("stairs:slab_netherbrick", "mcl_stairs:slab_nether_brick")
+
+minetest.register_alias("stairs:stair_brick", "mcl_stairs:slab_brick_block")
+minetest.register_alias("stairs:slab_brick", "mcl_stairs:slab_brick_block")
+
+minetest.register_alias("stairs:stair_steelblock", "mcl_stairs:stair_cobble")
+minetest.register_alias("stairs:slab_steelblock", "mcl_stairs:slab_cobble")
+minetest.register_alias("stairs:stair_goldblock", "mcl_stairs:stair_cobble")
+minetest.register_alias("stairs:slab_goldblock", "mcl_stairs:slab_cobble")
+
+minetest.register_alias("stairs:stair_pine_wood", "mcl_stairs:stair_sprucewood")
+minetest.register_alias("stairs:slab_pine_wood", "mcl_stairs:slab_sprucewood")
+minetest.register_alias("stairs:stair_acacia_wood", "mcl_stairs:stair_acaciawood")
+minetest.register_alias("stairs:slab_acacia_wood", "mcl_stairs:slab_acaciawood")
+minetest.register_alias("stairs:stair_aspen_wood", "mcl_stairs:stair_birchwood")
+minetest.register_alias("stairs:slab_aspen_wood", "mcl_stairs:slab_birchwood")
+
+--corners
+minetest.register_alias("default:cobble_innerstair", "mcl_stairs:slab_cobble")
+minetest.register_alias("default:cobble_outerstair", "mcl_stairs:slab_cobble")
+
+
+--======================
+--alias for es stuff and misc
+--======================
+minetest.register_alias("esmobs:bones", "mcl_core:chest")
+minetest.register_alias("es:emerald_crystal", "mcl_core:emerald_crystal")
+minetest.register_alias("vines:rope_block", "mcl_tools:pick_gold")
+minetest.register_alias("vines:shears", "mcl_tools:pick_gold")
+minetest.register_alias("vines:vine", "mcl_core:vine")
+minetest.register_alias("vines:vine_middle", "mcl_core:vine")
+minetest.register_alias("vines:vine_end", "mcl_core:vine")
+minetest.register_alias("vines:root", "mcl_core:vine")
+minetest.register_alias("vines:root_middle", "mcl_core:vine")
+minetest.register_alias("vines:root_end", "mcl_core:vine")
+minetest.register_alias("vines:side", "mcl_core:vine")
+minetest.register_alias("vines:side_middle", "mcl_core:vine")
+minetest.register_alias("vines:side_end", "mcl_core:vine")
+minetest.register_alias("vines:jungle", "mcl_core:vine")
+minetest.register_alias("vines:jungle_middle", "mcl_core:vine")
+minetest.register_alias("vines:jungle_end", "mcl_core:vine")
+
+--======================
+--woodsoils
+--======================
+minetest.register_alias("woodsoils:dirt_with_leaves_1", "mcl_core:podzol")
+minetest.register_alias("woodsoils:dirt_with_leaves_2", "mcl_core:podzol")
+minetest.register_alias("woodsoils:grass_with_leaves_1", "mcl_core:podzol")
+minetest.register_alias("woodsoils:grass_with_leaves_2", "mcl_core:podzol")
+
+--======================
+--walls
+--======================
+minetest.register_alias("walls:cobble", "mcl_walls:cobble")
+minetest.register_alias("walls:desertcobble", "mcl_walls:cobble")
+minetest.register_alias("walls:mossycobble", "mcl_walls:cobble")
+
+--======================
+--wool
+--======================
+minetest.register_alias("wool:white", "mcl_wool:white")
+minetest.register_alias("wool:grey", "mcl_wool:grey")
+minetest.register_alias("wool:black", "mcl_wool:black")
+minetest.register_alias("wool:red", "mcl_wool:red")
+minetest.register_alias("wool:yellow", "mcl_wool:yellow")
+minetest.register_alias("wool:green", "mcl_wool:green")
+minetest.register_alias("wool:cyan", "mcl_wool:cyan")
+minetest.register_alias("wool:blue", "mcl_wool:blue")
+minetest.register_alias("wool:magenta", "mcl_wool:magenta")
+minetest.register_alias("wool:orange", "mcl_wool:orange")
+minetest.register_alias("wool:violet", "mcl_wool:purple")
+minetest.register_alias("mcl_wool:violet", "mcl_wool:purple")
+minetest.register_alias("wool:brown", "mcl_wool:brown")
+minetest.register_alias("wool:pink", "mcl_wool:pink")
+minetest.register_alias("wool:dark_grey", "mcl_wool:dark_grey")
+minetest.register_alias("wool:dark_green", "mcl_wool:dark_green")
+
+--======================
+--willages
+--======================
+minetest.register_alias("mg_villages:plotmarker", "mcl_stairs:slab_stone")
+minetest.register_alias("mg_villages:road", "mcl_stairs:slab_stone")
+minetest.register_alias("mg_villages:road", "mcl_stairs:slab_stone")
+minetest.register_alias("mg_villages:soil", "mcl_farming:soil")
+minetest.register_alias("handle_schematics:support", "mcl_farming:soil")
+
+--======================
+--xdecor itemframes etc
+--======================
+minetest.register_alias("xdecor:itemframe", "itemframes:frame")
+minetest.register_alias("xdecor:f_item", "itemframes:item")
+minetest.register_alias("xdecor:workbench", "mcl_anvils:anvil")
+--minetest.register_alias("xdecor:enchantment_table", "mcl_crafting_table:crafting_table")
+minetest.register_alias("xdecor:hammer", "mcl_anvils:anvil")
+--[[
+-- Nodeboxes definitions.
+workbench.defs = {
+	-- Name       Yield   X  Y   Z  W   H  L
+	{"nanoslab",	16, { 0, 0,  0, 8,  1, 8  }},
+	{"micropanel",	16, { 0, 0,  0, 16, 1, 8  }},
+	{"microslab",	8,  { 0, 0,  0, 16, 1, 16 }},
+	{"thinstair",	8,  { 0, 7,  0, 16, 1, 8  },
+			    { 0, 15, 8, 16, 1, 8  }},
+	{"cube", 	4,  { 0, 0,  0, 8,  8, 8  }},
+	{"panel",	4,  { 0, 0,  0, 16, 8, 8  }},
+	{"slab", 	2,  nil			  },
+	{"doublepanel", 2,  { 0, 0,  0, 16, 8, 8  },
+			    { 0, 8,  8, 16, 8, 8  }},
+	{"halfstair",	2,  { 0, 0,  0, 8,  8, 16 },
+			    { 0, 8,  8, 8,  8, 8  }},
+	{"outerstair",	1,  { 0, 0,  0, 16, 8, 16 },
+			    { 0, 8,  8, 8,  8, 8  }},
+	{"stair",	1,  nil			  },
+	{"innerstair",	1,  { 0, 0,  0, 16, 8, 16 },
+			    { 0, 8,  8, 16, 8, 8  },
+			    { 0, 8,  0, 8,  8, 8  }}
+}]]
+--micropanels
+minetest.register_alias("default:wood_micropanel", "mcl_fences:fence")
+minetest.register_alias("default:wood_nanoslab", "mcl_fences:fence")
+
+--======================
+--xpanes
+--======================
+minetest.register_alias("xpanes:pane_flat", "xpanes:pane_natural_flat")
+minetest.register_alias("xpanes:pane", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_0", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_1", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_2", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_3", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_4", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_5", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_6", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_7", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_8", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_9", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_10", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_11", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_12", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_13", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_14", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_15", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_16", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_17", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_18", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_19", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_20", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_21", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_22", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_23", "xpanes:pane_natural")
+minetest.register_alias("xpanes:pane_24", "xpanes:pane_natural")
+
+
diff --git a/mods/MISC/gt2mc2/mob_items.lua b/mods/MISC/gt2mc2/mob_items.lua
new file mode 100644
index 000000000..259f011e3
--- /dev/null
+++ b/mods/MISC/gt2mc2/mob_items.lua
@@ -0,0 +1,161 @@
+--======================
+--mob items and end items
+--======================
+minetest.register_alias("default:end_rod", "mcl_end:end_rod")
+minetest.register_alias("default:dragon_egg", "mcl_end:dragon_egg")
+minetest.register_alias("mobs_mc:dragon_egg", "mcl_end:dragon_egg")
+minetest.register_alias("mobs_mc:ender_eye", "mcl_end:ender_eye")
+minetest.register_alias("mobs_mc:rotten_flesh", "mcl_mobitems:rotten_flesh")
+minetest.register_alias("mobs_mc:mutton", "mcl_mobitems:mutton")
+minetest.register_alias("mobs_mc:mutton_raw", "mcl_mobitems:mutton")
+minetest.register_alias("mobs_mc:cooked_mutton", "mcl_mobitems:cooked_mutton")
+minetest.register_alias("mobs_mc:beef", "mcl_mobitems:beef")
+minetest.register_alias("mobs_mc:beef_raw", "mcl_mobitems:beef")
+minetest.register_alias("mobs_mc:cooked_beef", "mcl_mobitems:cooked_beef")
+minetest.register_alias("mobs_mc:chicken", "mcl_mobitems:chicken")
+minetest.register_alias("mobs_mc:chicken_raw", "mcl_mobitems:chicken")
+minetest.register_alias("mobs_mc:cooked_chicken", "mcl_mobitems:cooked_chicken")
+--minetest.register_alias("mobs_mc:egg", "mcl_mobitems:egg") 
+--minetest.register_alias("mcl_mobitems:egg", "mobs_mc:egg") 
+minetest.register_alias("mcl_mobitems:egg", "mobs_mc:chicken") 
+minetest.register_alias("mobs_mc:porkchop", "mcl_mobitems:porkchop")
+minetest.register_alias("mobs_mc:porkchop_raw", "mcl_mobitems:porkchop")
+minetest.register_alias("mobs_mc:cooked_porkchop", "mcl_mobitems:cooked_porkchop")
+minetest.register_alias("mobs_mc:rabbit", "mcl_mobitems:rabbit")
+minetest.register_alias("mcl_mobitems:rabbit_raw", "mcl_mobitems:rabbit")
+minetest.register_alias("mobs_mc:rabbit_raw", "mcl_mobitems:rabbit")
+minetest.register_alias("mobs_mc:milk_bucket", "mcl_mobitems:milk_bucket")
+minetest.register_alias("mobs_mc:spider_eye", "mcl_mobitems:spider_eye")
+minetest.register_alias("farming:string", "mcl_mobitems:string")
+minetest.register_alias("mobs_mc:bow_wood", "mcl_throwing:bow")
+minetest.register_alias("mobs_mc:blaze_powder", "mcl_mobitems:blaze_powder")
+minetest.register_alias("mobs_mc:magma_cream", "mcl_mobitems:magma_cream")
+minetest.register_alias("mobs_mc:ghast_tear", "mcl_mobitems:ghast_tear")
+minetest.register_alias("mobs_mc:horsepegh1", "mobs_mc:horse")
+minetest.register_alias("mobs_mc:nether_star", "mcl_mobitems:nether_star")
+minetest.register_alias("mobs_mc:leather", "mcl_mobitems:leather")
+minetest.register_alias("mobs_mc:feather", "mcl_mobitems:feather")
+minetest.register_alias("mobs_mc:rabbit_hide", "mcl_mobitems:rabbit_hide")
+minetest.register_alias("mobs_mc:rabbit_foot", "mcl_mobitems:rabbit_foot")
+minetest.register_alias("mobs_mc:rabbit_stew", "mcl_mobitems:rabbit_stew")
+minetest.register_alias("mobs_mc:saddle", "mcl_mobitems:saddle")
+minetest.register_alias("mobs_mc:shulker_shell", "mcl_mobitems:shulker_shell")
+minetest.register_alias("mobs_mc:slimeball", "mcl_mobitems:slimeball")
+minetest.register_alias("mobs_mc:carrot_on_a_stick", "mcl_mobitems:carrot_on_a_stick")
+
+--heads
+minetest.register_alias("mobs_mc:zombie_head", "mcl_heads:zombie")
+minetest.register_alias("mobs_mc:creeper_head", "mcl_heads:creeper")
+minetest.register_alias("mobs_mc:enderman_head", "mcl_heads:steve")
+minetest.register_alias("mobs_mc:ghast_head", "mcl_heads:steve")
+minetest.register_alias("mobs_mc:skeleton_head", "mcl_heads:skeleton")
+minetest.register_alias("mobs_mc:skeleton2_head", "mcl_heads:wither_skeleton")
+minetest.register_alias("mobs_mc:spider_head", "mcl_heads:steve")
+minetest.register_alias("mobs_mc:zombiepig_head", "mcl_heads:zombie_head")
+
+--Mobs Redo
+minetest.register_alias("default:end_rod", "mcl_end:end_rod")
+minetest.register_alias("default:dragon_egg", "mcl_end:dragon_egg")
+minetest.register_alias("mobs:dragon_egg", "mcl_end:dragon_egg")
+minetest.register_alias("mobs:ender_eye", "mcl_end:ender_eye")
+minetest.register_alias("mobs:rotten_flesh", "mcl_mobitems:rotten_flesh")
+minetest.register_alias("mobs:mutton", "mcl_mobitems:mutton")
+minetest.register_alias("mobs:mutton_raw", "mcl_mobitems:mutton")
+minetest.register_alias("mobs:cooked_mutton", "mcl_mobitems:cooked_mutton")
+minetest.register_alias("mobs:mutton_cooked", "mcl_mobitems:cooked_mutton")
+minetest.register_alias("mobs:beef", "mcl_mobitems:cooked_beef")
+minetest.register_alias("mobs:beef_raw", "mcl_mobitems:cooked_beef")
+minetest.register_alias("mobs:meat_raw", "mcl_mobitems:cooked_beef")
+minetest.register_alias("mobs:meat", "mcl_mobitems:cooked_beef")
+minetest.register_alias("mobs:cooked_beef", "mcl_mobitems:cooked_beef")
+minetest.register_alias("mobs:beef_cooked", "mcl_mobitems:cooked_beef")
+minetest.register_alias("mobs:chicken", "mcl_mobitems:chicken")
+minetest.register_alias("mobs_animal:chicken", "mobs_mc:chicken")
+minetest.register_alias("mobs:chicken_egg_fried", "mcl_mobitems:chicken")
+minetest.register_alias("mobs:chicken_raw", "mcl_mobitems:chicken")
+minetest.register_alias("mobs:cooked_chicken", "mcl_mobitems:cooked_chicken")
+minetest.register_alias("mobs:pork_cooked", "mcl_mobitems:porkchop")
+minetest.register_alias("mobs:porkchop", "mcl_mobitems:porkchop")
+minetest.register_alias("mobs:pork_raw", "mcl_mobitems:porkchop")
+minetest.register_alias("mobs:cooked_porkchop", "mcl_mobitems:cooked_porkchop")
+minetest.register_alias("mobs:rabbit", "mcl_mobitems:rabbit")
+minetest.register_alias("mobs:milk_bucket", "mcl_mobitems:milk_bucket")
+minetest.register_alias("mobs:spider_eye", "mcl_mobitems:spider_eye")
+minetest.register_alias("mobs:bone", "mcl_mobitems:bone")
+minetest.register_alias("mobs:bow_wood", "mcl_throwing:bow")
+minetest.register_alias("mobs:string", "mcl_mobitems:string")
+minetest.register_alias("mobs:blaze_powder", "mcl_mobitems:blaze_powder")
+minetest.register_alias("mobs:magma_cream", "mcl_mobitems:magma_cream")
+minetest.register_alias("mobs:ghast_tear", "mcl_mobitems:ghast_tear")
+minetest.register_alias("mobs:nether_star", "mcl_mobitems:nether_star")
+minetest.register_alias("mobs:leather", "mcl_mobitems:leather")
+minetest.register_alias("mobs:feather", "mcl_mobitems:feather")
+minetest.register_alias("mobs:rabbit_hide", "mcl_mobitems:rabbit_hide")
+minetest.register_alias("mobs:rabbit_foot", "mcl_mobitems:rabbit_foot")
+minetest.register_alias("mobs:rabbit_stew", "mcl_mobitems:rabbit_stew")
+minetest.register_alias("mobs_animal:rat", "mcl_mobitems:rabbit_stew")
+minetest.register_alias("mobs:saddle", "mcl_mobitems:saddle")
+minetest.register_alias("mobs:shulker_shell", "mcl_mobitems:shulker_shell")
+minetest.register_alias("mobs:slimeball", "mcl_mobitems:slimeball")
+minetest.register_alias("mobs:carrot_on_a_stick", "mcl_mobitems:carrot_on_a_stick")
+minetest.register_alias("mobs:arrow", "mcl_throwing:arrow")
+minetest.register_alias("mobs:magic_lasso", "mcl_throwing:arrow")
+minetest.register_alias("mobs:net", "mcl_throwing:arrow")
+minetest.register_alias("mobs:egg", "mcl_throwing:egg")
+minetest.register_alias("mobs:cobweb", "mcl_core:cobweb")  --funky
+--minetest.register_alias("mcl_mobitems:egg", "mcl_mobitems:egg")
+minetest.register_alias("mobs:protector", "mcl_throwing:arrow")
+
+
+--esmobs
+minetest.register_alias("esmobs:end_rod", "mcl_end:end_rod")
+minetest.register_alias("esmobs:dragon_egg", "mcl_end:dragon_egg")
+minetest.register_alias("esmobs:dragon_egg", "mcl_end:dragon_egg")
+minetest.register_alias("esmobs:ender_eye", "mcl_end:ender_eye")
+minetest.register_alias("esmobs:rotten_flesh", "mcl_mobitems:rotten_flesh")
+minetest.register_alias("esmobs:mutton", "mcl_mobitems:mutton")
+minetest.register_alias("esmobs:mutton_raw", "mcl_mobitems:mutton")
+minetest.register_alias("esmobs:cooked_mutton", "mcl_mobitems:cooked_mutton")
+minetest.register_alias("esmobs:mutton_cooked", "mcl_mobitems:cooked_mutton")
+minetest.register_alias("esmobs:beef", "mcl_mobitems:cooked_beef")
+minetest.register_alias("esmobs:beef_raw", "mcl_mobitems:cooked_beef")
+minetest.register_alias("esmobs:meat_raw", "mcl_mobitems:cooked_beef")
+minetest.register_alias("esmobs:meat", "mcl_mobitems:cooked_beef")
+minetest.register_alias("esmobs:cooked_beef", "mcl_mobitems:cooked_beef")
+minetest.register_alias("esmobs:beef_cooked", "mcl_mobitems:cooked_beef")
+minetest.register_alias("esmobs:chicken", "mcl_mobitems:chicken")
+minetest.register_alias("esmobs:chicken_egg_fried", "mcl_mobitems:chicken")
+minetest.register_alias("esmobs:chicken_raw", "mcl_mobitems:chicken")
+minetest.register_alias("esmobs:cooked_chicken", "mcl_mobitems:cooked_chicken")
+minetest.register_alias("esmobs:pork_cooked", "mcl_mobitems:porkchop")
+minetest.register_alias("esmobs:porkchop", "mcl_mobitems:porkchop")
+minetest.register_alias("esmobs:pork_raw", "mcl_mobitems:porkchop")
+minetest.register_alias("esmobs:cooked_porkchop", "mcl_mobitems:cooked_porkchop")
+minetest.register_alias("esmobs:rabbit", "mcl_mobitems:rabbit")
+minetest.register_alias("esmobs:milk_bucket", "mcl_mobitems:milk_bucket")
+minetest.register_alias("esmobs:spider_eye", "mcl_mobitems:spider_eye")
+minetest.register_alias("esmobs:bone", "mcl_mobitems:bone")
+minetest.register_alias("esmobs:bow_wood", "mcl_throwing:bow")
+minetest.register_alias("esmobs:string", "mcl_mobitems:string")
+minetest.register_alias("esmobs:blaze_powder", "mcl_mobitems:blaze_powder")
+minetest.register_alias("esmobs:magma_cream", "mcl_mobitems:magma_cream")
+minetest.register_alias("esmobs:ghast_tear", "mcl_mobitems:ghast_tear")
+minetest.register_alias("esmobs:nether_star", "mcl_mobitems:nether_star")
+minetest.register_alias("esmobs:leather", "mcl_mobitems:leather")
+minetest.register_alias("esmobs:feather", "mcl_mobitems:feather")
+minetest.register_alias("esmobs:rabbit_hide", "mcl_mobitems:rabbit_hide")
+minetest.register_alias("esmobs:rabbit_foot", "mcl_mobitems:rabbit_foot")
+minetest.register_alias("esmobs:rabbit_stew", "mcl_mobitems:rabbit_stew")
+minetest.register_alias("esmobs:rat", "mcl_mobitems:rabbit_stew")
+minetest.register_alias("esmobs:saddle", "mcl_mobitems:saddle")
+minetest.register_alias("esmobs:shulker_shell", "mcl_mobitems:shulker_shell")
+minetest.register_alias("esmobs:slimeball", "mcl_mobitems:slimeball")
+minetest.register_alias("esmobs:carrot_on_a_stick", "mcl_mobitems:carrot_on_a_stick")
+minetest.register_alias("esmobs:arrow", "mcl_throwing:arrow")
+minetest.register_alias("esmobs:magic_lasso", "mcl_throwing:arrow")
+minetest.register_alias("esmobs:net", "mcl_throwing:arrow")
+minetest.register_alias("esmobs:egg", "mcl_throwing:egg")
+minetest.register_alias("esmobs:cobweb", "mcl_core:cobweb")  --funky
+minetest.register_alias("esmobs:protector", "mcl_throwing:arrow")
+minetest.register_alias("esmobs:bones", "mcl_chests:chest")
+
diff --git a/mods/MISC/mcl_commands/init.lua b/mods/MISC/mcl_commands/init.lua
index 6c0b0b798..b3041ad06 100644
--- a/mods/MISC/mcl_commands/init.lua
+++ b/mods/MISC/mcl_commands/init.lua
@@ -138,7 +138,7 @@ minetest.register_chatcommand("seed", {
 	params = "",
 	privs = {},
 	func = function(name)
-		minetest.chat_send_player(name, string.format("%d", minetest.get_mapgen_params().seed))
+		minetest.chat_send_player(name, string.format("%d", minetest.get_mapgen_setting("seed")))
 	end
 })
 
diff --git a/mods/MISC/mcl_temp_helper_recipes/depends.txt b/mods/MISC/mcl_temp_helper_recipes/depends.txt
index 7e0cdd5dd..a1ce09984 100644
--- a/mods/MISC/mcl_temp_helper_recipes/depends.txt
+++ b/mods/MISC/mcl_temp_helper_recipes/depends.txt
@@ -1,4 +1,6 @@
 mcl_core
 mcl_mobitems
-mcl_dye
 mcl_end
+mcl_nether
+mcl_ocean
+xpanes
diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua
index 87388b24d..0209f1761 100644
--- a/mods/MISC/mcl_temp_helper_recipes/init.lua
+++ b/mods/MISC/mcl_temp_helper_recipes/init.lua
@@ -18,12 +18,12 @@ minetest.register_craft({
 })
 
 minetest.register_craft({
-	output = "mcl_core:redsand 8",
-	recipe = {
-		{ "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" },
-		{ "mcl_core:sand", "mcl_dye:red", "mcl_core:sand" },
-		{ "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" },
-	}
+	output = "mcl_end:end_stone",
+		recipe = {
+		{ "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" },
+		{ "mcl_core:stone", "mcl_core:sandstone", "mcl_core:stone" },
+		{ "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" },
+	},
 })
 
 minetest.register_craft({
@@ -48,23 +48,6 @@ minetest.register_craft({
 	},
 })
 
-minetest.register_craft({
-	output = "mcl_end:end_stone",
-	recipe = {
-		{ "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" },
-		{ "mcl_core:stone", "mcl_core:sandstone", "mcl_core:stone" },
-		{ "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" },
-	},
-})
-
-minetest.register_craft({
-	output = "mcl_mobitems:blaze_rod",
-	recipe = {
-		 { "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel"},
-		 { "mcl_fire:flint_and_steel", "mcl_core:stick", "mcl_fire:flint_and_steel" },
-		 { "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel"},
-	}
-})
 minetest.register_craft({
 	output = "mcl_mobitems:shulker_shell",
 	recipe = {
@@ -74,15 +57,6 @@ minetest.register_craft({
 	}
 })
 
-minetest.register_craft({
-	output = "mcl_nether:quartz",
-	recipe = {
-		{"group:sand", "group:sand", "group:sand"},
-		{"group:sand", "group:sand", "group:sand"},
-		{"group:sand", "group:sand", "group:sand"},
-	}
-})
-
 minetest.register_craft({
 	output = "mcl_nether:nether_wart_item",
 	recipe = {
@@ -92,30 +66,6 @@ minetest.register_craft({
 	}
 })
 
-minetest.register_craft({
-	type = "shapeless",
-	output = "mcl_nether:netherrack",
-	recipe = {"mcl_core:stone", "group:redsandstone"},
-})
-
-minetest.register_craft({
-	output = "mcl_nether:glowstone_dust",
-	recipe = {
-		{"mcl_torches:torch", "mcl_torches:torch", "mcl_torches:torch",},
-		{"mcl_torches:torch", "mcl_core:coalblock", "mcl_torches:torch",},
-		{"mcl_torches:torch", "mcl_torches:torch", "mcl_torches:torch",},
-	},
-})
-
-minetest.register_craft({
-	output = "mcl_nether:soul_sand",
-	recipe = {
-		{"mcl_core:redsand","mcl_nether:netherrack","mcl_core:redsand"},
-		{"mcl_nether:netherrack","mcl_core:redsand","mcl_nether:netherrack"},
-		{"mcl_core:redsand","mcl_nether:netherrack","mcl_core:redsand"},
-	},
-})
-
 minetest.register_craft({
 	output = "3d_armor:helmet_chain",
 	recipe = {
diff --git a/mods/MISC/mcl_wip/init.lua b/mods/MISC/mcl_wip/init.lua
index bb29c9a65..8ed0d9579 100644
--- a/mods/MISC/mcl_wip/init.lua
+++ b/mods/MISC/mcl_wip/init.lua
@@ -4,7 +4,6 @@ local wip_items = {
 	"mcl_anvils:anvil_damage_2",
 	"mcl_core:darksapling",
 	"mcl_core:apple_gold",
-	"mcl_end:ender_eye",
 	"mcl_end:chorus_fruit",
 	"mcl_end:chorus_flower",
 	"mcl_end:chorus_flower_dead",
@@ -15,7 +14,6 @@ local wip_items = {
 	"gemalde:node_1",
 	"mcl_observers:observer",
 	"mcl_chests:trapped_chest",
-	"mobs_mc:llama",
 	"mobs_mc:totem",
 	"mcl_paintings:painting",
 }
diff --git a/mods/PLAYER/mcl_playerplus/depends.txt b/mods/PLAYER/mcl_playerplus/depends.txt
index 45b93f966..467d9b138 100644
--- a/mods/PLAYER/mcl_playerplus/depends.txt
+++ b/mods/PLAYER/mcl_playerplus/depends.txt
@@ -6,3 +6,4 @@ mcl_hunger
 mcl_death_messages
 mcl_playerinfo
 3d_armor?
+weather_pack
diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua
index 88cae8319..1d4debbf5 100644
--- a/mods/PLAYER/mcl_playerplus/init.lua
+++ b/mods/PLAYER/mcl_playerplus/init.lua
@@ -152,14 +152,22 @@ minetest.register_globalstep(function(dtime)
 		end
 
 		-- Apply black sky in the Void and deal Void damage
-		if pos.y < mcl_vars.mg_bedrock_overworld_max then
-			-- Player reached the void, set black sky box
-			player:set_sky("#000000", "plain", nil, false)
-			-- FIXME: Sky handling in MCL2 is held together with lots of duct tape.
-			-- This only works beause weather_pack currently does not touch the sky for players below the height used for this check.
-			-- There should be a real skybox API.
-		end
 		local void, void_deadly = mcl_util.is_in_void(pos)
+		local _, dim = mcl_util.y_to_layer(pos.y)
+		-- Set dimension skies.
+		-- FIXME: Sky handling in MCL2 is held together with lots of duct tape.
+		-- This only works beause weather_pack currently does not touch the sky for players below the height used for this check.
+		-- There should be a real skybox API.
+		if dim == "void" then
+			player:set_sky("#000000", "plain", nil, false)
+		elseif dim == "end" then
+			local t = "mcl_playerplus_end_sky.png"
+			player:set_sky("#000000", "skybox", {t,t,t,t,t,t}, false)
+		elseif dim == "nether" then
+			player:set_sky("#300808", "plain", nil, false)
+		else
+			skycolor.update_sky_color({player})
+		end
 		if void_deadly then
 			-- Player is deep into the void, deal void damage
 			if player:get_hp() > 0 then
diff --git a/mods/PLAYER/mcl_playerplus/textures/mcl_playerplus_end_sky.png b/mods/PLAYER/mcl_playerplus/textures/mcl_playerplus_end_sky.png
new file mode 100644
index 000000000..e9671f3dc
Binary files /dev/null and b/mods/PLAYER/mcl_playerplus/textures/mcl_playerplus_end_sky.png differ
diff --git a/tools/Texture_Conversion_Table.csv b/tools/Texture_Conversion_Table.csv
index a938e79bc..29cb3ce66 100644
--- a/tools/Texture_Conversion_Table.csv
+++ b/tools/Texture_Conversion_Table.csv
@@ -843,3 +843,6 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt
 /assets/minecraft/textures/entity/banner,base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_base.png,,,,,,
 /assets/minecraft/textures/items,banner_base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_base.png,,,,,,
 /assets/minecraft/textures/items,banner_overlay.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_overlay.png,,,,,,
+/assets/minecraft/textures/blocks,portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_portal.png,,,,,,
+/assets/minecraft/textures/entity,end_portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_end_portal.png,,,,,,
+/assets/minecraft/textures/environment,end_sky.png,/mods/PLAYER/mcl_playerplus/textures,mcl_playerplus_end_sky.png,,,,,,