diff --git a/game/client/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java b/game/client/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
index a1643471c..432b2b662 100644
--- a/game/client/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
+++ b/game/client/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
@@ -59,7 +59,8 @@ public class RichPresenceHandlerThread extends Thread {
         biomeNamesMap.put(Biomes.NETHER_CRYSTAL_PLAINS, "a crystal field");
         biomeNamesMap.put(Biomes.NETHER_SULFUR_POOLS, "the sulfur pools");
         biomeNamesMap.put(Biomes.NETHER_VOLCANIC_ISLANDS, "a volcanic island");
-        biomeNamesMap.put(Biomes.NETHER_OLD_WORLD, "the crag (cold)");
+        biomeNamesMap.put(Biomes.NETHER_OLD_WORLD, "the old world");
+        biomeNamesMap.put(Biomes.NETHER_OLD_WORLD_DESERT, "the old world");
         biomeNamesMap.put(Biomes.NETHER_SHELF, "the shelf");
         biomeNamesMap.put(Biomes.DRIFT_DRIFT, "the skies");
         biomeNamesMap.put(Biomes.OVERWORLD_BIRCH_FOREST, "a birch forest");
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
index c4ca43fcd..6d4620437 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
@@ -93,6 +93,7 @@ public final class BlockModelDispatcher
         addDispatch(new BlockModelGeneric<>(Blocks.SLATE_POLISHED, loadDataModel("minecraft:block/polished_slate")));
         addDispatch(new BlockModelGeneric<>(Blocks.PERMAFROST_POLISHED, loadDataModel("minecraft:block/polished_permafrost")));
         addDispatch(new BlockModelGeneric<>(Blocks.NETHERRACK_POLISHED, loadDataModel("minecraft:block/polished_netherrack")));
+        addDispatch(new BlockModelGeneric<>(Blocks.GLOOMSTONE_POLISHED, loadDataModel("minecraft:block/polished_gloomstone")));
 
         addDispatch(new BlockModelGenericAxis<>(Blocks.PILLAR_MARBLE, loadDataModel("minecraft:block/pillar_marble")));
         addDispatch(new BlockModelGeneric<>(Blocks.CAPSTONE_MARBLE, loadDataModel("minecraft:block/capstone_marble")));
@@ -105,6 +106,7 @@ public final class BlockModelDispatcher
         addDispatch(new BlockModelGeneric<>(Blocks.BASALT_CARVED, loadDataModel("minecraft:block/carved_basalt")));
         addDispatch(new BlockModelGeneric<>(Blocks.PERMAFROST_CARVED, loadDataModel("minecraft:block/carved_permafrost")));
         addDispatch(new BlockModelGeneric<>(Blocks.NETHERRACK_CARVED, loadDataModel("minecraft:block/carved_netherrack")));
+        addDispatch(new BlockModelGeneric<>(Blocks.GLOOMSTONE_CARVED, loadDataModel("minecraft:block/carved_gloomstone")));
 
         addDispatch(new BlockModelGeneric<>(Blocks.PLANKS_OAK, loadDataModel("minecraft:block/planks/oak")));
         addDispatch(new BlockModelGenericPlanksPainted<>(Blocks.PLANKS_OAK_PAINTED, loadDataModel("minecraft:block/planks/white")));
@@ -344,6 +346,8 @@ public final class BlockModelDispatcher
         addDispatch(new BlockModelGeneric<>(Blocks.RUBYGLASS_CIRCUIT, loadDataModel("minecraft:block/rubyglass/circuit")));
 
         addDispatch(new BlockModelGeneric<>(Blocks.ORE_NETHERCOAL_NETHERRACK, loadDataModel("minecraft:block/ore/nethercoal/netherrack")));
+        addDispatch(new BlockModelGeneric<>(Blocks.ORE_NETHERCOAL_BASALT, loadDataModel("minecraft:block/ore/nethercoal/basalt")));
+        addDispatch(new BlockModelGeneric<>(Blocks.ORE_NETHERCOAL_GLOOMSTONE, loadDataModel("minecraft:block/ore/nethercoal/gloomstone")));
 
         addDispatch(new BlockModelGeneric<>(Blocks.BLOCK_COAL, loadDataModel("minecraft:block/block_coal")));
         addDispatch(new BlockModelGeneric<>(Blocks.BLOCK_IRON, loadDataModel("minecraft:block/block_iron")));
@@ -556,6 +560,12 @@ public final class BlockModelDispatcher
 
         addDispatch(new BlockModelGeneric<>(Blocks.GLOOMSTONE, loadDataModel("minecraft:block/gloomstone")));
         addDispatch(new BlockModelGeneric<>(Blocks.COBBLE_GLOOMSTONE, loadDataModel("minecraft:block/cobbled_gloomstone")));
+        addDispatch(new BlockModelGeneric<>(Blocks.BRICK_GLOOMSTONE, loadDataModel("minecraft:block/brick_gloomstone")));
+        addDispatch(new BlockModelGenericSlab<>(Blocks.SLAB_GLOOMSTONE_POLISHED, loadDataModel("minecraft:block/slab/polished_gloomstone/lower"), loadDataModel("minecraft:block/slab/polished_gloomstone/upper"), loadDataModel("minecraft:block/slab/polished_gloomstone/full")));
+        addDispatch(new BlockModelGenericSlab<>(Blocks.SLAB_COBBLE_GLOOMSTONE, loadDataModel("minecraft:block/slab/cobbled_gloomstone/lower"), loadDataModel("minecraft:block/slab/cobbled_gloomstone/upper"), loadDataModel("minecraft:block/slab/cobbled_gloomstone/full")));
+        addDispatch(new BlockModelGenericSlab<>(Blocks.SLAB_BRICK_GLOOMSTONE, loadDataModel("minecraft:block/slab/brick_gloomstone/lower"), loadDataModel("minecraft:block/slab/brick_gloomstone/upper"), loadDataModel("minecraft:block/slab/brick_gloomstone/full")));
+        addDispatch(new BlockModelGenericStairs<>(Blocks.STAIRS_COBBLE_GLOOMSTONE, loadDataModel("minecraft:block/stairs/cobbled_gloomstone")));
+        addDispatch(new BlockModelGenericStairs<>(Blocks.STAIRS_BRICK_GLOOMSTONE, loadDataModel("minecraft:block/stairs/brick_gloomstone")));
     }
 }
 
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/brick_gloomstone.json b/game/client/src/main/resources/assets/minecraft/models/block/brick_gloomstone.json
new file mode 100644
index 000000000..87cb1ce92
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/brick_gloomstone.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/cube_all",
+  "textures": {
+    "all": "minecraft:block/brick_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/carved_gloomstone.json b/game/client/src/main/resources/assets/minecraft/models/block/carved_gloomstone.json
new file mode 100644
index 000000000..8b8ba4d91
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/carved_gloomstone.json
@@ -0,0 +1,7 @@
+{
+	"parent": "minecraft:block/cube_column",
+	"textures": {
+		"end": "minecraft:block/polished_gloomstone_top",
+		"side": "minecraft:block/carved_gloomstone"
+	}
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/ore/nethercoal/basalt.json b/game/client/src/main/resources/assets/minecraft/models/block/ore/nethercoal/basalt.json
new file mode 100644
index 000000000..8ce4383f5
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/ore/nethercoal/basalt.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/cube_all",
+  "textures": {
+    "all": "minecraft:block/ore/nethercoal/basalt"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/ore/nethercoal/gloomstone.json b/game/client/src/main/resources/assets/minecraft/models/block/ore/nethercoal/gloomstone.json
new file mode 100644
index 000000000..1a5ae19c4
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/ore/nethercoal/gloomstone.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/cube_all",
+  "textures": {
+    "all": "minecraft:block/ore/nethercoal/gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/polished_gloomstone.json b/game/client/src/main/resources/assets/minecraft/models/block/polished_gloomstone.json
new file mode 100644
index 000000000..24923618a
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/polished_gloomstone.json
@@ -0,0 +1,7 @@
+{
+	"parent": "minecraft:block/cube_column",
+	"textures": {
+		"end": "minecraft:block/polished_gloomstone_top",
+		"side": "minecraft:block/polished_gloomstone_side"
+	}
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/slab/brick_gloomstone/full.json b/game/client/src/main/resources/assets/minecraft/models/block/slab/brick_gloomstone/full.json
new file mode 100644
index 000000000..87cb1ce92
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/slab/brick_gloomstone/full.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/cube_all",
+  "textures": {
+    "all": "minecraft:block/brick_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/slab/brick_gloomstone/lower.json b/game/client/src/main/resources/assets/minecraft/models/block/slab/brick_gloomstone/lower.json
new file mode 100644
index 000000000..b420156df
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/slab/brick_gloomstone/lower.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/slab/lower",
+  "textures": {
+    "top": "minecraft:block/brick_gloomstone",
+    "bottom": "minecraft:block/brick_gloomstone",
+    "side": "minecraft:block/brick_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/slab/brick_gloomstone/upper.json b/game/client/src/main/resources/assets/minecraft/models/block/slab/brick_gloomstone/upper.json
new file mode 100644
index 000000000..2156b5030
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/slab/brick_gloomstone/upper.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/slab/upper",
+  "textures": {
+    "top": "minecraft:block/brick_gloomstone",
+    "bottom": "minecraft:block/brick_gloomstone",
+    "side": "minecraft:block/brick_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/slab/cobbled_gloomstone/full.json b/game/client/src/main/resources/assets/minecraft/models/block/slab/cobbled_gloomstone/full.json
new file mode 100644
index 000000000..8c546490d
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/slab/cobbled_gloomstone/full.json
@@ -0,0 +1,6 @@
+{
+  "parent": "minecraft:block/cube_all",
+  "textures": {
+    "all": "minecraft:block/cobbled_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/slab/cobbled_gloomstone/lower.json b/game/client/src/main/resources/assets/minecraft/models/block/slab/cobbled_gloomstone/lower.json
new file mode 100644
index 000000000..d6c79ed8d
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/slab/cobbled_gloomstone/lower.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/slab/lower",
+  "textures": {
+    "top": "minecraft:block/cobbled_gloomstone",
+    "bottom": "minecraft:block/cobbled_gloomstone",
+    "side": "minecraft:block/cobbled_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/slab/cobbled_gloomstone/upper.json b/game/client/src/main/resources/assets/minecraft/models/block/slab/cobbled_gloomstone/upper.json
new file mode 100644
index 000000000..ea13c55a3
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/slab/cobbled_gloomstone/upper.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/slab/upper",
+  "textures": {
+    "top": "minecraft:block/cobbled_netherrack",
+    "bottom": "minecraft:block/cobbled_netherrack",
+    "side": "minecraft:block/cobbled_netherrack"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/slab/polished_gloomstone/full.json b/game/client/src/main/resources/assets/minecraft/models/block/slab/polished_gloomstone/full.json
new file mode 100644
index 000000000..547e039a3
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/slab/polished_gloomstone/full.json
@@ -0,0 +1,7 @@
+{
+  "parent": "minecraft:block/cube_column",
+  "textures": {
+    "end": "minecraft:block/polished_gloomstone_top",
+    "side": "minecraft:block/carved_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/slab/polished_gloomstone/lower.json b/game/client/src/main/resources/assets/minecraft/models/block/slab/polished_gloomstone/lower.json
new file mode 100644
index 000000000..7177b9895
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/slab/polished_gloomstone/lower.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/slab/lower",
+  "textures": {
+    "top": "minecraft:block/polished_gloomstone_top",
+    "bottom": "minecraft:block/polished_gloomstone_top",
+    "side": "minecraft:block/carved_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/slab/polished_gloomstone/upper.json b/game/client/src/main/resources/assets/minecraft/models/block/slab/polished_gloomstone/upper.json
new file mode 100644
index 000000000..6bd6673fc
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/slab/polished_gloomstone/upper.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/slab/upper",
+  "textures": {
+    "top": "minecraft:block/polished_gloomstone_top",
+    "bottom": "minecraft:block/polished_gloomstone_top",
+    "side": "minecraft:block/carved_gloomstone"
+  }
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/stairs/brick_gloomstone.json b/game/client/src/main/resources/assets/minecraft/models/block/stairs/brick_gloomstone.json
new file mode 100644
index 000000000..e23ff1bee
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/stairs/brick_gloomstone.json
@@ -0,0 +1,8 @@
+{
+	"parent": "minecraft:block/stairs",
+	"textures": {
+		"top": "minecraft:block/brick_gloomstone",
+		"bottom": "minecraft:block/brick_gloomstone",
+		"side": "minecraft:block/brick_gloomstone"
+	}
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/models/block/stairs/cobbled_gloomstone.json b/game/client/src/main/resources/assets/minecraft/models/block/stairs/cobbled_gloomstone.json
new file mode 100644
index 000000000..813d4bfde
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/models/block/stairs/cobbled_gloomstone.json
@@ -0,0 +1,8 @@
+{
+	"parent": "minecraft:block/stairs",
+	"textures": {
+		"top": "minecraft:block/cobbled_gloomstone",
+		"bottom": "minecraft:block/cobbled_gloomstone",
+		"side": "minecraft:block/cobbled_gloomstone"
+	}
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/brick_gloomstone.png b/game/client/src/main/resources/assets/minecraft/textures/block/brick_gloomstone.png
new file mode 100644
index 000000000..ebaadfd59
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/brick_gloomstone.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/carved_gloomstone.png b/game/client/src/main/resources/assets/minecraft/textures/block/carved_gloomstone.png
new file mode 100644
index 000000000..c2d6487c9
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/carved_gloomstone.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/cobbled_gloomstone.png b/game/client/src/main/resources/assets/minecraft/textures/block/cobbled_gloomstone.png
index 5cb75f869..5a625271c 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/block/cobbled_gloomstone.png and b/game/client/src/main/resources/assets/minecraft/textures/block/cobbled_gloomstone.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/gloomstone.png b/game/client/src/main/resources/assets/minecraft/textures/block/gloomstone.png
index b2086c1d2..f6300545d 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/block/gloomstone.png and b/game/client/src/main/resources/assets/minecraft/textures/block/gloomstone.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/ore/nethercoal/gloomstone.emiss.png b/game/client/src/main/resources/assets/minecraft/textures/block/ore/nethercoal/gloomstone.emiss.png
new file mode 100644
index 000000000..522d504c0
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/ore/nethercoal/gloomstone.emiss.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/ore/nethercoal/gloomstone.png b/game/client/src/main/resources/assets/minecraft/textures/block/ore/nethercoal/gloomstone.png
new file mode 100644
index 000000000..b803ec634
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/ore/nethercoal/gloomstone.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/polished_gloomstone_side.png b/game/client/src/main/resources/assets/minecraft/textures/block/polished_gloomstone_side.png
new file mode 100644
index 000000000..532e9965a
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/polished_gloomstone_side.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/polished_gloomstone_top.png b/game/client/src/main/resources/assets/minecraft/textures/block/polished_gloomstone_top.png
new file mode 100644
index 000000000..ee6982012
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/polished_gloomstone_top.png differ
diff --git a/game/client/src/main/resources/credits.txt b/game/client/src/main/resources/credits.txt
index b75d92c95..c5369ac55 100644
--- a/game/client/src/main/resources/credits.txt
+++ b/game/client/src/main/resources/credits.txt
@@ -21,14 +21,15 @@ Jej Chainstar
 Orknarok_666 (@derperu)
 
 *Community Helpers
-azure (@azurelmao)
 bones (@frazzelbones)
 Crowbar
 Cruxy
+Silveon (sx22.)
 
 *Special Thanks
 AndroidDr (@Pedro270707)
 Astronomical360
+cloud54
 DirtPiper
 Doop (@brokendoop)
 Gungun974
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreNetherCoal.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreNetherCoal.java
index 59693eb10..1133de534 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreNetherCoal.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreNetherCoal.java
@@ -1,6 +1,8 @@
 package net.minecraft.core.block;
 
+import it.unimi.dsi.fastutil.ints.Int2IntArrayMap;
 import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.material.Materials;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Items;
@@ -11,10 +13,12 @@ import org.jetbrains.annotations.Nullable;
 
 public class BlockLogicOreNetherCoal extends BlockLogic
 {
+    public static Int2IntArrayMap variantMap = new Int2IntArrayMap();
 
-    public BlockLogicOreNetherCoal(@NotNull Block<?> block)
+    public BlockLogicOreNetherCoal(@NotNull Block<?> block, @NotNull Block<?> parentBlock, @NotNull Material material)
     {
-        super(block, Materials.NETHERRACK);
+        super(block, material);
+        variantMap.put(parentBlock.id(), block.id());
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/block/Blocks.java b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
index 8f1aca48e..b5b8353c9 100644
--- a/game/core/src/main/java/net/minecraft/core/block/Blocks.java
+++ b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
@@ -74,7 +74,7 @@ public final class Blocks {
         .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT, BlockTags.GROWS_FLOWERS);
     public static final @NotNull Block<?> COBBLE_BASALT = register("cobble.basalt", "minecraft:block/cobble_basalt", 12, (b) -> new BlockLogicCobble(b, Materials.BASALT, () -> Blocks.GRAVEL))
         .withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
-        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT);
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT, BlockTags.NETHER_SURFACE_BLOCK);
     public static final @NotNull Block<?> COBBLE_LIMESTONE = register("cobble.limestone", "minecraft:block/cobble_limestone", 13, (b) -> new BlockLogicCobble(b, Materials.LIMESTONE, () -> Blocks.GRAVEL))
         .withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT);
@@ -123,6 +123,9 @@ public final class Blocks {
     public static final @NotNull Block<?> NETHERRACK_CARVED = register("netherrack.carved", "minecraft:block/netherrack_carved", 45, (b) -> new BlockLogic(b, Materials.NETHERRACK))
         .withSound(BlockSounds.STONE).withHardness(0.4F).withBlastResistance(1F).withDisabledStats()
         .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT);
+    public static final @NotNull Block<?> GLOOMSTONE_CARVED = register("gloomstone.carved", "minecraft:block/gloomstone_carved", 46, (b) -> new BlockLogic(b, Materials.BASALT))
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F).withDisabledStats()
+        .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT);
 
     public static final @NotNull Block<?> PLANKS_OAK = register("planks.oak", "minecraft:block/planks_oak", 50, BlockLogicPlanks::new)
         .withSound(BlockSounds.WOOD).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
@@ -693,9 +696,15 @@ public final class Blocks {
         .withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(5F)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
 
-    public static final @NotNull Block<?> ORE_NETHERCOAL_NETHERRACK = register("ore.nethercoal.netherrack", "minecraft:block/ore_nethercoal_netherrack", 420, BlockLogicOreNetherCoal::new)
+    public static final @NotNull Block<?> ORE_NETHERCOAL_NETHERRACK = register("ore.nethercoal.netherrack", "minecraft:block/ore_nethercoal_netherrack", 420, (b) -> new BlockLogicOreNetherCoal(b, Blocks.COBBLE_NETHERRACK, Materials.NETHERRACK))
+        .withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F).withLightEmission(0.625F)
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NETHER_MOBS_SPAWN);
+    public static final @NotNull Block<?> ORE_NETHERCOAL_BASALT = register("ore.nethercoal.basalt", "minecraft:block/ore_nethercoal_basalt", 421, (b) -> new BlockLogicOreNetherCoal(b, Blocks.COBBLE_BASALT, Materials.BASALT))
         .withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F).withLightEmission(0.625F)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NETHER_MOBS_SPAWN);
+    public static final @NotNull Block<?> ORE_NETHERCOAL_GLOOMSTONE = register("ore.nethercoal.gloomstone", "minecraft:block/ore_nethercoal_gloomstone", 422, (b) -> new BlockLogicOreNetherCoal(b, Blocks.COBBLE_GLOOMSTONE, Materials.BASALT))
+        .withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(10F).withLightEmission(0.625F)
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NETHER_MOBS_SPAWN);
 
     public static final @NotNull Block<?> BLOCK_COAL = register("block.coal", "minecraft:block/block_coal", 430, (b) -> new BlockLogic(b, Materials.STONE))
         .withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.coal)
@@ -1176,6 +1185,9 @@ public final class Blocks {
     public static final @NotNull Block<?> NETHERRACK_POLISHED = register("netherrack.polished", "minecraft:block/netherrack_polished", 866, (b) -> new BlockLogic(b, Materials.NETHERRACK))
             .withSound(BlockSounds.STONE).withHardness(0.4F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT);
+    public static final @NotNull Block<?> GLOOMSTONE_POLISHED = register("gloomstone.polished", "minecraft:block/gloomstone_polished", 867, (b) -> new BlockLogic(b, Materials.GLOOMSTONE))
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10.0f).withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT);
 
     public static final @NotNull Block<?> LANTERN_FIREFLY_GREEN = register("lantern.firefly.green", "minecraft:block/lantern_firefly_green", 870,
         (b) -> new BlockLogicLanternFirefly(b, MobFireflyCluster.FireflyColor.GREEN, () -> Items.LANTERN_FIREFLY_GREEN))
@@ -1309,22 +1321,39 @@ public final class Blocks {
         .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
 
     public static final Block<BlockLogicThermalVent> THERMAL_VENT = register("vent", "minecraft:block/thermal_vent", 1025, BlockLogicThermalVent::new)
-            .withSound(BlockSounds.STONE).withHardness(1.5F).withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withTags(BlockTags.MINEABLE_BY_PICKAXE);
 
     public static final Block<?> BONE_PILE = register("bone_pile", "minecraft:block/bone_pile", 1030, BlockLogicBonepile::new)
-            .withSound(BlockSounds.STONE).withHardness(1.0F).withOverrideColor(MaterialColor.marble)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
+        .withSound(BlockSounds.STONE).withHardness(1.0F).withOverrideColor(MaterialColor.marble)
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
     public static final Block<?> SOULCATCHER = register("soul_catcher", "minecraft:block/soul_catcher", 1031, BlockLogicSoulcatcher::new)
-            .withSound(BlockSounds.GRAVEL).withHardness(1.0F).withOverrideColor(MaterialColor.sand)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
-
-    public static final Block<?> GLOOMSTONE = register("gloomstone", "minecraft:block/gloomstone", 1032, (b) -> new BlockLogicStone(b, Blocks.COBBLE_GLOOMSTONE, Materials.BASALT))
-            .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block<?> COBBLE_GLOOMSTONE = register("cobble.gloomstone", "minecraft:block/cobble_gloomstone", 1033, (b) -> new BlockLogicCobble(b, Materials.BASALT, () -> null))
-            .withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        .withSound(BlockSounds.GRAVEL).withHardness(1.0F).withOverrideColor(MaterialColor.sand)
+        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
 
+    public static final Block<?> GLOOMSTONE = register("gloomstone", "minecraft:block/gloomstone", 1032, (b) -> new BlockLogicStone(b, Blocks.COBBLE_GLOOMSTONE, Materials.GLOOMSTONE))
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+        .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
+    public static final Block<?> COBBLE_GLOOMSTONE = register("cobble.gloomstone", "minecraft:block/cobble_gloomstone", 1033, (b) -> new BlockLogicCobble(b, Materials.GLOOMSTONE, () -> null))
+        .withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    public static final Block<?> BRICK_GLOOMSTONE = register("brick.gloomstone", "minecraft:block/brick_gloomstone", 1034, (b) -> new BlockLogic(b, Materials.GLOOMSTONE))
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    public static final @NotNull Block<BlockLogicSlab> SLAB_GLOOMSTONE_POLISHED = register("slab.gloomstone.carved", "minecraft:block/slab_gloomstone_carved", 1035, (BlockLogicSupplier<BlockLogicSlab>)b -> new BlockLogicSlab(b, Blocks.GLOOMSTONE_CARVED))
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    public static final @NotNull Block<BlockLogicSlab> SLAB_COBBLE_GLOOMSTONE = register("slab.cobble.gloomstone", "minecraft:block/slab_cobble_gloomstone", 1036, (BlockLogicSupplier<BlockLogicSlab>)b -> new BlockLogicSlab(b, Blocks.COBBLE_GLOOMSTONE))
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    public static final @NotNull Block<BlockLogicSlab> SLAB_BRICK_GLOOMSTONE = register("slab.brick.gloomstone", "minecraft:block/slab_brick_gloomstone", 1037, (BlockLogicSupplier<BlockLogicSlab>)b -> new BlockLogicSlab(b, Blocks.BRICK_GLOOMSTONE))
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    public static final @NotNull Block<BlockLogicStairs> STAIRS_COBBLE_GLOOMSTONE = register("stairs.cobble.gloomstone", "minecraft:block/stairs_cobble_gloomstone", 1038, (BlockLogicSupplier<BlockLogicStairs>)b -> new BlockLogicStairs(b, Blocks.COBBLE_GLOOMSTONE))
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F).withLitInteriorSurface(true)
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    public static final @NotNull Block<BlockLogicStairs> STAIRS_BRICK_GLOOMSTONE = register("stairs.brick.gloomstone", "minecraft:block/stairs_brick_gloomstone", 1039, (BlockLogicSupplier<BlockLogicStairs>)b -> new BlockLogicStairs(b, Blocks.BRICK_GLOOMSTONE))
+        .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F).withLitInteriorSurface(true)
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
 
     public static final @NotNull Block<BlockLogic> MATCHER = register("matcher", "minecraft:block/matcher", 1040, (b) -> new BlockLogicMatcher(b, false))
         .withSound(BlockSounds.STONE).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange()
diff --git a/game/core/src/main/java/net/minecraft/core/block/material/MaterialColor.java b/game/core/src/main/java/net/minecraft/core/block/material/MaterialColor.java
index 76abee11c..9084cebd7 100644
--- a/game/core/src/main/java/net/minecraft/core/block/material/MaterialColor.java
+++ b/game/core/src/main/java/net/minecraft/core/block/material/MaterialColor.java
@@ -37,6 +37,7 @@ public class MaterialColor {
     public static final MaterialColor marble = new MaterialColor(18, 0xeaeae0);
     public static final MaterialColor slate = new MaterialColor(19, 0x6e6b93);
     public static final MaterialColor netherrack = new MaterialColor(20, 0x6b1013);
+    public static final MaterialColor gloomstone = new MaterialColor(20, 0x352743);
     public static final MaterialColor brick = new MaterialColor(21, 0x7c4536);
     // <<<<< Stone Colors pallet >>>>>
 
diff --git a/game/core/src/main/java/net/minecraft/core/block/material/Materials.java b/game/core/src/main/java/net/minecraft/core/block/material/Materials.java
index 0ccf6a964..db95717ac 100644
--- a/game/core/src/main/java/net/minecraft/core/block/material/Materials.java
+++ b/game/core/src/main/java/net/minecraft/core/block/material/Materials.java
@@ -15,6 +15,7 @@ public final class Materials {
     public static final @NotNull Material MARBLE = new Material(MaterialColor.marble).setConductivity(Material.LIGHTNING_LIGHT_INSULATOR).setAsStone().notAlwaysDestroyable();
     public static final @NotNull Material SLATE = new Material(MaterialColor.slate).setConductivity(Material.LIGHTNING_LIGHT_INSULATOR).setAsStone().notAlwaysDestroyable();
     public static final @NotNull Material NETHERRACK = new Material(MaterialColor.netherrack).setConductivity(Material.LIGHTNING_LIGHT_INSULATOR).setAsStone().notAlwaysDestroyable();
+    public static final @NotNull Material GLOOMSTONE = new Material(MaterialColor.gloomstone).setConductivity(Material.LIGHTNING_LIGHT_INSULATOR).setAsStone().notAlwaysDestroyable();
     public static final @NotNull Material METAL = new Material(MaterialColor.metal).setConductivity(Material.LIGHTNING_STRONG_CONDUCTOR).setAsMetal().notAlwaysDestroyable();
     public static final @NotNull Material STEEL = new Material(MaterialColor.steel).setConductivity(Material.LIGHTNING_STRONG_CONDUCTOR).setAsMetal().notAlwaysDestroyable();
     public static final @NotNull Material WATER = new MaterialLiquid(MaterialColor.water).setConductivity(Material.LIGHTNING_LIGHT_CONDUCTOR).destroyOnPush();
diff --git a/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java b/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java
index ced3b0458..024efc610 100644
--- a/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java
+++ b/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java
@@ -74,8 +74,8 @@ public class Registries extends Registry<Registry<?>> {
         RECIPE_TYPES.register("minecraft:smelting/blast", RecipeEntryBlastFurnace.class);
         RECIPE_TYPES.register("minecraft:trommeling", RecipeEntryTrommel.class);
 
-        ITEM_GROUPS.register("minecraft:stones", stackListOf(Blocks.STONE, Blocks.BASALT, Blocks.LIMESTONE, Blocks.GRANITE, Blocks.PERMAFROST, Blocks.NETHERRACK));
-        ITEM_GROUPS.register("minecraft:cobblestones", stackListOf(Blocks.COBBLE_STONE, Blocks.COBBLE_BASALT, Blocks.COBBLE_LIMESTONE, Blocks.COBBLE_GRANITE, Blocks.COBBLE_PERMAFROST, Blocks.COBBLE_NETHERRACK));
+        ITEM_GROUPS.register("minecraft:stones", stackListOf(Blocks.STONE, Blocks.BASALT, Blocks.LIMESTONE, Blocks.GRANITE, Blocks.PERMAFROST, Blocks.NETHERRACK, Blocks.GLOOMSTONE));
+        ITEM_GROUPS.register("minecraft:cobblestones", stackListOf(Blocks.COBBLE_STONE, Blocks.COBBLE_BASALT, Blocks.COBBLE_LIMESTONE, Blocks.COBBLE_GRANITE, Blocks.COBBLE_PERMAFROST, Blocks.COBBLE_NETHERRACK, Blocks.COBBLE_GLOOMSTONE));
         ITEM_GROUPS.register("minecraft:grasses", stackListOf(Blocks.GRASS, Blocks.GRASS_RETRO));
         ITEM_GROUPS.register("minecraft:dirt", stackListOf(Blocks.DIRT, Blocks.DIRT_SCORCHED));
         ITEM_GROUPS.register("minecraft:trommel_dirt", stackListOf(Blocks.DIRT, Blocks.DIRT_SCORCHED, Blocks.GRASS, Blocks.GRASS_RETRO, Blocks.GRASS_SCORCHED, Blocks.PATH_DIRT, Blocks.FARMLAND_DIRT));
@@ -88,7 +88,7 @@ public class Registries extends Registry<Registry<?>> {
         ITEM_GROUPS.register("minecraft:lapis_ores", stackListOf(Blocks.ORE_LAPIS_STONE, Blocks.ORE_LAPIS_BASALT, Blocks.ORE_LAPIS_LIMESTONE, Blocks.ORE_LAPIS_GRANITE, Blocks.ORE_LAPIS_PERMAFROST));
         ITEM_GROUPS.register("minecraft:redstone_ores", stackListOf(Blocks.ORE_REDSTONE_STONE, Blocks.ORE_REDSTONE_BASALT, Blocks.ORE_REDSTONE_LIMESTONE, Blocks.ORE_REDSTONE_GRANITE, Blocks.ORE_REDSTONE_PERMAFROST, Blocks.ORE_REDSTONE_GLOWING_STONE, Blocks.ORE_REDSTONE_GLOWING_BASALT, Blocks.ORE_REDSTONE_GLOWING_LIMESTONE, Blocks.ORE_REDSTONE_GLOWING_GRANITE, Blocks.ORE_REDSTONE_GLOWING_PERMAFROST));
         ITEM_GROUPS.register("minecraft:diamond_ores", stackListOf(Blocks.ORE_DIAMOND_STONE, Blocks.ORE_DIAMOND_BASALT, Blocks.ORE_DIAMOND_LIMESTONE, Blocks.ORE_DIAMOND_GRANITE, Blocks.ORE_DIAMOND_PERMAFROST));
-        ITEM_GROUPS.register("minecraft:nethercoal_ores", stackListOf(Blocks.ORE_NETHERCOAL_NETHERRACK));
+        ITEM_GROUPS.register("minecraft:nethercoal_ores", stackListOf(Blocks.ORE_NETHERCOAL_NETHERRACK, Blocks.ORE_NETHERCOAL_BASALT, Blocks.ORE_NETHERCOAL_GLOOMSTONE));
         {
             final List<ItemStack> plankStackList = new ArrayList<>();
             final List<ItemStack> signStackList = new ArrayList<>();
diff --git a/game/core/src/main/java/net/minecraft/core/entity/animal/MobFireflyCluster.java b/game/core/src/main/java/net/minecraft/core/entity/animal/MobFireflyCluster.java
index 34ef4b625..d9e46090b 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/animal/MobFireflyCluster.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/animal/MobFireflyCluster.java
@@ -444,7 +444,8 @@ public class MobFireflyCluster extends MobFlying
             Biomes.NETHER_VOLCANIC_ISLANDS,
             Biomes.NETHER_CRYSTAL_FOREST,
             Biomes.NETHER_CRYSTAL_PLAINS,
-            Biomes.NETHER_OLD_WORLD
+            Biomes.NETHER_OLD_WORLD,
+            Biomes.NETHER_OLD_WORLD_DESERT
         },
             new float[]{1f, 0.25f, 0.25f}));
 
diff --git a/game/core/src/main/java/net/minecraft/core/item/tool/ItemToolPickaxe.java b/game/core/src/main/java/net/minecraft/core/item/tool/ItemToolPickaxe.java
index 6965a15c4..030363c7b 100644
--- a/game/core/src/main/java/net/minecraft/core/item/tool/ItemToolPickaxe.java
+++ b/game/core/src/main/java/net/minecraft/core/item/tool/ItemToolPickaxe.java
@@ -39,7 +39,9 @@ public class ItemToolPickaxe extends ItemTool {
 		miningLevels.put(Blocks.BLOCK_STEEL, 2);
 		
 		miningLevels.put(Blocks.ORE_NETHERCOAL_NETHERRACK, 2);
-		
+		miningLevels.put(Blocks.ORE_NETHERCOAL_BASALT, 2);
+		miningLevels.put(Blocks.ORE_NETHERCOAL_GLOOMSTONE, 2);
+
 		miningLevels.put(Blocks.BLOCK_LAPIS, 1);
 		miningLevels.put(Blocks.ORE_LAPIS_STONE, 1);
 		miningLevels.put(Blocks.ORE_LAPIS_BASALT, 1);
diff --git a/game/core/src/main/java/net/minecraft/core/world/biome/Biomes.java b/game/core/src/main/java/net/minecraft/core/world/biome/Biomes.java
index 14060036b..6553f0b42 100644
--- a/game/core/src/main/java/net/minecraft/core/world/biome/Biomes.java
+++ b/game/core/src/main/java/net/minecraft/core/world/biome/Biomes.java
@@ -266,8 +266,21 @@ public class Biomes {
             .withBlockedWeathers(Weathers.OVERWORLD_RAIN, Weathers.OVERWORLD_SNOW, Weathers.OVERWORLD_STORM, Weathers.OVERWORLD_FOG)
             .withSurfaceProperties(
                 new SurfaceProperties.Builder()
-                    .withTopBlock(Blocks.COBBLE_NETHERRACK)
-                    .withFillerBlock(Blocks.COBBLE_NETHERRACK)
+                    .withTopBlock(Blocks.BLOCK_ASH)
+                    .withFillerBlock(Blocks.BLOCK_ASH)
+                    .build()
+            )
+            .withTags(BiomeTags.HAS_SURFACE_ASH)
+    );
+    public static final @NotNull Biome NETHER_OLD_WORLD_DESERT = register(
+        "minecraft:nether.old_world.desert",
+        new BiomeNether("nether.old_world")
+            .withDebugColor(0x5C_48_43)
+            .withBlockedWeathers(Weathers.OVERWORLD_RAIN, Weathers.OVERWORLD_SNOW, Weathers.OVERWORLD_STORM, Weathers.OVERWORLD_FOG)
+            .withSurfaceProperties(
+                new SurfaceProperties.Builder()
+                    .withTopBlock(Blocks.SOULSAND)
+                    .withFillerBlock(Blocks.SOULSAND)
                     .build()
             )
             .withTags(BiomeTags.HAS_SURFACE_ASH)
diff --git a/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderNether.java b/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderNether.java
index c33818514..4f70f3df6 100644
--- a/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderNether.java
+++ b/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderNether.java
@@ -26,12 +26,18 @@ public final class BiomeProviderNether
 
     private final FractalNoise2D<?> temperatureNoise;
     private final FractalNoise2D<?> fuzzinessNoise;
+    private final FractalNoise2D<?> varietyMap;
 
-    private double temperatureXScale = 0.025;
-    private double temperatureZScale = 0.025;
+    private double temperatureXScale = 0.015;
+    private double temperatureZScale = 0.015;
     private double temperatureLacunarity = 0.3;
     private double temperatureFuzzPercentage = 0.02;
 
+    private double varietyXScale = 0.25;
+    private double varietyZScale = 0.25;
+    private double varietyLacunarity = 0.3;
+    private double varietyNoise = 0.0;
+
     private double fuzzinessXScale = 0.2;
     private double fuzzinessZScale = 0.2;
     private double fuzzinessLacunarity = 0.25;
@@ -43,6 +49,7 @@ public final class BiomeProviderNether
         final long seed = world.getRandomSeed();
         this.temperatureNoise = new FractalNoise3D<>(SimplexNoise.genOctaves(seed * 5345, 4));
         this.fuzzinessNoise = new FractalNoise3D<>(SimplexNoise.genOctaves(seed * 35864, 2));
+        this.varietyMap = new FractalNoise2D<>(SimplexNoise.genOctaves(seed, 4));
     }
 
     @Override
@@ -131,6 +138,8 @@ public final class BiomeProviderNether
                 double valPctg = 1.0 - fuzzPctg;
                 double temperature = (tnResult[dx * zSize + dz] * 0.1 + 0.5) * valPctg + fuzziness * fuzzPctg;
 
+                temperature = temperature * temperature;
+
                 if (temperature < 0.0)
                 {
                     temperature = 0.0;
@@ -158,12 +167,39 @@ public final class BiomeProviderNether
     }
 
     @Override
-    public double[] getVarieties(double[] varieties, int x, int z, int xSize, int zSize) {
+    public double[] getVarieties(double[] varieties, int x, int z, int xSize, int zSize)
+    {
         if (varieties == null || varieties.length < xSize * zSize)
         {
             varieties = new double[xSize * zSize];
         }
 
+        double[] vnResult = varietyMap.setLacunarity(this.varietyLacunarity).getRegion(null, x, z, xSize, zSize, varietyXScale, varietyZScale);
+        double[] fnResult = fuzzinessNoise.setLacunarity(this.fuzzinessLacunarity).getRegion(null, x, z, xSize, zSize, fuzzinessXScale, fuzzinessZScale);
+
+        for (int dx = 0; dx < xSize; dx++)
+        {
+            for (int dz = 0; dz < zSize; dz++)
+            {
+                double fuzziness = fnResult[dx * zSize + dz] * 1.1 + 0.5;
+
+                double fuzzPctg = varietyNoise;
+                double valPctg = 1.0 - fuzzPctg;
+                double variety = (vnResult[dx * zSize + dz] * 0.15 + 0.5) * valPctg + fuzziness * fuzzPctg;
+
+                if (variety < 0.0)
+                {
+                    variety = 0.0;
+                }
+                if (variety > 1.0)
+                {
+                    variety = 1.0;
+                }
+
+                varieties[dx * zSize + dz] = variety;
+            }
+        }
+
         return varieties;
     }
 
@@ -181,13 +217,37 @@ public final class BiomeProviderNether
 
     @Override
     public Biome lookupBiome(double temperature, double humidity, double altitude, double variety) {
-        for (int i = 0; i < BIOMES_ORDER.length; i++) {
-            if (temperature <= (1.0 / BIOMES_ORDER.length) * (i + 1)) {
-                return BIOMES_ORDER[i];
+        if (temperature <= 0.1) {
+            if (variety >= 0.3 && variety <= 0.6) {
+                return Biomes.NETHER_OLD_WORLD_DESERT;
+            }
+            return Biomes.NETHER_OLD_WORLD;
+        }
+
+        if (temperature <= 0.15) {
+            return Biomes.NETHER_CRYSTAL_PLAINS;
+        }
+
+        if (temperature <= 0.3) {
+            if (variety <= 0.3) {
+                return Biomes.NETHER_CRYSTAL_PLAINS;
             }
+            return Biomes.NETHER_CRYSTAL_FOREST;
+        }
+
+        if (temperature <= 0.35) {
+            return Biomes.NETHER_SHELF;
+        }
+
+        if (temperature <= 0.65) {
+            return Biomes.NETHER_CRAG;
+        }
+
+        if (variety <= 0.5) {
+            return Biomes.NETHER_VOLCANIC_ISLANDS;
         }
 
-        return Biomes.NETHER_CRAG;
+        return Biomes.NETHER_SULFUR_POOLS;
     }
 
     public static Biome[] allBiomes() {
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/ChunkDecoratorNether.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/ChunkDecoratorNether.java
index b822bbcb2..425f3f468 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/ChunkDecoratorNether.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/ChunkDecoratorNether.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.world.generate.chunk.perlin.nether;
 
+import net.minecraft.core.block.BlockLogicOreNetherCoal;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
@@ -30,7 +31,7 @@ public class ChunkDecoratorNether
         );
         this.register("minecraft:decoration/nether/default/rubyglass_crystal_ceiling",
                 new ChunkDecorationBuilder(new WorldFeatureRubyglassCrystal(true))
-                        .withBiomeMask(new Biome[]{ Biomes.NETHER_CRYSTAL_FOREST, Biomes.NETHER_CRYSTAL_PLAINS})
+                        .withBiomeMask(new Biome[]{ Biomes.NETHER_CRYSTAL_FOREST})
                         .withPositionSelector(PositionSelectors.UpperHeightRangeUniform)
                         .withPlacementMethod(((feature, world, chunk, random) -> {
                             int x = chunk.pos.x * 16;
@@ -45,7 +46,7 @@ public class ChunkDecoratorNether
 
         this.register("minecraft:decoration/nether/default/rubyglass_crystal_floor",
                 new ChunkDecorationBuilder(new WorldFeatureRubyglassCrystal(false, 25, 50))
-                        .withBiomeMask(new Biome[]{ Biomes.NETHER_CRYSTAL_FOREST, Biomes.NETHER_CRYSTAL_PLAINS})
+                        .withBiomeMask(new Biome[]{ Biomes.NETHER_CRYSTAL_FOREST})
                         .withPositionSelector(PositionSelectors.UpperHeightRangeUniform)
                         .withPlacementMethod(((feature, world, chunk, random) -> {
                             int x = chunk.pos.x * 16;
@@ -121,6 +122,13 @@ public class ChunkDecoratorNether
                         .withPlacementMethod(PlacementMethods.OncePerChunk)
         );
 
+        this.register("minecraft:decoration/nether/default/lava_pool_terrace",
+                new ChunkDecorationBuilder(new WorldFeatureTerrace(Blocks.FLUID_LAVA_STILL, Blocks.COBBLE_BASALT, 4, 4))
+                        .withBiomeMask(new Biome[]{ Biomes.NETHER_VOLCANIC_ISLANDS })
+                        .withPositionSelector(PositionSelectors.MinY)
+                        .withPlacementMethod(PlacementMethods.OncePerChunk)
+        );
+
         this.register("minecraft:decoration/nether/default/sulfur_pool_floor_vent",
                 new ChunkDecorationBuilder(new WorldFeatureFloorVent())
                         .withBiomeMask(new Biome[]{ Biomes.NETHER_SULFUR_POOLS })
@@ -136,13 +144,13 @@ public class ChunkDecoratorNether
         );
 
         this.register("minecraft:decoration/nether/default/nether_coal_ore",
-                new ChunkDecorationBuilder(new WorldFeatureOre(Blocks.ORE_NETHERCOAL_NETHERRACK.id(), 12))
+                new ChunkDecorationBuilder(new WorldFeatureOre(BlockLogicOreNetherCoal.variantMap, 12))
                         .withPositionSelector(PositionSelectors.HeightRangeUniform)
                         .withPlacementMethod(new PlacementMethod.TriesPerChunk(10))
         );
 
         this.register("minecraft:decoration/nether/default/nether_coal_ore_2",
-                new ChunkDecorationBuilder(new WorldFeatureOre(Blocks.ORE_NETHERCOAL_NETHERRACK.id(), 12))
+                new ChunkDecorationBuilder(new WorldFeatureOre(BlockLogicOreNetherCoal.variantMap, 12))
                         .withBiomeMask(new Biome[]{ Biomes.NETHER_VOLCANIC_ISLANDS })
                         .withPositionSelector(PositionSelectors.HeightRangeUniform)
                         .withPlacementMethod(new PlacementMethod.TriesPerChunk(20))
@@ -180,7 +188,7 @@ public class ChunkDecoratorNether
 
         this.register("minecraft:decoration/nether/default/old_world_patch_bone_pile",
                 new ChunkDecorationBuilder(new WorldFeatureNetherPatch(Blocks.BONE_PILE.id()))
-                        .withBiomeMask(new Biome[]{ Biomes.NETHER_OLD_WORLD })
+                        .withBiomeMask(new Biome[]{ Biomes.NETHER_OLD_WORLD, Biomes.NETHER_OLD_WORLD_DESERT })
                         .withPositionSelector(PositionSelectors.HeightRangeUniformFromOcean)
                         .withPlacementMethod(new PlacementMethod.TriesPerChunk(4))
         );
@@ -206,7 +214,7 @@ public class ChunkDecoratorNether
                 }))
                         .withBiomeMask(new Biome[]{ Biomes.NETHER_OLD_WORLD })
                         .withPositionSelector(PositionSelectors.HeightRangeUniformFromOcean)
-                        .withPlacementMethod(new PlacementMethod.TriesPerChunk(6))
+                        .withPlacementMethod(new PlacementMethod.TriesPerChunk(4))
         );
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/SurfaceGeneratorNether.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/SurfaceGeneratorNether.java
index 88b496b5d..9090cd118 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/SurfaceGeneratorNether.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/SurfaceGeneratorNether.java
@@ -20,12 +20,16 @@ public class SurfaceGeneratorNether
 
     private final @NotNull FractalNoise3D<ImprovedPerlinNoise> beachNoise;
     private final @NotNull FractalNoise3D<ImprovedPerlinNoise> soilNoise;
+    private final @NotNull FractalNoise3D<ImprovedPerlinNoise> mainNoise;
+
+    private final boolean generateStoneVariants = true;
 
     public SurfaceGeneratorNether(@NotNull World world) {
         this.world = world;
 
         this.beachNoise = new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 4, 40));
         this.soilNoise = new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 4, 44));
+        this.mainNoise = new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 8, 32));
     }
 
     @Override
@@ -45,12 +49,38 @@ public class SurfaceGeneratorNether
         double[] sandBeachNoise = this.beachNoise.getRegion(null, chunkX * 16, chunkZ * 16, 0.0D, 16, 16, 1, beachScale, beachScale, 1.0D);
         double[] gravelBeachNoise = this.beachNoise.getRegion(null, chunkX * 16, 109.0134D, chunkZ * 16, 16, 1, 16, beachScale, 1.0D, beachScale);
         double[] soilThicknessNoise = this.soilNoise.getRegion(null, chunkX * 16, chunkZ * 16, 0.0D, 16, 16, 1, beachScale * 2D, beachScale * 2D, beachScale * 2D);
+
+        double[] stoneLayerNoiseBasalt = null;
+        double[] stoneLayerNoiseNetherrack = null;
+        double[] stoneLayerNoiseGloomstone = null;
+        if (this.generateStoneVariants) {
+            stoneLayerNoiseBasalt = this.soilNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale * 4D, beachScale * 4D, beachScale * 4D);
+            stoneLayerNoiseNetherrack = this.mainNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale * 4D, beachScale * 4D, beachScale * 4D);
+            stoneLayerNoiseGloomstone = this.beachNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale * 4D, beachScale * 4D, beachScale * 4D);
+        }
         for (int z = 0; z < 16; z++) {
             for (int x = 0; x < 16; x++) {
                 boolean generateSoulSandBeach = sandBeachNoise[z + x * 16] + rand.nextDouble() * 0.2D > 0.0D;
                 boolean generateGravelBeach = gravelBeachNoise[z + x * 16] + rand.nextDouble() * 0.2D > 0.0D;
                 int soilThickness = (int) (soilThicknessNoise[z + x * 16] / 3D + 3D + rand.nextDouble() * 0.25D);
 
+                boolean generateBasaltLayer = false;
+                boolean generateNetherrackLayer = false;
+                boolean generateGloomstoneLayer = false;
+
+                int basaltThicknessLevel = 0;
+                int netherrackThicknessLevel = 0;
+                int gloomstoneThicknessLevel = 0;
+
+                if (this.generateStoneVariants) {
+                    generateBasaltLayer = stoneLayerNoiseBasalt[z + (x * Chunk.CHUNK_SIZE_Z)] + rand.nextDouble() * 0.2D > 0D;
+                    generateNetherrackLayer = stoneLayerNoiseNetherrack[z + (x * Chunk.CHUNK_SIZE_Z)] + rand.nextDouble() * 0.2D > 2D;
+                    generateGloomstoneLayer = stoneLayerNoiseGloomstone[z + (x * Chunk.CHUNK_SIZE_Z)] + rand.nextDouble() * 0.2D > 3D;
+                    basaltThicknessLevel = (int)(stoneLayerNoiseBasalt[z + x] + rand.nextDouble() * 0.5D);
+                    netherrackThicknessLevel = (int)(stoneLayerNoiseNetherrack[z + x] + rand.nextDouble() * 0.5D);
+                    gloomstoneThicknessLevel = (int)(stoneLayerNoiseGloomstone[z + x] + rand.nextDouble() * 0.5D);
+                }
+
                 int currentLayerDepth = -1;
                 short topBlock = -1;
                 short fillerBlock = -1;
@@ -126,6 +156,30 @@ public class SurfaceGeneratorNether
                         continue;
                     }
 
+                    if (this.generateStoneVariants) {
+                        if (currentLayerDepth <= 0) {
+                            if (y >= (minY + basaltThicknessLevel - rand.nextInt(3)) && y <= (maxY - basaltThicknessLevel + rand.nextInt(3))) {
+                                if (generateBasaltLayer) {
+                                    result.setBlock(x, y, z, Blocks.COBBLE_BASALT.id());
+                                    continue;
+                                }
+                            }
+                            if (y >= (minY + netherrackThicknessLevel - rand.nextInt(3)) && y <= (maxY - netherrackThicknessLevel + rand.nextInt(3))) {
+                                if (generateNetherrackLayer) {
+                                    result.setBlock(x, y, z, Blocks.NETHERRACK.id());
+                                    continue;
+                                }
+                            }
+                            if (y >= (minY + gloomstoneThicknessLevel - rand.nextInt(3)) && y <= (maxY - gloomstoneThicknessLevel + rand.nextInt(3))) {
+                                if (generateGloomstoneLayer) {
+                                    result.setBlock(x, y, z, Blocks.COBBLE_GLOOMSTONE.id());
+                                    continue;
+                                }
+                            }
+                            continue;
+                        }
+                    }
+
                     // fill blocks with filler block until current layer level = -1 or air is encountered
                     if (currentLayerDepth > 0) {
                         currentLayerDepth--;
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/TerrainGeneratorNether.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/TerrainGeneratorNether.java
index 8fa73ae04..c21a8e9ad 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/TerrainGeneratorNether.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/TerrainGeneratorNether.java
@@ -45,6 +45,7 @@ public class TerrainGeneratorNether
         this.fluidLookup.put(Biomes.NETHER_CRYSTAL_FOREST, Blocks.FLUID_WATER_STILL.id());
         this.fluidLookup.put(Biomes.NETHER_CRYSTAL_PLAINS, Blocks.FLUID_WATER_STILL.id());
         this.fluidLookup.put(Biomes.NETHER_OLD_WORLD, Blocks.FLUID_WATER_STILL.id());
+        this.fluidLookup.put(Biomes.NETHER_OLD_WORLD_DESERT, Blocks.FLUID_WATER_STILL.id());
 
         this.minY = world.getWorldType().getMinY(world);
         this.maxY = world.getWorldType().getMaxY(world);
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java
index 6b6f8429b..95e4720c9 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java
@@ -68,12 +68,12 @@ public class SurfaceGeneratorOverworld
         double[] gravelBeachNoise = beachNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, 109.0134D, chunkZ * Chunk.CHUNK_SIZE_Z, Chunk.CHUNK_SIZE_X, 1, Chunk.CHUNK_SIZE_Z, beachScale, 1.0D, beachScale);
         double[] soilThicknessNoise = soilNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale * 2D, beachScale * 2D, beachScale * 2D);
 
-        double[] stoneLayerNoise = null;
+        double[] stoneLayerNoiseBasalt = null;
         double[] stoneLayerNoiseGranite = null;
         double[] stoneLayerNoiseLimestone = null;
         if (generateStoneVariants)
         {
-            stoneLayerNoise = soilNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale * 4D, beachScale * 4D, beachScale * 4D);
+            stoneLayerNoiseBasalt = soilNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale * 4D, beachScale * 4D, beachScale * 4D);
             stoneLayerNoiseGranite = mainNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale * 4D, beachScale * 4D, beachScale * 4D);
             stoneLayerNoiseLimestone = beachNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale * 4D, beachScale * 4D, beachScale * 4D);
         }
@@ -96,10 +96,10 @@ public class SurfaceGeneratorOverworld
 
                 if (generateStoneVariants)
                 {
-                    generateBasaltLayer = stoneLayerNoise[z + (x * Chunk.CHUNK_SIZE_Z)] + rand.nextDouble() * 0.2D > 0D;
+                    generateBasaltLayer = stoneLayerNoiseBasalt[z + (x * Chunk.CHUNK_SIZE_Z)] + rand.nextDouble() * 0.2D > 0D;
                     generateGraniteLayer = stoneLayerNoiseGranite[z + (x * Chunk.CHUNK_SIZE_Z)] + rand.nextDouble() * 0.2D > 2D;
                     generateLimestoneLayer = stoneLayerNoiseLimestone[z + (x * Chunk.CHUNK_SIZE_Z)] + rand.nextDouble() * 0.2D > 3D;
-                    basaltThicknessLevel = (int)(stoneLayerNoise[z + x] + rand.nextDouble() * 0.5D);
+                    basaltThicknessLevel = (int)(stoneLayerNoiseBasalt[z + x] + rand.nextDouble() * 0.5D);
                     graniteThicknessLevel = (int)(stoneLayerNoiseGranite[z + x] + rand.nextDouble() * 0.5D);
                     limestoneThicknessLevel = (int)(stoneLayerNoiseLimestone[z + x] + rand.nextDouble() * 0.5D);
                 }
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureTerrace.java b/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureTerrace.java
index 944ddf5ad..7023836ab 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureTerrace.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureTerrace.java
@@ -24,6 +24,14 @@ public class WorldFeatureTerrace extends WorldFeature
         this.radiusMod = 6;
     }
 
+    public WorldFeatureTerrace(@NotNull Block<?> fillBlock, @NotNull Block<?> wallBlock, int minRadius, int radiusMod)
+    {
+        this.fillBlock = fillBlock;
+        this.wallBlock = wallBlock;
+        this.minRadius = minRadius;
+        this.radiusMod = radiusMod;
+    }
+
     @Override
 	public boolean place(World world, Random random, int x, int y, int z)
     {
diff --git a/game/core/src/main/resources/lang/en_US/tile.lang b/game/core/src/main/resources/lang/en_US/tile.lang
index 7afe2806f..5d0c333b1 100644
--- a/game/core/src/main/resources/lang/en_US/tile.lang
+++ b/game/core/src/main/resources/lang/en_US/tile.lang
@@ -52,6 +52,8 @@ tile.permafrost.carved.name=Carved Permafrost
 tile.permafrost.carved.desc=Polished Permafrost with lines hewn through the middle.
 tile.netherrack.carved.name=Carved Netherrack
 tile.netherrack.carved.desc=Polished Netherrack with lines hewn through the middle.
+tile.gloomstone.carved.name=Carved Gloomstone
+tile.gloomstone.carved.desc=Polished Gloomstone with lines hewn through the middle.
 
 tile.planks.oak.name=Wooden Planks
 tile.planks.oak.desc=Processed tree insides.
@@ -648,8 +650,12 @@ tile.ore.diamond.granite.desc=A chunk of diamond embedded in granite.
 tile.ore.diamond.permafrost.name=Permafrost Diamond Ore
 tile.ore.diamond.permafrost.desc=A chunk of diamond embedded in permafrost.
 
-tile.ore.nethercoal.netherrack.name=Nether Coal Ore
-tile.ore.nethercoal.netherrack.desc=A lump of Nether Coal embedded in netherrack.
+tile.ore.nethercoal.netherrack.name=Netherrack Nether Coal Ore
+tile.ore.nethercoal.netherrack.desc=A lump of Nether coal embedded in Netherrack.
+tile.ore.nethercoal.basalt.name=Basalt Nether Coal Ore
+tile.ore.nethercoal.basalt.desc=A lump of Nether coal embedded in basalt.
+tile.ore.nethercoal.gloomstone.name=Gloomstone Nether Coal Ore
+tile.ore.nethercoal.gloomstone.desc=A lump of Nether coal embedded in gloomstone.
 
 tile.block.coal.name=Block of Coal
 tile.block.coal.desc=A solid block of coal.
@@ -664,7 +670,7 @@ tile.block.redstone.desc=A solid block of redstone.
 tile.block.diamond.name=Block of Diamond
 tile.block.diamond.desc=A solid block of diamond. Well done you.
 tile.block.nethercoal.name=Block of Nether Coal
-tile.block.nethercoal.desc=A solid block of Nether Coal.
+tile.block.nethercoal.desc=A solid block of Nether coal.
 tile.block.steel.name=Block of Steel
 tile.block.steel.desc=A solid block of steel.
 tile.block.quartz.name=Block of Quartz
@@ -1044,18 +1050,35 @@ tile.cobble.netherrack.crystalline.desc=Netherrack, covered in a web of Rubyglas
 tile.netherrack.name=Netherrack
 tile.netherrack.desc=Dark red rock, smoothed by heat and time.
 tile.brick.netherrack.name=Netherrack Bricks
-tile.brick.netherrack.desc=Stacked bricks of netherrack.
+tile.brick.netherrack.desc=Stacked bricks of Netherrack.
 tile.slab.netherrack.carved.name=Polished Netherrack Slab
-tile.slab.netherrack.carved.desc=A slab of polished netherrack.
+tile.slab.netherrack.carved.desc=A slab of polished Netherrack.
 tile.slab.cobble.netherrack.name=Cobbled Netherrack Slab
-tile.slab.cobble.netherrack.desc=A slab of cobbled netherrack.
+tile.slab.cobble.netherrack.desc=A slab of cobbled Netherrack.
 tile.slab.brick.netherrack.name=Netherrack Brick Slab
-tile.slab.brick.netherrack.desc=A slab of netherrack bricks.
+tile.slab.brick.netherrack.desc=A slab of Netherrack bricks.
 tile.stairs.cobble.netherrack.name=Cobbled Netherrack Stairs
-tile.stairs.cobble.netherrack.desc=Cobbled netherrack block used for rapid vertical movement.
+tile.stairs.cobble.netherrack.desc=Cobbled Netherrack block used for rapid vertical movement.
 tile.stairs.brick.netherrack.name=Netherrack Brick Stairs
 tile.stairs.brick.netherrack.desc=Netherrack brick block used for rapid vertical movement.
 
+tile.gloomstone.name=Gloomstone
+tile.gloomstone.desc=A purplish rock plucked from the depths of Hell.
+tile.cobble.gloomstone.name=Cobbled Gloomstone
+tile.cobble.gloomstone.desc=Gloomstone, smashed apart and reconstituted.
+tile.brick.gloomstone.name=Gloomstone Bricks
+tile.brick.gloomstone.desc=Stacked bricks of gloomstone.
+tile.slab.gloomstone.carved.name=Polished Gloomstone Slab
+tile.slab.gloomstone.carved.desc=A slab of polished gloomstone.
+tile.slab.cobble.gloomstone.name=Cobbled Gloomstone Slab
+tile.slab.cobble.gloomstone.desc=A slab of cobbled gloomstone.
+tile.slab.brick.gloomstone.name=Gloomstone Brick Slab
+tile.slab.brick.gloomstone.desc=A slab of gloomstone bricks.
+tile.stairs.cobble.gloomstone.name=Cobbled Gloomstone Stairs
+tile.stairs.cobble.gloomstone.desc=Cobbled gloomstone block used for rapid vertical movement.
+tile.stairs.brick.gloomstone.name=Gloomstone Brick Stairs
+tile.stairs.brick.gloomstone.desc=gloomstone brick block used for rapid vertical movement.
+
 tile.soulsand.name=Soul Sand
 tile.soulsand.desc=Finely grained ancient bones. The weight of their sins slows you down.
 tile.soulschist.name=Soul Schist
@@ -1227,7 +1250,9 @@ tile.slate.polished.desc=A polished block of slate.
 tile.permafrost.polished.name=Polished Permafrost
 tile.permafrost.polished.desc=A polished block of permafrost.
 tile.netherrack.polished.name=Polished Netherrack
-tile.netherrack.polished.desc=A polished block of netherrack.
+tile.netherrack.polished.desc=A polished block of Netherrack.
+tile.gloomstone.polished.name=Polished Gloomstone
+tile.gloomstone.polished.desc=A polished block of gloomstone.
 
 tile.candle.wax.soul.name=Soul Wax Candle
 tile.candle.wax.soul.desc=A waxy brown candle that glows with an unnatural light.
diff --git a/util/datagen/src/main/java/net/minecraft/datagen/SmeltingGenerator.java b/util/datagen/src/main/java/net/minecraft/datagen/SmeltingGenerator.java
index 659bd230e..5c4ecdee4 100644
--- a/util/datagen/src/main/java/net/minecraft/datagen/SmeltingGenerator.java
+++ b/util/datagen/src/main/java/net/minecraft/datagen/SmeltingGenerator.java
@@ -40,6 +40,7 @@ public class SmeltingGenerator {
         furnaceRecipe("cobble_limestone_to_limestone", Blocks.COBBLE_LIMESTONE.getDefaultStack(), Blocks.LIMESTONE.getDefaultStack());
         furnaceRecipe("cobble_netherrack_to_netherrack", Blocks.COBBLE_NETHERRACK.getDefaultStack(), Blocks.NETHERRACK.getDefaultStack());
         furnaceRecipe("cobble_permafrost_to_permafrost", Blocks.COBBLE_PERMAFROST.getDefaultStack(), Blocks.PERMAFROST.getDefaultStack());
+        furnaceRecipe("cobble_gloomstone_to_gloomstone", Blocks.COBBLE_GLOOMSTONE.getDefaultStack(), Blocks.GLOOMSTONE.getDefaultStack());
 
         blastRecipe("cobble_basalt_to_olivine", Blocks.COBBLE_BASALT.getDefaultStack(), Items.OLIVINE.getDefaultStack());
         blastRecipe("cobble_granite_to_quartz", Blocks.COBBLE_GRANITE.getDefaultStack(), Items.QUARTZ.getDefaultStack());
diff --git a/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java b/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
index dc58f9edd..c498bb641 100644
--- a/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
+++ b/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
@@ -754,6 +754,7 @@ class WorkbenchGenerator {
         bricks.addInput('X', Blocks.SLATE).create("slate_bricks", new ItemStack(Blocks.BRICK_SLATE, stackSize));
         bricks.addInput('X', Blocks.PERMAFROST).create("permafrost_bricks", new ItemStack(Blocks.BRICK_PERMAFROST, stackSize));
         bricks.addInput('X', Blocks.NETHERRACK).create("netherrack_bricks", new ItemStack(Blocks.BRICK_NETHERRACK, stackSize));
+        bricks.addInput('X', Blocks.GLOOMSTONE).create("gloomstone_bricks", new ItemStack(Blocks.BRICK_GLOOMSTONE, stackSize));
         bricks.addInput('X', Blocks.STONE_POLISHED).create("polished_stone_bricks", new ItemStack(Blocks.BRICK_STONE_POLISHED, stackSize));
     }
 
@@ -777,6 +778,7 @@ class WorkbenchGenerator {
         slabs.addInput('X', Blocks.COBBLE_LIMESTONE).create("cobbled_limestone_slab", new ItemStack(Blocks.SLAB_COBBLE_LIMESTONE, stackSize));
         slabs.addInput('X', Blocks.COBBLE_PERMAFROST).create("cobbled_permafrost_slab", new ItemStack(Blocks.SLAB_COBBLE_PERMAFROST, stackSize));
         slabs.addInput('X', Blocks.COBBLE_NETHERRACK).create("cobbled_netherrack_slab", new ItemStack(Blocks.SLAB_COBBLE_NETHERRACK, stackSize));
+        slabs.addInput('X', Blocks.COBBLE_GLOOMSTONE).create("cobbled_gloomstone_slab", new ItemStack(Blocks.SLAB_COBBLE_GLOOMSTONE, stackSize));
 
         slabs.addInput('X', Blocks.MARBLE).create("marble_slab", new ItemStack(Blocks.SLAB_CAPSTONE_MARBLE, stackSize));
         slabs.addInput('X', Blocks.STONE_POLISHED).create("polished_stone_slab", new ItemStack(Blocks.SLAB_STONE_POLISHED, stackSize));
@@ -786,6 +788,7 @@ class WorkbenchGenerator {
         slabs.addInput('X', Blocks.LIMESTONE_POLISHED).create("polished_limestone_slab", new ItemStack(Blocks.SLAB_LIMESTONE_POLISHED, stackSize));
         slabs.addInput('X', Blocks.PERMAFROST_POLISHED).create("polished_permafrost_slab", new ItemStack(Blocks.SLAB_PERMAFROST_POLISHED, stackSize));
         slabs.addInput('X', Blocks.NETHERRACK_POLISHED).create("polished_netherrack_slab", new ItemStack(Blocks.SLAB_NETHERRACK_POLISHED, stackSize));
+        slabs.addInput('X', Blocks.GLOOMSTONE_POLISHED).create("polished_gloomstone_slab", new ItemStack(Blocks.SLAB_GLOOMSTONE_POLISHED, stackSize));
 
         slabs.addInput('X', Blocks.BRICK_MARBLE).create("marble_brick_slab", new ItemStack(Blocks.SLAB_BRICK_MARBLE, stackSize));
         slabs.addInput('X', Blocks.BRICK_STONE).create("stone_brick_slab", new ItemStack(Blocks.SLAB_BRICK_STONE, stackSize));
@@ -797,6 +800,7 @@ class WorkbenchGenerator {
         slabs.addInput('X', Blocks.BRICK_SANDSTONE).create("brick_sandstone_slab", new ItemStack(Blocks.SLAB_BRICK_SANDSTONE, stackSize));
         slabs.addInput('X', Blocks.BRICK_PERMAFROST).create("brick_permafrost_slab", new ItemStack(Blocks.SLAB_BRICK_PERMAFROST, stackSize));
         slabs.addInput('X', Blocks.BRICK_NETHERRACK).create("netherrack_brick_slab", new ItemStack(Blocks.SLAB_BRICK_NETHERRACK, stackSize));
+        slabs.addInput('X', Blocks.BRICK_GLOOMSTONE).create("gloomstone_brick_slab", new ItemStack(Blocks.SLAB_BRICK_GLOOMSTONE, stackSize));
 
         slabs.addInput('X', Blocks.BRICK_IRON).create("iron_brick_slab", new ItemStack(Blocks.SLAB_BRICK_IRON, stackSize));
         slabs.addInput('X', Blocks.BRICK_GOLD).create("gold_brick_slab", new ItemStack(Blocks.SLAB_BRICK_GOLD, stackSize));
@@ -828,6 +832,7 @@ class WorkbenchGenerator {
         stairs.addInput('X', Blocks.COBBLE_LIMESTONE).create("cobbled_limestone_stairs", new ItemStack(Blocks.STAIRS_COBBLE_LIMESTONE, stackSize));
         stairs.addInput('X', Blocks.COBBLE_PERMAFROST).create("cobbled_permafrost_stairs", new ItemStack(Blocks.STAIRS_COBBLE_PERMAFROST, stackSize));
         stairs.addInput('X', Blocks.COBBLE_NETHERRACK).create("cobbled_netherrack_stairs", new ItemStack(Blocks.STAIRS_COBBLE_NETHERRACK, stackSize));
+        stairs.addInput('X', Blocks.COBBLE_GLOOMSTONE).create("cobbled_gloomstone_stairs", new ItemStack(Blocks.STAIRS_COBBLE_GLOOMSTONE, stackSize));
 
         stairs.addInput('X', Blocks.BRICK_STONE_POLISHED).create("polished_stone_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_STONE_POLISHED, stackSize));
 
@@ -841,6 +846,7 @@ class WorkbenchGenerator {
         stairs.addInput('X', Blocks.BRICK_SANDSTONE).create("brick_sandstone_stairs", new ItemStack(Blocks.STAIRS_BRICK_SANDSTONE, stackSize));
         stairs.addInput('X', Blocks.BRICK_PERMAFROST).create("brick_permafrost_stairs", new ItemStack(Blocks.STAIRS_BRICK_PERMAFROST, stackSize));
         stairs.addInput('X', Blocks.BRICK_NETHERRACK).create("netherrack_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_NETHERRACK, stackSize));
+        stairs.addInput('X', Blocks.BRICK_GLOOMSTONE).create("gloomstone_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_GLOOMSTONE, stackSize));
 
         stairs.addInput('X', Blocks.BRICK_IRON).create("iron_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_IRON, stackSize));
         stairs.addInput('X', Blocks.BRICK_GOLD).create("gold_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_GOLD, stackSize));
@@ -978,6 +984,7 @@ class WorkbenchGenerator {
         shape.addInput('#', Blocks.SLATE).create(String.format(format, "slate"), new ItemStack(Blocks.SLATE_POLISHED, stackSize));
         shape.addInput('#', Blocks.PERMAFROST).create(String.format(format, "permafrost"), new ItemStack(Blocks.PERMAFROST_POLISHED, stackSize));
         shape.addInput('#', Blocks.NETHERRACK).create(String.format(format, "netherrack"), new ItemStack(Blocks.NETHERRACK_POLISHED, stackSize));
+        shape.addInput('#', Blocks.GLOOMSTONE).create(String.format(format, "gloomstone"), new ItemStack(Blocks.GLOOMSTONE_POLISHED, stackSize));
     }
 
     private static void generateInformationals() {
