diff --git a/mods/ITEMS/mcl_mushrooms/huge.lua b/mods/ITEMS/mcl_mushrooms/huge.lua
index 8ecbd2bee..4f8ad38b7 100644
--- a/mods/ITEMS/mcl_mushrooms/huge.lua
+++ b/mods/ITEMS/mcl_mushrooms/huge.lua
@@ -1,5 +1,5 @@
 local template = {
-	groups = {handy=1,axey=1, huge_mushroom = 1, building_block = 1, not_in_creative_inventory = 1, not_in_craft_guide=1, material_wood = 1 },
+	groups = {handy=1,axey=1, building_block = 1, material_wood = 1 },
 	sounds = mcl_sounds.node_sound_wood_defaults(),
 	is_ground_content = true,
 	_mcl_blast_resistance = 1,
@@ -22,82 +22,153 @@ brown.drop = {
 	}
 }
 
-local register_mushroom = function(color, template, d_cap_top, d_cap_side, d_cap_corner, d_stem, d_pores, d_cap_all, d_stem_all, doc_items_entry_name, doc_items_longdesc)
+-- Convert a number to a string with 6 binary digits
+local function to_binary(num)
+	local binary = ""
+	while (num > 0) do
+		local remainder_binary = (num % 2) > 0 and 1 or 0
+		binary = binary .. remainder_binary
+		num = math.floor(num/2)
+	end
+	binary = string.reverse(binary)
+	while (string.len(binary) < 6) do
+		binary = "0" .. binary
+	end
+	return binary
+end
 
-	-- DV (Minecraft dava value) 14: Cap texture on all sides
-	local full = table.copy(template)
-	full.description = d_cap_all
-	full._doc_items_entry_name = doc_items_entry_name
-	full._doc_items_longdesc = doc_items_longdesc
-	full.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png" }
-	minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_full", full)
+local register_mushroom = function(color, species_id, template, d_cap, d_stem, d_stem_all, longdesc_cap, longdesc_stem)
 
-	-- DV 0: Pores on all sides
-	local pores_full = table.copy(template)
-	pores_full.description = d_pores
-	pores_full._doc_items_create_entry = false
-	pores_full.tiles = { "mcl_mushrooms_mushroom_block_inside.png" }
-	minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_pores_full", pores_full)
-
-	-- DV 15: Stem texture on all sides
+	-- Stem texture on all sides
 	local stem_full = table.copy(template)
 	stem_full.description = d_stem_all
-	stem_full._doc_items_create_entry = false
+	stem_full._doc_items_longdesc = "This decorative block is like a huge mushroom stem, but with the stem texture on all sides."
 	stem_full.tiles = { "mcl_mushrooms_mushroom_block_skin_stem.png" }
+	stem_full.groups.huge_mushroom = species_id
+	stem_full.groups.huge_mushroom_stem = 2
 	minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem_full", stem_full)
 
-	-- DV 10: Stem
+	-- Stem
 	local stem = table.copy(template)
 	stem.description = d_stem
-	stem._doc_items_create_entry = false
+	stem._doc_items_longdesc = longdesc_stem
 	stem.tiles = { "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_stem.png" }
+	stem.groups.huge_mushroom = species_id
+	stem.groups.huge_mushroom_stem = 1
 	minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem", stem)
 
-	-- DV 1, DV 3, DV 7, DV 9: Cap corner. Cap texture on top and two sides in a corner formation
-	local cap_corner = table.copy(template)
-	cap_corner.description = d_cap_corner
-	cap_corner._doc_items_create_entry = false
-	cap_corner.paramtype2 = "facedir"
-	cap_corner.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_"..color..".png" }
-	minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_corner", cap_corner)
+	-- Mushroom block (cap)
+	-- Each side can either be the cap or the pores texture.
+	-- Cubes have 6 sides, so there's a total of 2^6 = 64 combinations
+	for s=0,63 do
+		local block = table.copy(template)
+		local bin = to_binary(s)
+		if s == 63 then
+			-- All-faces cap. This block is exposed to the player
+			block.description = d_cap
+			block._doc_items_longdesc = longdesc_cap
+			block._doc_items_uagehelp = "By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently."
+			block.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png" }
 
-	-- DV 5: Cap texture on top
-	local cap_top = table.copy(template)
-	cap_top.description = d_cap_top
-	cap_top._doc_items_create_entry = false
-	cap_top.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png" }
-	minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_top", cap_top)
+			block.on_construct = function(pos)
+				local sides = {
+					{ { x= 0, y= 1, z= 0 }, 2 },
+					{ { x= 0, y=-1, z= 0 }, 1 },
+					{ { x= 1, y= 0, z= 0 }, 4 },
+					{ { x=-1, y= 0, z= 0 }, 3 },
+					{ { x= 0, y= 0, z= 1 }, 6 },
+					{ { x= 0, y= 0, z=-1 }, 5 },
+				}
 
-	-- DV 2, DV 4, DV 6, DV 8: Cap texture on top and one side
-	local cap_side = table.copy(template)
-	cap_side.description = d_cap_side
-	cap_side._doc_items_create_entry = false
-	cap_side.paramtype2 = "facedir"
-	cap_side.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_"..color..".png" }
-	minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_side", cap_side)
+				-- Replace the side of a mushroom node. Returns the new node.
+				-- Or nil, if unchanged.
+				local replace_side = function(pos, node, side)
+					local bin = string.sub(node.name, -6)
+					if string.sub(bin, side, side) == "1" then
+						local new_bin
+						if side == 1 then
+							new_bin = "0" .. string.sub(bin, side+1, 6)
+						elseif side == 6 then
+							new_bin = string.sub(bin, 1, side-1) .. "0"
+						else
+							new_bin = string.sub(bin, 1, side-1) .. "0" .. string.sub(bin, side+1, 6)
+						end
+
+						return { name = string.sub(node.name, 1, -7) .. new_bin }
+					end
+				end
+
+				local node = minetest.get_node(pos)
+				local species_self = minetest.get_item_group(node.name, "huge_mushroom")
+				local node_update = table.copy(node)
+				for i=1, #sides do
+					local neighbor = vector.add(pos, sides[i][1])
+					local neighbor_node = minetest.get_node(neighbor)
+					local node_set = false
+					if minetest.get_item_group(neighbor_node.name, "huge_mushroom_cap") ~= 0 and minetest.get_item_group(neighbor_node.name, "huge_mushroom") == species_self then
+
+						local i2 = sides[i][2]
+						local node_return = replace_side(pos, node_update, i)
+						if node_return then
+							node_update = node_return
+							node_set = true
+						end
+						local new_neighbor = replace_side(neighbor, neighbor_node, i2)
+						if new_neighbor then
+							minetest.set_node(neighbor, new_neighbor)
+						end
+					end
+					if node_set then
+						minetest.set_node(pos, node_update)
+					end
+				end
+			end
+		else
+			-- Cap block with pores on at least 1 side.
+			-- These blocks are used internally.
+			block._doc_items_create_entry = false
+			block.groups.not_in_creative_inventory = 1
+			block.groups.not_in_craft_guide = 1
+			block.tiles = {}
+			for t=1, string.len(bin) do
+				if string.sub(bin, t, t) == "1" then
+					block.tiles[t] = "mcl_mushrooms_mushroom_block_skin_"..color..".png"
+				else
+					block.tiles[t] = "mcl_mushrooms_mushroom_block_inside.png"
+				end
+			end
+
+			if minetest.get_modpath("doc") then
+				doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_111111", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_"..bin)
+			end
+		end
+
+		block.groups.huge_mushroom = species_id
+		block.groups.huge_mushroom_cap = s
+
+		-- bin is a binary string with 6 digits. Each digit stands for the
+		-- texture of one of the sides, in the same order as the tiles parameter.
+		-- 0 = pores; 1 = cap.
+		minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_"..bin, block)
+	end
 
 	-- Add entry aliases for the Help
 	if minetest.get_modpath("doc") then
-		doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_pores_full")
 		doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_stem_full")
 		doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_stem")
-		doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_corner")
-		doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_top")
-		doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_side")
 	end
 
 end
 
-local longdesc_red = "Huge red mushroom blocks are the plant parts of huge red mushrooms. This includes caps, pores and stems of huge red mushrooms; and these blocks come in some variants."
-local entry_name_red = "Huge Red Mushroom Block"
 
-register_mushroom("red", red, "Huge Red Mushroom Cap Top", "Huge Red Mushroom Cap Side", "Huge Red Mushroom Cap Corner", "Huge Red Mushroom Stem", "Huge Red Mushroom Pores", "Huge Red Mushroom All-Faces Cap", "Huge Red Mushroom All-Faces Stem", entry_name_red, longdesc_red)
+local longdesc_red = "Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides."
+local longdesc_red_stem = "The stem part of a huge red mushroom."
+register_mushroom("red", 1, red, "Huge Red Mushroom Block", "Huge Red Mushroom Stem", "Huge Red Mushroom All-Faces Stem", longdesc_red)
 
 
-local longdesc_brown = "Huge brown mushroom blocks are the plant parts of huge brown mushrooms. This includes caps, pores and stems of huge brown mushrooms; and these blocks come in some variants."
-local entry_name_brown = "Huge Brown Mushroom Block"
-
-register_mushroom("brown", brown, "Huge Brown Mushroom Cap Top", "Huge Brown Mushroom Cap Side", "Huge Brown Mushroom Cap Corner", "Huge Brown Mushroom Stem", "Huge Brown Mushroom Pores", "Huge Brown Mushroom All-Faces Cap", "Huge Brown Mushroom All-Faces Stem", entry_name_brown, longdesc_brown)
+local longdesc_brown = "Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides."
+local longdesc_brown_stem = "The stem part of a huge brown mushroom."
+register_mushroom("brown", 2, brown, "Huge Brown Mushroom Block", "Huge Brown Mushroom Stem", "Huge Brown Mushroom All-Faces Stem", longdesc_brown)
 
 minetest.register_craft({
 	type = "fuel",