diff --git a/.gitignore b/.gitignore
index da66d74a9..ec4326404 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,4 @@ src/main/java/net/minecraft/core/Version.java
 BiomeLookup.png
 version.txt
 log4j.properties
+/generated/
diff --git a/src/common/resources/recipes/blast_furnace.json b/src/common/resources/recipes/blast_furnace.json
index f32be60b4..7c451a3d8 100644
--- a/src/common/resources/recipes/blast_furnace.json
+++ b/src/common/resources/recipes/blast_furnace.json
@@ -1,322 +1,253 @@
 [
-    {
-        "name": "minecraft:blast_furnace/iron_ingot_to_crude_steel",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 16393,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16499,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/cobble_basalt_to_olivine",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 12,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16513,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/cobble_granite_to_quartz",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 14,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16512,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/cobble_stone_to_slate",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 10,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 6,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/sand_to_glass",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 250,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 190,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/coal_ores_to_coal",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "group": "minecraft:coal_ores"
-        },
-        "output": {
-            "id": 16391,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/gold_ores_to_gold_ingot",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "group": "minecraft:gold_ores"
-        },
-        "output": {
-            "id": 16394,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/diamond_ores_to_diamond",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "group": "minecraft:diamond_ores"
-        },
-        "output": {
-            "id": 16392,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/redstone_ores_to_redstone_dust",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "group": "minecraft:redstone_ores"
-        },
-        "output": {
-            "id": 16459,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/lapis_ores_to_lapis_lazuli",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "group": "minecraft:lapis_ores"
-        },
-        "output": {
-            "id": 16479,
-            "amount": 1,
-            "meta": 4
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/nethercoal_ores_to_nethercoal",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "group": "minecraft:nethercoal_ores"
-        },
-        "output": {
-            "id": 16488,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/cobble_limestone_to_marble",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 13,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 5,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/clay_to_brick_clay",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 16465,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16464,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/cactus_to_cactus_green",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 750,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16479,
-            "amount": 1,
-            "meta": 2
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/logs_to_charcoal",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "group": "minecraft:logs"
-        },
-        "output": {
-            "id": 16391,
-            "amount": 1,
-            "meta": 1
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/iron_ores_to_iron_ingot",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "group": "minecraft:iron_ores"
-        },
-        "output": {
-            "id": 16393,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/sponge_wet_to_sponge_dry",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 231,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 230,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/raw_iron_to_iron_ingot",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 16511,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16393,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/raw_gold_to_gold_ingot",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 16510,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16394,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/mud_to_baked_mud",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 225,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 226,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/cobble_permafrost_to_permafrost",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 15,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 7,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:blast_furnace/block_sugarcane_to_block_sugarcane_baked",
-        "type": "minecraft:smelting/blast",
-        "input": {
-            "stack": {
-                "id": 771,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 772,
-            "amount": 1,
-            "meta": 0
-        }
+  {
+    "name": "minecraft:blast_furnace/block_sugarcane_to_block_sugarcane_baked",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/block_sugarcane"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/block_sugarcane_baked"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/cactus_to_cactus_green",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cactus"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/dye",
+      "meta": 2
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/clay_to_brick_clay",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:item/clay"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/brick_clay"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/coal_ores_to_coal",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "group": "minecraft:coal_ores"
+    },
+    "output": {
+      "id": "minecraft:item/coal"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/cobble_basalt_to_olivine",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_basalt"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/olivine"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/cobble_granite_to_quartz",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_granite"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/quartz"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/cobble_limestone_to_marble",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_limestone"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/marble"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/cobble_permafrost_to_permafrost",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_permafrost"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/permafrost"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/cobble_stone_to_slate",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_stone"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/slate"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/diamond_ores_to_diamond",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "group": "minecraft:diamond_ores"
+    },
+    "output": {
+      "id": "minecraft:item/diamond"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/gold_ores_to_gold_ingot",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "group": "minecraft:gold_ores"
+    },
+    "output": {
+      "id": "minecraft:item/ingot_gold"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/iron_ingot_to_crude_steel",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:item/ingot_iron"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/ingot_steel_crude"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/iron_ores_to_iron_ingot",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "group": "minecraft:iron_ores"
+    },
+    "output": {
+      "id": "minecraft:item/ingot_iron"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/lapis_ores_to_lapis_lazuli",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "group": "minecraft:lapis_ores"
+    },
+    "output": {
+      "id": "minecraft:item/dye",
+      "meta": 4
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/logs_to_charcoal",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "group": "minecraft:logs"
+    },
+    "output": {
+      "id": "minecraft:item/coal",
+      "meta": 1
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/mud_to_baked_mud",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/mud"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/mud_baked"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/nethercoal_ores_to_nethercoal",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "group": "minecraft:nethercoal_ores"
+    },
+    "output": {
+      "id": "minecraft:item/nethercoal"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/raw_gold_to_gold_ingot",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:item/ore_raw_gold"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/ingot_gold"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/raw_iron_to_iron_ingot",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:item/ore_raw_iron"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/ingot_iron"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/redstone_ores_to_redstone_dust",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "group": "minecraft:redstone_ores"
+    },
+    "output": {
+      "id": "minecraft:item/dust_redstone"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/sand_to_glass",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/sand"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/glass"
+    }
+  },
+  {
+    "name": "minecraft:blast_furnace/sponge_wet_to_sponge_dry",
+    "type": "minecraft:smelting/blast",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/sponge_wet"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/sponge_dry"
     }
+  }
 ]
\ No newline at end of file
diff --git a/src/common/resources/recipes/furnace.json b/src/common/resources/recipes/furnace.json
index 7077421b1..dce4d83cd 100644
--- a/src/common/resources/recipes/furnace.json
+++ b/src/common/resources/recipes/furnace.json
@@ -1,354 +1,277 @@
-[
-    {
-        "name": "minecraft:furnace/coal_ores_to_coal",
-        "type": "minecraft:smelting",
-        "input": {
-            "group": "minecraft:coal_ores"
-        },
-        "output": {
-            "id": 16391,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/gold_ores_to_gold_ingot",
-        "type": "minecraft:smelting",
-        "input": {
-            "group": "minecraft:gold_ores"
-        },
-        "output": {
-            "id": 16394,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/diamond_ores_to_diamond",
-        "type": "minecraft:smelting",
-        "input": {
-            "group": "minecraft:diamond_ores"
-        },
-        "output": {
-            "id": 16392,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/redstone_ores_to_redstone_dust",
-        "type": "minecraft:smelting",
-        "input": {
-            "group": "minecraft:redstone_ores"
-        },
-        "output": {
-            "id": 16459,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/lapis_ores_to_lapis_lazuli",
-        "type": "minecraft:smelting",
-        "input": {
-            "group": "minecraft:lapis_ores"
-        },
-        "output": {
-            "id": 16479,
-            "amount": 1,
-            "meta": 4
-        }
-    },
-    {
-        "name": "minecraft:furnace/nethercoal_ores_to_nethercoal",
-        "type": "minecraft:smelting",
-        "input": {
-            "group": "minecraft:nethercoal_ores"
-        },
-        "output": {
-            "id": 16488,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/sand_to_glass",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 250,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 190,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/porkchop_raw_to_porkchop_cooked",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 16447,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16448,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/fish_raw_to_fish_cooked",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 16477,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16478,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/cobble_stone_to_stone",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 10,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 1,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/cobble_basalt_to_basalt",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 12,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 2,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/cobble_limestone_to_limestone",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 13,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 3,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/cobble_granite_to_granite",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 14,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 4,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/clay_to_brick_clay",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 16465,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16464,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/cactus_to_cactus_green",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 750,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16479,
-            "amount": 1,
-            "meta": 2
-        }
-    },
-    {
-        "name": "minecraft:furnace/logs_to_charcoal",
-        "type": "minecraft:smelting",
-        "input": {
-            "group": "minecraft:logs"
-        },
-        "output": {
-            "id": 16391,
-            "amount": 1,
-            "meta": 1
-        }
-    },
-    {
-        "name": "minecraft:furnace/iron_ores_to_iron_ingot",
-        "type": "minecraft:smelting",
-        "input": {
-            "group": "minecraft:iron_ores"
-        },
-        "output": {
-            "id": 16393,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/sponge_wet_to_sponge_dry",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 231,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 230,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/raw_iron_to_iron_ingot",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 16511,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16393,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/raw_gold_to_gold_ingot",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 16510,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 16394,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/mud_to_baked_mud",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 225,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 226,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/cobble_permafrost_to_permafrost",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 15,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 7,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/block_sugarcane_to_block_sugarcane_baked",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 771,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 772,
-            "amount": 1,
-            "meta": 0
-        }
-    },
-    {
-        "name": "minecraft:furnace/cobble_netherrack_to_netherrack",
-        "type": "minecraft:smelting",
-        "input": {
-            "stack": {
-                "id": 800,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "output": {
-            "id": 803,
-            "amount": 1,
-            "meta": 0
-        }
-    }
+[
+  {
+    "name": "minecraft:furnace/block_sugarcane_to_block_sugarcane_baked",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/block_sugarcane"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/block_sugarcane_baked"
+    }
+  },
+  {
+    "name": "minecraft:furnace/cactus_to_cactus_green",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cactus"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/dye",
+      "meta": 2
+    }
+  },
+  {
+    "name": "minecraft:furnace/clay_to_brick_clay",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:item/clay"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/brick_clay"
+    }
+  },
+  {
+    "name": "minecraft:furnace/coal_ores_to_coal",
+    "type": "minecraft:smelting",
+    "input": {
+      "group": "minecraft:coal_ores"
+    },
+    "output": {
+      "id": "minecraft:item/coal"
+    }
+  },
+  {
+    "name": "minecraft:furnace/cobble_basalt_to_basalt",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_basalt"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/basalt"
+    }
+  },
+  {
+    "name": "minecraft:furnace/cobble_granite_to_granite",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_granite"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/granite"
+    }
+  },
+  {
+    "name": "minecraft:furnace/cobble_limestone_to_limestone",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_limestone"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/limestone"
+    }
+  },
+  {
+    "name": "minecraft:furnace/cobble_netherrack_to_netherrack",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_netherrack"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/netherrack"
+    }
+  },
+  {
+    "name": "minecraft:furnace/cobble_permafrost_to_permafrost",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_permafrost"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/permafrost"
+    }
+  },
+  {
+    "name": "minecraft:furnace/cobble_stone_to_stone",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/cobble_stone"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/stone"
+    }
+  },
+  {
+    "name": "minecraft:furnace/diamond_ores_to_diamond",
+    "type": "minecraft:smelting",
+    "input": {
+      "group": "minecraft:diamond_ores"
+    },
+    "output": {
+      "id": "minecraft:item/diamond"
+    }
+  },
+  {
+    "name": "minecraft:furnace/fish_raw_to_fish_cooked",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:item/food_fish_raw"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/food_fish_cooked"
+    }
+  },
+  {
+    "name": "minecraft:furnace/gold_ores_to_gold_ingot",
+    "type": "minecraft:smelting",
+    "input": {
+      "group": "minecraft:gold_ores"
+    },
+    "output": {
+      "id": "minecraft:item/ingot_gold"
+    }
+  },
+  {
+    "name": "minecraft:furnace/iron_ores_to_iron_ingot",
+    "type": "minecraft:smelting",
+    "input": {
+      "group": "minecraft:iron_ores"
+    },
+    "output": {
+      "id": "minecraft:item/ingot_iron"
+    }
+  },
+  {
+    "name": "minecraft:furnace/lapis_ores_to_lapis_lazuli",
+    "type": "minecraft:smelting",
+    "input": {
+      "group": "minecraft:lapis_ores"
+    },
+    "output": {
+      "id": "minecraft:item/dye",
+      "meta": 4
+    }
+  },
+  {
+    "name": "minecraft:furnace/logs_to_charcoal",
+    "type": "minecraft:smelting",
+    "input": {
+      "group": "minecraft:logs"
+    },
+    "output": {
+      "id": "minecraft:item/coal",
+      "meta": 1
+    }
+  },
+  {
+    "name": "minecraft:furnace/mud_to_baked_mud",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/mud"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/mud_baked"
+    }
+  },
+  {
+    "name": "minecraft:furnace/nethercoal_ores_to_nethercoal",
+    "type": "minecraft:smelting",
+    "input": {
+      "group": "minecraft:nethercoal_ores"
+    },
+    "output": {
+      "id": "minecraft:item/nethercoal"
+    }
+  },
+  {
+    "name": "minecraft:furnace/porkchop_raw_to_porkchop_cooked",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:item/food_porkchop_raw"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/food_porkchop_cooked"
+    }
+  },
+  {
+    "name": "minecraft:furnace/raw_gold_to_gold_ingot",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:item/ore_raw_gold"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/ingot_gold"
+    }
+  },
+  {
+    "name": "minecraft:furnace/raw_iron_to_iron_ingot",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:item/ore_raw_iron"
+      }
+    },
+    "output": {
+      "id": "minecraft:item/ingot_iron"
+    }
+  },
+  {
+    "name": "minecraft:furnace/redstone_ores_to_redstone_dust",
+    "type": "minecraft:smelting",
+    "input": {
+      "group": "minecraft:redstone_ores"
+    },
+    "output": {
+      "id": "minecraft:item/dust_redstone"
+    }
+  },
+  {
+    "name": "minecraft:furnace/sand_to_glass",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/sand"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/glass"
+    }
+  },
+  {
+    "name": "minecraft:furnace/sponge_wet_to_sponge_dry",
+    "type": "minecraft:smelting",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/sponge_wet"
+      }
+    },
+    "output": {
+      "id": "minecraft:block/sponge_dry"
+    }
+  }
 ]
\ No newline at end of file
diff --git a/src/common/resources/recipes/trommel.json b/src/common/resources/recipes/trommel.json
index bbcabd0b2..a36fe4a57 100644
--- a/src/common/resources/recipes/trommel.json
+++ b/src/common/resources/recipes/trommel.json
@@ -1,661 +1,573 @@
 [
-    {
-        "name": "minecraft:trommel/clay",
-        "type": "minecraft:trommeling",
-        "input": {
-            "stack": {
-                "id": 760,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "outputs": [
-            {
-                "weight": 30.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 4,
-                        "max": 8
-                    },
-                    "stack": {
-                        "id": 16465,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 20.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 3
-                    },
-                    "stack": {
-                        "id": 16514,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 10.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16417,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 1.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16510,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            }
-        ]
+  {
+    "name": "minecraft:trommel/clay",
+    "type": "minecraft:trommeling",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/block_clay"
+      }
     },
-    {
-        "name": "minecraft:trommel/dirt",
-        "type": "minecraft:trommeling",
-        "input": {
-            "group": "minecraft:trommel_dirt"
-        },
-        "outputs": [
-            {
-                "weight": 50.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 3
-                    },
-                    "stack": {
-                        "id": 16514,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 20.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 5
-                    },
-                    "stack": {
-                        "id": 16465,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 10.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 3
-                    },
-                    "stack": {
-                        "id": 16446,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 2.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16417,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 0.5,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16511,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 0.25,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16513,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 0.25,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16512,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            }
-        ]
+    "outputs": [
+      {
+        "weight": 30.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 4,
+            "max": 8
+          },
+          "stack": {
+            "id": "minecraft:item/clay"
+          }
+        }
+      },
+      {
+        "weight": 20.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 3
+          },
+          "stack": {
+            "id": "minecraft:item/ammo_pebble"
+          }
+        }
+      },
+      {
+        "weight": 10.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/sulphur"
+          }
+        }
+      },
+      {
+        "weight": 1.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/ore_raw_gold"
+          }
+        }
+      }
+    ]
+  },
+  {
+    "name": "minecraft:trommel/dirt",
+    "type": "minecraft:trommeling",
+    "input": {
+      "group": "minecraft:trommel_dirt"
     },
-    {
-        "name": "minecraft:trommel/gravel",
-        "type": "minecraft:trommeling",
-        "input": {
-            "stack": {
-                "id": 251,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "outputs": [
-            {
-                "weight": 25.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 2
-                    },
-                    "stack": {
-                        "id": 16446,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 30.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 3
-                    },
-                    "stack": {
-                        "id": 16513,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 25.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 6
-                    },
-                    "stack": {
-                        "id": 16514,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 10.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 2
-                    },
-                    "stack": {
-                        "id": 16511,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 5.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 2,
-                        "max": 6
-                    },
-                    "stack": {
-                        "id": 16479,
-                        "amount": 1,
-                        "meta": 4
-                    }
-                }
-            },
-            {
-                "weight": 5.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16417,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 0.5,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16512,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            }
-        ]
+    "outputs": [
+      {
+        "weight": 50.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 3
+          },
+          "stack": {
+            "id": "minecraft:item/ammo_pebble"
+          }
+        }
+      },
+      {
+        "weight": 20.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 5
+          },
+          "stack": {
+            "id": "minecraft:item/clay"
+          }
+        }
+      },
+      {
+        "weight": 10.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 3
+          },
+          "stack": {
+            "id": "minecraft:item/flint"
+          }
+        }
+      },
+      {
+        "weight": 2.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/sulphur"
+          }
+        }
+      },
+      {
+        "weight": 0.5,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/ore_raw_iron"
+          }
+        }
+      },
+      {
+        "weight": 0.25,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/olivine"
+          }
+        }
+      },
+      {
+        "weight": 0.25,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/quartz"
+          }
+        }
+      }
+    ]
+  },
+  {
+    "name": "minecraft:trommel/gravel",
+    "type": "minecraft:trommeling",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/gravel"
+      }
     },
-    {
-        "name": "minecraft:trommel/rich_dirt",
-        "type": "minecraft:trommeling",
-        "input": {
-            "stack": {
-                "id": 222,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "outputs": [
-            {
-                "weight": 10.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16510,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 15.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 2
-                    },
-                    "stack": {
-                        "id": 16511,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 25.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 4
-                    },
-                    "stack": {
-                        "id": 16512,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 25.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 4
-                    },
-                    "stack": {
-                        "id": 16513,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 20.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 2,
-                        "max": 4
-                    },
-                    "stack": {
-                        "id": 16479,
-                        "amount": 1,
-                        "meta": 4
-                    }
-                }
-            },
-            {
-                "weight": 10.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 4,
-                        "max": 8
-                    },
-                    "stack": {
-                        "id": 16465,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 5.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 5
-                    },
-                    "stack": {
-                        "id": 16514,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            }
-        ]
+    "outputs": [
+      {
+        "weight": 25.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 2
+          },
+          "stack": {
+            "id": "minecraft:item/flint"
+          }
+        }
+      },
+      {
+        "weight": 30.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 3
+          },
+          "stack": {
+            "id": "minecraft:item/olivine"
+          }
+        }
+      },
+      {
+        "weight": 25.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 6
+          },
+          "stack": {
+            "id": "minecraft:item/ammo_pebble"
+          }
+        }
+      },
+      {
+        "weight": 10.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 2
+          },
+          "stack": {
+            "id": "minecraft:item/ore_raw_iron"
+          }
+        }
+      },
+      {
+        "weight": 5.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 2,
+            "max": 6
+          },
+          "stack": {
+            "id": "minecraft:item/dye",
+            "meta": 4
+          }
+        }
+      },
+      {
+        "weight": 5.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/sulphur"
+          }
+        }
+      },
+      {
+        "weight": 0.5,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/quartz"
+          }
+        }
+      }
+    ]
+  },
+  {
+    "name": "minecraft:trommel/rich_dirt",
+    "type": "minecraft:trommeling",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/dirt_scorched_rich"
+      }
     },
-    {
-        "name": "minecraft:trommel/sand",
-        "type": "minecraft:trommeling",
-        "input": {
-            "stack": {
-                "id": 250,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "outputs": [
-            {
-                "weight": 50.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 3
-                    },
-                    "stack": {
-                        "id": 16512,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 30.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 4,
-                        "max": 8
-                    },
-                    "stack": {
-                        "id": 16465,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 25.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 5
-                    },
-                    "stack": {
-                        "id": 16514,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 10.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 3
-                    },
-                    "stack": {
-                        "id": 16480,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 10.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 3
-                    },
-                    "stack": {
-                        "id": 16446,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 5.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16417,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 1.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16510,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 5.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16513,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            }
-        ]
+    "outputs": [
+      {
+        "weight": 10.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/ore_raw_gold"
+          }
+        }
+      },
+      {
+        "weight": 15.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 2
+          },
+          "stack": {
+            "id": "minecraft:item/ore_raw_iron"
+          }
+        }
+      },
+      {
+        "weight": 25.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 4
+          },
+          "stack": {
+            "id": "minecraft:item/quartz"
+          }
+        }
+      },
+      {
+        "weight": 25.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 4
+          },
+          "stack": {
+            "id": "minecraft:item/olivine"
+          }
+        }
+      },
+      {
+        "weight": 20.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 2,
+            "max": 4
+          },
+          "stack": {
+            "id": "minecraft:item/dye",
+            "meta": 4
+          }
+        }
+      },
+      {
+        "weight": 10.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 4,
+            "max": 8
+          },
+          "stack": {
+            "id": "minecraft:item/clay"
+          }
+        }
+      },
+      {
+        "weight": 5.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 5
+          },
+          "stack": {
+            "id": "minecraft:item/ammo_pebble"
+          }
+        }
+      }
+    ]
+  },
+  {
+    "name": "minecraft:trommel/sand",
+    "type": "minecraft:trommeling",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/sand"
+      }
     },
-    {
-        "name": "minecraft:trommel/soul_sand",
-        "type": "minecraft:trommeling",
-        "input": {
-            "stack": {
-                "id": 810,
-                "amount": 1,
-                "meta": 0
-            }
-        },
-        "outputs": [
-            {
-                "weight": 20.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 3
-                    },
-                    "stack": {
-                        "id": 16446,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 10.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 6
-                    },
-                    "stack": {
-                        "id": 16480,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 2.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16510,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 1.0,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16511,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 5.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 6
-                    },
-                    "stack": {
-                        "id": 16476,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 5.0,
-                "loot": {
-                    "random": true,
-                    "yield": {
-                        "min": 1,
-                        "max": 3
-                    },
-                    "stack": {
-                        "id": 16512,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            },
-            {
-                "weight": 0.5,
-                "loot": {
-                    "random": false,
-                    "yield": {
-                        "fixed": 1
-                    },
-                    "stack": {
-                        "id": 16488,
-                        "amount": 1,
-                        "meta": 0
-                    }
-                }
-            }
-        ]
-    }
+    "outputs": [
+      {
+        "weight": 50.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 3
+          },
+          "stack": {
+            "id": "minecraft:item/quartz"
+          }
+        }
+      },
+      {
+        "weight": 30.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 4,
+            "max": 8
+          },
+          "stack": {
+            "id": "minecraft:item/clay"
+          }
+        }
+      },
+      {
+        "weight": 25.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 5
+          },
+          "stack": {
+            "id": "minecraft:item/ammo_pebble"
+          }
+        }
+      },
+      {
+        "weight": 10.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 3
+          },
+          "stack": {
+            "id": "minecraft:item/bone"
+          }
+        }
+      },
+      {
+        "weight": 10.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 3
+          },
+          "stack": {
+            "id": "minecraft:item/flint"
+          }
+        }
+      },
+      {
+        "weight": 5.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/sulphur"
+          }
+        }
+      },
+      {
+        "weight": 5.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/olivine"
+          }
+        }
+      },
+      {
+        "weight": 1.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/ore_raw_gold"
+          }
+        }
+      }
+    ]
+  },
+  {
+    "name": "minecraft:trommel/soul_sand",
+    "type": "minecraft:trommeling",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/soulsand"
+      }
+    },
+    "outputs": [
+      {
+        "weight": 20.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 3
+          },
+          "stack": {
+            "id": "minecraft:item/flint"
+          }
+        }
+      },
+      {
+        "weight": 10.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 6
+          },
+          "stack": {
+            "id": "minecraft:item/bone"
+          }
+        }
+      },
+      {
+        "weight": 2.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/ore_raw_gold"
+          }
+        }
+      },
+      {
+        "weight": 1.0,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/ore_raw_iron"
+          }
+        }
+      },
+      {
+        "weight": 5.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 6
+          },
+          "stack": {
+            "id": "minecraft:item/dust_glowstone"
+          }
+        }
+      },
+      {
+        "weight": 5.0,
+        "loot": {
+          "random": true,
+          "yield": {
+            "min": 1,
+            "max": 3
+          },
+          "stack": {
+            "id": "minecraft:item/quartz"
+          }
+        }
+      },
+      {
+        "weight": 0.5,
+        "loot": {
+          "random": false,
+          "yield": {
+            "fixed": 1
+          },
+          "stack": {
+            "id": "minecraft:item/nethercoal"
+          }
+        }
+      }
+    ]
+  }
 ]
\ No newline at end of file
diff --git a/src/common/resources/recipes/workbench.json b/src/common/resources/recipes/workbench.json
index a1a8627be..fe756eaa0 100644
--- a/src/common/resources/recipes/workbench.json
+++ b/src/common/resources/recipes/workbench.json
@@ -1,276 +1,255 @@
 [
   {
-    "name": "minecraft:workbench/wooden_pickaxe",
+    "name": "minecraft:workbench/arrow",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      " # ",
-      " # "
+      "T",
+      "I",
+      "V"
     ],
     "symbols": [
       {
-        "symbol": "X",
-        "group": "minecraft:planks"
+        "symbol": "T",
+        "stack": {
+          "id": "minecraft:item/flint"
+        }
       },
       {
-        "symbol": "#",
+        "symbol": "I",
+        "stack": {
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "V",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/feather_chicken"
         }
       }
     ],
     "result": {
-      "id": 16398,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/ammo_arrow",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_shovel",
+    "name": "minecraft:workbench/basalt_brick_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "#",
-      "#"
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_basalt"
         }
       }
     ],
     "result": {
-      "id": 16397,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_basalt",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/iron_axe",
+    "name": "minecraft:workbench/basalt_brick_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XX",
-      "X#",
-      " #"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_basalt"
         }
       }
     ],
     "result": {
-      "id": 16386,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_basalt",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/red_lamp",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/basalt_bricks",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XX",
+      "XX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:block/basalt"
         }
-      },
-      {
-        "group": "minecraft:lamps"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 14
+      "id": "minecraft:block/brick_basalt",
+      "amount": 4
     }
   },
   {
-    "name": "minecraft:workbench/red_wooden_fence",
+    "name": "minecraft:workbench/basalt_to_polished_basalt",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "#",
+      "#"
     ],
     "symbols": [
-      {
-        "symbol": "X",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 14
-        }
-      },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/basalt"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 14
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/basalt_polished",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/red_wooden_slab",
+    "name": "minecraft:workbench/basket",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "###",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 14
+          "id": "minecraft:item/leather"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/wheat"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 224
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/basket"
+    }
   },
   {
-    "name": "minecraft:workbench/red_wooden_stairs",
+    "name": "minecraft:workbench/bed",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "CCW",
+      "PPP"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "C",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 14
+          "id": "minecraft:item/cloth"
         }
+      },
+      {
+        "symbol": "W",
+        "group": "minecraft:wools"
+      },
+      {
+        "symbol": "P",
+        "group": "minecraft:planks"
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 224
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/bed"
+    }
   },
   {
-    "name": "minecraft:workbench/red_wooden_fence_gate",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X#X",
-      "X#X"
+    "name": "minecraft:workbench/birch_log_to_white_wooden_planks",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "stack": {
+          "id": "minecraft:block/log_birch"
+        }
+      }
     ],
-    "symbols": [
+    "result": {
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 4
+    }
+  },
+  {
+    "name": "minecraft:workbench/black_dye_gray_dye_gray_dye_to_light_gray_dye",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 8
         }
       },
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 14
+          "id": "minecraft:item/dye",
+          "meta": 8
+        }
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye"
         }
       }
     ],
     "result": {
-      "id": 91,
+      "id": "minecraft:item/dye",
       "amount": 3,
-      "meta": 224
-    },
-    "consumeContainers": true
+      "meta": 7
+    }
   },
   {
-    "name": "minecraft:workbench/red_wool",
+    "name": "minecraft:workbench/black_dye_white_dye_to_gray_dye",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "group": "minecraft:wools"
+        "stack": {
+          "id": "minecraft:item/dye"
+        }
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 14
+      "id": "minecraft:item/dye",
+      "amount": 2,
+      "meta": 8
     }
   },
   {
-    "name": "minecraft:workbench/red_wooden_chest_from_planks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "# #",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/black_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 14
+          "id": "minecraft:item/dye"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 224
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 15
+    }
   },
   {
-    "name": "minecraft:workbench/red_wooden_chest_from_chest",
+    "name": "minecraft:workbench/black_wooden_chest_from_chest",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
@@ -278,70 +257,61 @@
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/dye"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 224
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 240
     }
   },
   {
-    "name": "minecraft:workbench/red_wooden_planks",
+    "name": "minecraft:workbench/black_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 14
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 240
+    }
   },
   {
-    "name": "minecraft:workbench/green_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/black_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XX",
+      "XX",
+      "XX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 15
         }
-      },
-      {
-        "group": "minecraft:lamps"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 13
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2
     }
   },
   {
-    "name": "minecraft:workbench/green_wooden_fence",
+    "name": "minecraft:workbench/black_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "X#X",
@@ -351,1943 +321,1506 @@
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 15
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 81,
+      "id": "minecraft:block/fence_planks_oak_painted",
       "amount": 6,
-      "meta": 13
-    },
-    "consumeContainers": true
+      "meta": 15
+    }
   },
   {
-    "name": "minecraft:workbench/green_wooden_slab",
+    "name": "minecraft:workbench/black_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 208
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 240
+    }
   },
   {
-    "name": "minecraft:workbench/iron_hoe",
+    "name": "minecraft:workbench/black_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XX ",
-      " # ",
-      " # "
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:planks"
       },
       {
-        "symbol": "#",
+        "symbol": "D",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye"
         }
       }
     ],
     "result": {
-      "id": 16420,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 15
+    }
   },
   {
-    "name": "minecraft:workbench/green_wooden_stairs",
+    "name": "minecraft:workbench/black_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 171,
+      "id": "minecraft:block/slab_planks_oak_painted",
       "amount": 6,
-      "meta": 208
-    },
-    "consumeContainers": true
+      "meta": 240
+    }
   },
   {
-    "name": "minecraft:workbench/green_wooden_fence_gate",
+    "name": "minecraft:workbench/black_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 13
-        }
-      }
-    ],
-    "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 208
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/green_wool",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:wools"
-      },
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 13
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 240
     }
   },
   {
-    "name": "minecraft:workbench/green_wooden_chest_from_planks",
+    "name": "minecraft:workbench/black_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 208
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 240
+    }
   },
   {
-    "name": "minecraft:workbench/green_wooden_chest_from_chest",
+    "name": "minecraft:workbench/black_wool",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "group": "minecraft:chests"
+        "group": "minecraft:wools"
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:item/dye"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 208
+      "id": "minecraft:block/wool",
+      "meta": 15
     }
   },
   {
-    "name": "minecraft:workbench/green_wooden_planks",
+    "name": "minecraft:workbench/blank_label",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "PI",
+      "S "
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "P",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:item/paper"
         }
-      }
-    ],
-    "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 13
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/brown_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+      },
       {
+        "symbol": "I",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 3
+          "id": "minecraft:item/dye"
         }
       },
       {
-        "group": "minecraft:lamps"
+        "symbol": "S",
+        "stack": {
+          "id": "minecraft:item/string"
+        }
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 12
+      "id": "minecraft:item/label"
     }
   },
   {
-    "name": "minecraft:workbench/brown_wooden_fence",
+    "name": "minecraft:workbench/blast_furnace",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "###",
+      "#X#",
+      "###"
     ],
     "symbols": [
       {
-        "symbol": "X",
+        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:item/ingot_iron"
         }
       },
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/nethercoal"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 12
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/furnace_blast_idle"
+    }
   },
   {
-    "name": "minecraft:workbench/brown_wooden_slab",
+    "name": "minecraft:workbench/block_of_charcoal",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:item/coal",
+          "meta": 1
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 192
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_charcoal"
+    }
   },
   {
-    "name": "minecraft:workbench/brown_wooden_stairs",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#  ",
-      "## ",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/block_of_charcoal_to_charcoal",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:block/block_charcoal"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 192
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/coal",
+      "amount": 8,
+      "meta": 1
+    }
   },
   {
-    "name": "minecraft:workbench/diamond_pickaxe",
+    "name": "minecraft:workbench/block_of_coal",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "XXX",
-      " # ",
-      " # "
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/coal"
         }
-      },
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/block_coal"
+    }
+  },
+  {
+    "name": "minecraft:workbench/block_of_coal_to_coal",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/block_coal"
         }
       }
     ],
     "result": {
-      "id": 16406,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/coal",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/brown_wooden_fence_gate",
+    "name": "minecraft:workbench/block_of_diamond",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:item/diamond"
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 192
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_diamond"
+    }
   },
   {
-    "name": "minecraft:workbench/brown_wool",
+    "name": "minecraft:workbench/block_of_diamond_to_diamond",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
-      {
-        "group": "minecraft:wools"
-      },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 3
+          "id": "minecraft:block/block_diamond"
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 12
+      "id": "minecraft:item/diamond",
+      "amount": 9
     }
   },
   {
-    "name": "minecraft:workbench/brown_wooden_chest_from_planks",
+    "name": "minecraft:workbench/block_of_gold",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:item/ingot_gold"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 192
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_gold"
+    }
   },
   {
-    "name": "minecraft:workbench/brown_wooden_chest_from_chest",
+    "name": "minecraft:workbench/block_of_gold_to_gold_ingot",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
-      {
-        "group": "minecraft:chests"
-      },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 3
+          "id": "minecraft:block/block_gold"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 192
+      "id": "minecraft:item/ingot_gold",
+      "amount": 9
     }
   },
   {
-    "name": "minecraft:workbench/brown_wooden_planks",
+    "name": "minecraft:workbench/block_of_iron",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "XXX",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 3
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 12
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/blue_lamp_convert",
+    "name": "minecraft:workbench/block_of_iron_to_iron_ingot",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:block/block_iron"
         }
-      },
-      {
-        "group": "minecraft:lamps"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 11
+      "id": "minecraft:item/ingot_iron",
+      "amount": 9
     }
   },
   {
-    "name": "minecraft:workbench/blue_wooden_fence",
+    "name": "minecraft:workbench/block_of_lapis_lazuli",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 11
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 11
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_lapis"
+    }
   },
   {
-    "name": "minecraft:workbench/blue_wooden_slab",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/block_of_lapis_lazuli_to_lapis_lazuli",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:block/block_lapis"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 176
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/dye",
+      "amount": 9,
+      "meta": 4
+    }
   },
   {
-    "name": "minecraft:workbench/blue_wooden_stairs",
+    "name": "minecraft:workbench/block_of_nethercoal",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:item/nethercoal"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 176
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_nethercoal"
+    }
   },
   {
-    "name": "minecraft:workbench/blue_wooden_fence_gate",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X#X",
-      "X#X"
-    ],
-    "symbols": [
-      {
-        "symbol": "X",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
+    "name": "minecraft:workbench/block_of_nethercoal_to_nethercoal",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:block/block_nethercoal"
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 176
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/nethercoal",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/diamond_shovel",
+    "name": "minecraft:workbench/block_of_olivine",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "#",
-      "#"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/olivine"
         }
       }
     ],
     "result": {
-      "id": 16405,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_olivine"
+    }
   },
   {
-    "name": "minecraft:workbench/blue_wool",
+    "name": "minecraft:workbench/block_of_olivine_to_olivine",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
-      {
-        "group": "minecraft:wools"
-      },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:block/block_olivine"
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 11
+      "id": "minecraft:item/olivine",
+      "amount": 8
     }
   },
   {
-    "name": "minecraft:workbench/blue_wooden_chest_from_planks",
+    "name": "minecraft:workbench/block_of_quartz",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:item/quartz"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 176
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_quartz"
+    }
   },
   {
-    "name": "minecraft:workbench/blue_wooden_chest_from_chest",
+    "name": "minecraft:workbench/block_of_quartz_to_quartz",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
-      {
-        "group": "minecraft:chests"
-      },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:block/block_quartz"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 176
+      "id": "minecraft:item/quartz",
+      "amount": 9
     }
   },
   {
-    "name": "minecraft:workbench/blue_wooden_planks",
+    "name": "minecraft:workbench/block_of_redstone",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "XXX",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:item/dust_redstone"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 11
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_redstone"
+    }
   },
   {
-    "name": "minecraft:workbench/purple_lamp_convert",
+    "name": "minecraft:workbench/block_of_redstone_to_redstone",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:block/block_redstone"
         }
-      },
-      {
-        "group": "minecraft:lamps"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 10
+      "id": "minecraft:item/dust_redstone",
+      "amount": 9
     }
   },
   {
-    "name": "minecraft:workbench/purple_wooden_fence",
+    "name": "minecraft:workbench/block_of_steel",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 10
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 10
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/purple_wooden_slab",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/block_of_steel_to_steel_ingot",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:block/block_steel"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 160
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/ingot_steel",
+      "amount": 9
+    }
   },
   {
-    "name": "minecraft:workbench/purple_wooden_stairs",
+    "name": "minecraft:workbench/block_of_sugarcane",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:item/sugarcane"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 160
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_sugarcane"
+    }
   },
   {
-    "name": "minecraft:workbench/purple_wooden_fence_gate",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X#X",
-      "X#X"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/blue_dye_green_dye_to_cyan_dye",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 4
         }
       },
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:item/dye",
+          "meta": 2
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 160
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/dye",
+      "amount": 2,
+      "meta": 6
+    }
   },
   {
-    "name": "minecraft:workbench/purple_wool",
+    "name": "minecraft:workbench/blue_dye_red_dye_pink_dye_to_magenta_dye",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "group": "minecraft:wools"
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 4
+        }
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:item/dye",
+          "meta": 1
+        }
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 10
+      "id": "minecraft:item/dye",
+      "amount": 3,
+      "meta": 13
     }
   },
   {
-    "name": "minecraft:workbench/diamond_axe",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "XX",
-      "X#",
-      " #"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/blue_dye_red_dye_red_dye_white_dye_to_magenta_dye",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 4
         }
       },
       {
-        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 1
+        }
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 1
+        }
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 16407,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/dye",
+      "amount": 4,
+      "meta": 13
+    }
   },
   {
-    "name": "minecraft:workbench/purple_wooden_chest_from_planks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "# #",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/blue_dye_red_dye_to_purple_dye",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:item/dye",
+          "meta": 4
+        }
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 1
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 160
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/dye",
+      "amount": 2,
+      "meta": 5
+    }
   },
   {
-    "name": "minecraft:workbench/purple_wooden_chest_from_chest",
+    "name": "minecraft:workbench/blue_dye_white_dye_to_light_blue_dye",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "group": "minecraft:chests"
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 4
+        }
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 160
+      "id": "minecraft:item/dye",
+      "amount": 2,
+      "meta": 12
     }
   },
   {
-    "name": "minecraft:workbench/purple_wooden_planks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "#0#",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/blue_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
+        "group": "minecraft:lamps"
       },
       {
-        "symbol": "0",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:item/dye",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 10
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 11
+    }
   },
   {
-    "name": "minecraft:workbench/cyan_lamp_convert",
+    "name": "minecraft:workbench/blue_wooden_chest_from_chest",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 6
-        }
+        "group": "minecraft:chests"
       },
       {
-        "group": "minecraft:lamps"
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 4
+        }
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 9
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 176
     }
   },
   {
-    "name": "minecraft:workbench/cyan_wooden_fence",
+    "name": "minecraft:workbench/blue_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 9
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 9
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 176
+    }
   },
   {
-    "name": "minecraft:workbench/cyan_wooden_slab",
+    "name": "minecraft:workbench/blue_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 144
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 4
+    }
   },
   {
-    "name": "minecraft:workbench/cyan_wooden_stairs",
+    "name": "minecraft:workbench/blue_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 11
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 171,
+      "id": "minecraft:block/fence_planks_oak_painted",
       "amount": 6,
-      "meta": 144
-    },
-    "consumeContainers": true
+      "meta": 11
+    }
   },
   {
-    "name": "minecraft:workbench/cyan_wooden_fence_gate",
+    "name": "minecraft:workbench/blue_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
-        "symbol": "X",
+        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       },
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 91,
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
       "amount": 3,
-      "meta": 144
-    },
-    "consumeContainers": true
+      "meta": 176
+    }
   },
   {
-    "name": "minecraft:workbench/cyan_wool",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/blue_wooden_planks",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX",
+      "XDX",
+      "XXX"
+    ],
+    "symbols": [
       {
-        "group": "minecraft:wools"
+        "symbol": "X",
+        "group": "minecraft:planks"
       },
       {
+        "symbol": "D",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 6
+          "id": "minecraft:item/dye",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 9
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 11
     }
   },
   {
-    "name": "minecraft:workbench/cyan_wooden_chest_from_planks",
+    "name": "minecraft:workbench/blue_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 144
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 176
+    }
   },
   {
-    "name": "minecraft:workbench/diamond_hoe",
+    "name": "minecraft:workbench/blue_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XX",
-      " #",
-      " #"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 11
         }
-      },
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 176
+    }
+  },
+  {
+    "name": "minecraft:workbench/blue_wooden_trapdoor",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX",
+      "XXX"
+    ],
+    "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 16421,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 176
+    }
   },
   {
-    "name": "minecraft:workbench/cyan_wooden_chest_from_chest",
+    "name": "minecraft:workbench/blue_wool",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "group": "minecraft:chests"
+        "group": "minecraft:wools"
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 6
+          "id": "minecraft:item/dye",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 144
+      "id": "minecraft:block/wool",
+      "meta": 11
     }
   },
   {
-    "name": "minecraft:workbench/cyan_wooden_planks",
+    "name": "minecraft:workbench/boat",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
+      "# #",
       "###"
     ],
     "symbols": [
       {
         "symbol": "#",
         "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 6
-        }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 9
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/boat"
+    }
   },
   {
-    "name": "minecraft:workbench/light_gray_lamp_convert",
+    "name": "minecraft:workbench/bone_to_dye",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 7
+          "id": "minecraft:item/bone"
         }
-      },
-      {
-        "group": "minecraft:lamps"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 8
+      "id": "minecraft:item/dye",
+      "amount": 3,
+      "meta": 15
     }
   },
   {
-    "name": "minecraft:workbench/light_gray_wooden_fence",
+    "name": "minecraft:workbench/book_horizontal",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "###"
     ],
     "symbols": [
-      {
-        "symbol": "X",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 8
-        }
-      },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/paper"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 8
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/book"
+    }
   },
   {
-    "name": "minecraft:workbench/light_gray_wooden_slab",
+    "name": "minecraft:workbench/book_vertical",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "#",
+      "#",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:item/paper"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 128
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/book"
+    }
   },
   {
-    "name": "minecraft:workbench/light_gray_wooden_stairs",
+    "name": "minecraft:workbench/bookshelf",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
+      "###",
+      "XXX",
       "###"
     ],
     "symbols": [
       {
         "symbol": "#",
+        "group": "minecraft:planks"
+      },
+      {
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:item/book"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 128
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/bookshelf_planks_oak"
+    }
   },
   {
-    "name": "minecraft:workbench/light_gray_wooden_fence_gate",
+    "name": "minecraft:workbench/bow",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      " #X",
+      "# X",
+      " #X"
     ],
     "symbols": [
-      {
-        "symbol": "X",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:item/stick"
         }
-      }
-    ],
-    "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 128
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/light_gray_wool",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:wools"
       },
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 7
+          "id": "minecraft:item/string"
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 8
+      "id": "minecraft:item/tool_bow"
     }
   },
   {
-    "name": "minecraft:workbench/light_gray_wooden_chest_from_planks",
+    "name": "minecraft:workbench/bowl",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
       "# #",
-      "###"
+      " # "
     ],
     "symbols": [
       {
         "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 8
-        }
-      }
-    ],
-    "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 128
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/light_gray_wooden_chest_from_chest",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:chests"
-      },
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 7
-        }
+        "group": "minecraft:planks"
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 128
+      "id": "minecraft:item/bowl"
     }
   },
   {
-    "name": "minecraft:workbench/golden_pickaxe",
+    "name": "minecraft:workbench/brazier",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      " # ",
-      " # "
+      "X X",
+      "X#X"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/cobble_netherrack"
         }
       }
     ],
     "result": {
-      "id": 16413,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brazier_inactive"
+    }
   },
   {
-    "name": "minecraft:workbench/light_gray_wooden_planks",
+    "name": "minecraft:workbench/bread",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 7
+          "id": "minecraft:item/wheat"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 8
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/food_bread"
+    }
   },
   {
-    "name": "minecraft:workbench/gray_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/brick_permafrost_slab",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:block/brick_permafrost"
         }
-      },
-      {
-        "group": "minecraft:lamps"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 7
+      "id": "minecraft:block/slab_brick_permafrost",
+      "amount": 6
     }
   },
   {
-    "name": "minecraft:workbench/gray_wooden_fence",
+    "name": "minecraft:workbench/brick_permafrost_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 7
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_permafrost"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 7
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_permafrost",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/gray_wooden_slab",
+    "name": "minecraft:workbench/brick_sandstone_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 7
+          "id": "minecraft:block/brick_sandstone"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 112
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_sandstone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/gray_wooden_stairs",
+    "name": "minecraft:workbench/brick_sandstone_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 7
+          "id": "minecraft:block/brick_sandstone"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 112
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_sandstone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/gray_wooden_fence_gate",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X#X",
-      "X#X"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/brown_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "X",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:lamps"
       },
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 7
+          "id": "minecraft:item/dye",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 112
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 12
+    }
   },
   {
-    "name": "minecraft:workbench/gray_wool",
+    "name": "minecraft:workbench/brown_wooden_chest_from_chest",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "group": "minecraft:wools"
+        "group": "minecraft:chests"
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:item/dye",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 7
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 192
     }
   },
   {
-    "name": "minecraft:workbench/gray_wooden_chest_from_planks",
+    "name": "minecraft:workbench/brown_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 7
-        }
-      }
-    ],
-    "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 112
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/gray_wooden_chest_from_chest",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:chests"
-      },
-      {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 12
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 112
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 192
     }
   },
   {
-    "name": "minecraft:workbench/gray_wooden_planks",
+    "name": "minecraft:workbench/brown_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 12
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 7
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 3
+    }
   },
   {
-    "name": "minecraft:workbench/golden_shovel",
+    "name": "minecraft:workbench/brown_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "#",
-      "#"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 12
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16412,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6,
+      "meta": 12
+    }
   },
   {
-    "name": "minecraft:workbench/pink_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/brown_wooden_fence_gate",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "#X#",
+      "#X#"
+    ],
+    "symbols": [
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:item/stick"
         }
       },
       {
-        "group": "minecraft:lamps"
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 12
+        }
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 6
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 192
     }
   },
   {
-    "name": "minecraft:workbench/pink_wooden_fence",
+    "name": "minecraft:workbench/brown_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 6
-        }
+        "group": "minecraft:planks"
       },
       {
-        "symbol": "#",
+        "symbol": "D",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 6
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 12
+    }
   },
   {
-    "name": "minecraft:workbench/pink_wooden_slab",
+    "name": "minecraft:workbench/brown_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 6
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 12
         }
       }
     ],
     "result": {
-      "id": 154,
+      "id": "minecraft:block/slab_planks_oak_painted",
       "amount": 6,
-      "meta": 96
-    },
-    "consumeContainers": true
+      "meta": 192
+    }
   },
   {
-    "name": "minecraft:workbench/pink_wooden_stairs",
+    "name": "minecraft:workbench/brown_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 6
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 12
         }
       }
     ],
     "result": {
-      "id": 171,
+      "id": "minecraft:block/stairs_planks_oak_painted",
       "amount": 6,
-      "meta": 96
-    },
-    "consumeContainers": true
+      "meta": 192
+    }
   },
   {
-    "name": "minecraft:workbench/pink_wooden_fence_gate",
+    "name": "minecraft:workbench/brown_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 6
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 12
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 96
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 192
+    }
   },
   {
-    "name": "minecraft:workbench/pink_wool",
+    "name": "minecraft:workbench/brown_wool",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
@@ -2295,149 +1828,140 @@
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:item/dye",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 6
+      "id": "minecraft:block/wool",
+      "meta": 12
     }
   },
   {
-    "name": "minecraft:workbench/pink_wooden_chest_from_planks",
+    "name": "minecraft:workbench/bucket",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
       "# #",
-      "###"
+      " # "
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 6
-        }
-      }
-    ],
-    "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 96
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/pink_wooden_chest_from_chest",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:chests"
-      },
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 96
+      "id": "minecraft:item/bucket"
     }
   },
   {
-    "name": "minecraft:workbench/pink_wooden_planks",
+    "name": "minecraft:workbench/cake",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "AAA",
+      "BEB",
+      "CCC"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
+        "symbol": "A",
+        "stack": {
+          "id": "minecraft:item/bucket_milk"
+        }
+      },
+      {
+        "symbol": "B",
+        "stack": {
+          "id": "minecraft:item/dust_sugar"
+        }
       },
       {
-        "symbol": "0",
+        "symbol": "E",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:item/egg_chicken"
+        }
+      },
+      {
+        "symbol": "C",
+        "stack": {
+          "id": "minecraft:item/wheat"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 6
+      "id": "minecraft:item/food_cake"
+    }
+  },
+  {
+    "name": "minecraft:workbench/carve_pumpkin_sword",
+    "type": "minecraft:crafting/uses_tool",
+    "input": {
+      "stack": {
+        "id": "minecraft:block/pumpkin"
+      }
     },
-    "consumeContainers": true
+    "tool": {
+      "group": "minecraft:tool_swords"
+    },
+    "output": {
+      "id": "minecraft:block/pumpkin_carved_idle"
+    }
   },
   {
-    "name": "minecraft:workbench/lime_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/carved_pumpkin_to_jack_o_lantern",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X",
+      "#"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:block/pumpkin_carved_idle"
         }
       },
       {
-        "group": "minecraft:lamps"
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:block/torch_coal"
+        }
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 5
+      "id": "minecraft:block/pumpkin_carved_active"
     }
   },
   {
-    "name": "minecraft:workbench/golden_axe",
+    "name": "minecraft:workbench/carved_pumpkin_to_redstone_jack_o_lantern",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XX",
-      "X#",
-      " #"
+      "X",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/pumpkin_carved_idle"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/torch_redstone_active"
         }
       }
     ],
     "result": {
-      "id": 16414,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/pumpkin_redstone"
+    }
   },
   {
-    "name": "minecraft:workbench/lime_wooden_fence",
+    "name": "minecraft:workbench/chainlink_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "X#X",
@@ -2447,708 +1971,544 @@
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:item/ingot_iron"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/chainlink"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 5
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_chainlink",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/lime_wooden_slab",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/cherry_log_to_pink_wooden_planks",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:block/log_cherry"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 80
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 4,
+      "meta": 6
+    }
+  },
+  {
+    "name": "minecraft:workbench/chests_undyeing",
+    "type": "minecraft:crafting/undyeing",
+    "input": {
+      "group": "minecraft:chests"
     },
-    "consumeContainers": true
+    "output": {
+      "id": "minecraft:block/chest_planks_oak",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/lime_wooden_stairs",
+    "name": "minecraft:workbench/clay_block",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "##",
+      "##"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:item/clay"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 80
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_clay"
+    }
   },
   {
-    "name": "minecraft:workbench/lime_wooden_fence_gate",
+    "name": "minecraft:workbench/clay_brick_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:block/brick_clay"
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 80
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_clay",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/lime_wool",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:wools"
-      },
+    "name": "minecraft:workbench/clay_brick_stairs",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X  ",
+      "XX ",
+      "XXX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:block/brick_clay"
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 5
+      "id": "minecraft:block/stairs_brick_clay",
+      "amount": 6
     }
   },
   {
-    "name": "minecraft:workbench/lime_wooden_chest_from_planks",
+    "name": "minecraft:workbench/clay_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:item/brick_clay"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 80
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_clay",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/lime_wooden_chest_from_chest",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/clock",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      " X ",
+      "X#X",
+      " X "
+    ],
+    "symbols": [
       {
-        "group": "minecraft:chests"
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/ingot_gold"
+        }
       },
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:item/dust_redstone"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 80
+      "id": "minecraft:item/tool_clock"
     }
   },
   {
-    "name": "minecraft:workbench/lime_wooden_planks",
+    "name": "minecraft:workbench/cobbled_basalt_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:block/cobble_basalt"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 5
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_cobble_basalt",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/yellow_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/cobbled_basalt_stairs",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X  ",
+      "XX ",
+      "XXX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:block/cobble_basalt"
         }
-      },
-      {
-        "group": "minecraft:lamps"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 4
+      "id": "minecraft:block/stairs_cobble_basalt",
+      "amount": 6
     }
   },
   {
-    "name": "minecraft:workbench/yellow_wooden_fence",
+    "name": "minecraft:workbench/cobbled_granite_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 4
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/cobble_granite"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 4
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_cobble_granite",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/golden_hoe",
+    "name": "minecraft:workbench/cobbled_granite_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XX",
-      " #",
-      " #"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/cobble_granite"
         }
       }
     ],
     "result": {
-      "id": 16422,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_cobble_granite",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/yellow_wooden_slab",
+    "name": "minecraft:workbench/cobbled_limestone_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:block/cobble_limestone"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 64
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_cobble_limestone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/yellow_wooden_stairs",
+    "name": "minecraft:workbench/cobbled_limestone_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:block/cobble_limestone"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 64
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_cobble_limestone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/yellow_wooden_fence_gate",
+    "name": "minecraft:workbench/cobbled_netherrack_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:block/cobble_netherrack"
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 64
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_cobble_netherrack",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/yellow_wool",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:wools"
-      },
+    "name": "minecraft:workbench/cobbled_netherrack_stairs",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X  ",
+      "XX ",
+      "XXX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:block/cobble_netherrack"
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 4
+      "id": "minecraft:block/stairs_cobble_netherrack",
+      "amount": 6
     }
   },
   {
-    "name": "minecraft:workbench/yellow_wooden_chest_from_planks",
+    "name": "minecraft:workbench/cobbled_permafrost_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:block/cobble_permafrost"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 64
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_cobble_permafrost",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/yellow_wooden_chest_from_chest",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:chests"
-      },
+    "name": "minecraft:workbench/cobbled_permafrost_stairs",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X  ",
+      "XX ",
+      "XXX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:block/cobble_permafrost"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 64
+      "id": "minecraft:block/stairs_cobble_permafrost",
+      "amount": 6
     }
   },
   {
-    "name": "minecraft:workbench/yellow_wooden_planks",
+    "name": "minecraft:workbench/cobbled_stone_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:block/cobble_stone"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 4
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_cobble_stone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/light_blue_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/cobblestone_lever",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "S",
+      "C"
+    ],
+    "symbols": [
       {
+        "symbol": "S",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:item/stick"
         }
       },
       {
-        "group": "minecraft:lamps"
+        "symbol": "C",
+        "group": "minecraft:cobblestones"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 3
+      "id": "minecraft:block/lever_cobble_stone",
+      "amount": 2
     }
   },
   {
-    "name": "minecraft:workbench/light_blue_wooden_fence",
+    "name": "minecraft:workbench/cobblestone_pressure_plate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "##"
     ],
     "symbols": [
-      {
-        "symbol": "X",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 3
-        }
-      },
       {
         "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:cobblestones"
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 3
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/pressure_plate_cobble_stone"
+    }
   },
   {
-    "name": "minecraft:workbench/light_blue_wooden_slab",
+    "name": "minecraft:workbench/cobblestone_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 3
+          "id": "minecraft:block/cobble_stone"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 48
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_cobble_stone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_axe",
+    "name": "minecraft:workbench/cobweb",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XX",
-      "X#",
-      " #"
+      "XXX",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/string"
         }
       }
     ],
     "result": {
-      "id": 16399,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/cobweb"
+    }
   },
   {
-    "name": "minecraft:workbench/steel_pickaxe",
+    "name": "minecraft:workbench/compass",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      " # ",
-      " # "
+      " X ",
+      "X#X",
+      " X "
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dust_redstone"
         }
       }
     ],
     "result": {
-      "id": 16495,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_compass"
+    }
   },
   {
-    "name": "minecraft:workbench/light_blue_wooden_stairs",
+    "name": "minecraft:workbench/cookie",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/wheat"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
+          "id": "minecraft:item/dye",
           "meta": 3
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 48
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/food_cookie",
+      "amount": 16
+    }
   },
   {
-    "name": "minecraft:workbench/light_blue_wooden_fence_gate",
+    "name": "minecraft:workbench/crude_steel_to_steel_ingot",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "###"
     ],
     "symbols": [
-      {
-        "symbol": "X",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 3
+          "id": "minecraft:item/ingot_steel_crude"
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 48
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/ingot_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/light_blue_wool",
+    "name": "minecraft:workbench/cyan_lamp_convert",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "group": "minecraft:wools"
+        "group": "minecraft:lamps"
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:item/dye",
+          "meta": 6
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 3
+      "id": "minecraft:block/lamp_idle",
+      "meta": 9
     }
   },
   {
-    "name": "minecraft:workbench/light_blue_wooden_chest_from_planks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "# #",
-      "###"
-    ],
-    "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 3
-        }
-      }
-    ],
-    "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 48
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/light_blue_wooden_chest_from_chest",
+    "name": "minecraft:workbench/cyan_wooden_chest_from_chest",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
@@ -3156,70 +2516,63 @@
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:item/dye",
+          "meta": 6
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 48
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 144
     }
   },
   {
-    "name": "minecraft:workbench/light_blue_wooden_planks",
+    "name": "minecraft:workbench/cyan_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 3
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 144
+    }
   },
   {
-    "name": "minecraft:workbench/magenta_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/cyan_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XX",
+      "XX",
+      "XX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 9
         }
-      },
-      {
-        "group": "minecraft:lamps"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 2
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 6
     }
   },
   {
-    "name": "minecraft:workbench/magenta_wooden_fence",
+    "name": "minecraft:workbench/cyan_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "X#X",
@@ -3229,761 +2582,606 @@
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 9
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 81,
+      "id": "minecraft:block/fence_planks_oak_painted",
       "amount": 6,
-      "meta": 2
-    },
-    "consumeContainers": true
+      "meta": 9
+    }
   },
   {
-    "name": "minecraft:workbench/magenta_wooden_slab",
+    "name": "minecraft:workbench/cyan_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:item/stick"
         }
-      }
-    ],
-    "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 32
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/magenta_wooden_stairs",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#  ",
-      "## ",
-      "###"
-    ],
-    "symbols": [
+      },
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 32
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 144
+    }
   },
   {
-    "name": "minecraft:workbench/steel_shovel",
+    "name": "minecraft:workbench/cyan_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "#",
-      "#"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:planks"
       },
       {
-        "symbol": "#",
+        "symbol": "D",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 6
         }
       }
     ],
     "result": {
-      "id": 16494,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 9
+    }
   },
   {
-    "name": "minecraft:workbench/magenta_wooden_fence_gate",
+    "name": "minecraft:workbench/cyan_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 32
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 144
+    }
   },
   {
-    "name": "minecraft:workbench/magenta_wool",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:wools"
-      },
+    "name": "minecraft:workbench/cyan_wooden_stairs",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X  ",
+      "XX ",
+      "XXX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 2
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 144
     }
   },
   {
-    "name": "minecraft:workbench/magenta_wooden_chest_from_planks",
+    "name": "minecraft:workbench/cyan_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 32
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 144
+    }
   },
   {
-    "name": "minecraft:workbench/magenta_wooden_chest_from_chest",
+    "name": "minecraft:workbench/cyan_wool",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "group": "minecraft:chests"
+        "group": "minecraft:wools"
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:item/dye",
+          "meta": 6
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 32
+      "id": "minecraft:block/wool",
+      "meta": 9
     }
   },
   {
-    "name": "minecraft:workbench/magenta_wooden_planks",
+    "name": "minecraft:workbench/detector_rail",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "X X",
+      "X#X",
+      "XRX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:item/ingot_iron"
         }
-      }
-    ],
-    "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 2
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/orange_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+      },
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 14
+          "id": "minecraft:block/pressure_plate_stone"
         }
       },
       {
-        "group": "minecraft:lamps"
+        "symbol": "R",
+        "stack": {
+          "id": "minecraft:item/dust_redstone"
+        }
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 1
+      "id": "minecraft:block/rail_detector",
+      "amount": 8
     }
   },
   {
-    "name": "minecraft:workbench/orange_wooden_fence",
+    "name": "minecraft:workbench/diamond_axe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XX",
+      "X#",
+      " #"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/diamond"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 1
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_axe_diamond"
+    }
   },
   {
-    "name": "minecraft:workbench/orange_wooden_slab",
+    "name": "minecraft:workbench/diamond_boots",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X X",
+      "X X"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/diamond"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 16
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_boots_diamond"
+    }
   },
   {
-    "name": "minecraft:workbench/orange_wooden_stairs",
+    "name": "minecraft:workbench/diamond_chestplate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X X",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/diamond"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 16
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_chestplate_diamond"
+    }
   },
   {
-    "name": "minecraft:workbench/orange_wooden_fence_gate",
+    "name": "minecraft:workbench/diamond_helmet",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX",
+      "X X"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/diamond"
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 16
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_helmet_diamond"
+    }
   },
   {
-    "name": "minecraft:workbench/steel_axe",
+    "name": "minecraft:workbench/diamond_hoe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "XX",
-      "X#",
+      " #",
       " #"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/diamond"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16496,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_hoe_diamond"
+    }
   },
   {
-    "name": "minecraft:workbench/orange_wool",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:wools"
-      },
+    "name": "minecraft:workbench/diamond_leggings",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX",
+      "X X",
+      "X X"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 14
+          "id": "minecraft:item/diamond"
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 1
+      "id": "minecraft:item/armor_leggings_diamond"
     }
   },
   {
-    "name": "minecraft:workbench/orange_wooden_chest_from_planks",
+    "name": "minecraft:workbench/diamond_pickaxe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX",
+      " # ",
+      " # "
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/diamond"
         }
-      }
-    ],
-    "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 16
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/orange_wooden_chest_from_chest",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:chests"
       },
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 14
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 16
+      "id": "minecraft:item/tool_pickaxe_diamond"
     }
   },
   {
-    "name": "minecraft:workbench/orange_wooden_planks",
+    "name": "minecraft:workbench/diamond_shovel",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "X",
+      "#",
+      "#"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 14
+          "id": "minecraft:item/diamond"
         }
-      }
-    ],
-    "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 1
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/white_lamp_convert",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+      },
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/stick"
         }
-      },
-      {
-        "group": "minecraft:lamps"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:item/tool_shovel_diamond"
     }
   },
   {
-    "name": "minecraft:workbench/white_wooden_fence",
+    "name": "minecraft:workbench/diamond_sword",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "X",
+      "X",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/diamond"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_sword_diamond"
+    }
   },
   {
-    "name": "minecraft:workbench/white_wooden_slab",
+    "name": "minecraft:workbench/dispenser",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "###",
+      "#B#",
+      "#R#"
     ],
     "symbols": [
       {
         "symbol": "#",
+        "group": "minecraft:cobblestones"
+      },
+      {
+        "symbol": "B",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/tool_bow"
+        }
+      },
+      {
+        "symbol": "R",
+        "stack": {
+          "id": "minecraft:item/dust_redstone"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/dispenser_cobble_stone"
+    }
   },
   {
-    "name": "minecraft:workbench/white_wooden_stairs",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#  ",
-      "## ",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/eucalyptus_log_to_orange_wooden_planks",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/log_eucalyptus"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 4,
+      "meta": 1
+    }
   },
   {
-    "name": "minecraft:workbench/white_wooden_fence_gate",
+    "name": "minecraft:workbench/explosive_charge",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      " S ",
+      "#X#",
+      " # "
     ],
     "symbols": [
       {
-        "symbol": "X",
+        "symbol": "S",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/string"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
-      }
-    ],
-    "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 0
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/white_wooden_chest_from_planks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "# #",
-      "###"
-    ],
-    "symbols": [
+      },
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/sulphur"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:item/ammo_charge_explosive",
+      "amount": 4
+    }
+  },
+  {
+    "name": "minecraft:workbench/fence_gates_planks_undyeing",
+    "type": "minecraft:crafting/undyeing",
+    "input": {
+      "group": "minecraft:fence_gates_planks"
     },
-    "consumeContainers": true
+    "output": {
+      "id": "minecraft:block/fence_gate_planks_oak",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/white_wooden_chest_from_chest",
+    "name": "minecraft:workbench/fences_planks_undyeing",
+    "type": "minecraft:crafting/undyeing",
+    "input": {
+      "group": "minecraft:fences_planks"
+    },
+    "output": {
+      "id": "minecraft:block/fence_planks_oak",
+      "amount": 8
+    }
+  },
+  {
+    "name": "minecraft:workbench/fire_striker",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "group": "minecraft:chests"
+        "stack": {
+          "id": "minecraft:item/ingot_iron"
+        }
       },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/flint"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:item/tool_firestriker_iron"
     }
   },
   {
-    "name": "minecraft:workbench/white_wool",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/fishing_rod",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "  #",
+      " #S",
+      "# S"
+    ],
+    "symbols": [
       {
-        "group": "minecraft:wools"
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:item/stick"
+        }
       },
       {
+        "symbol": "S",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/string"
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:item/tool_fishingrod"
     }
   },
   {
-    "name": "minecraft:workbench/white_wooden_planks",
+    "name": "minecraft:workbench/flag",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#0#",
-      "###"
+      "#XX",
+      "#XX",
+      "#  "
     ],
     "symbols": [
       {
         "symbol": "#",
-        "group": "minecraft:planks"
+        "stack": {
+          "id": "minecraft:item/stick"
+        }
       },
       {
-        "symbol": "0",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/cloth"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/flag"
+    }
   },
   {
-    "name": "minecraft:workbench/flower_yellow_to_dye",
+    "name": "minecraft:workbench/flower_lightblue_to_dye",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
         "stack": {
-          "id": 330,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/flower_light_blue"
         }
       }
     ],
     "result": {
-      "id": 16479,
+      "id": "minecraft:item/dye",
       "amount": 2,
-      "meta": 11
+      "meta": 12
     }
   },
   {
-    "name": "minecraft:workbench/flower_red_to_dye",
+    "name": "minecraft:workbench/flower_orange_to_dye",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
         "stack": {
-          "id": 331,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/flower_orange"
         }
       }
     ],
     "result": {
-      "id": 16479,
+      "id": "minecraft:item/dye",
       "amount": 2,
-      "meta": 1
+      "meta": 14
     }
   },
   {
@@ -3992,16 +3190,14 @@
     "inputs": [
       {
         "stack": {
-          "key": "tile.flower.pink",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/flower_pink"
         }
       }
     ],
     "result": {
-      "key": "item.dye",
+      "id": "minecraft:item/dye",
       "amount": 2,
-      "meta":9
+      "meta": 9
     }
   },
   {
@@ -4010,476 +3206,386 @@
     "inputs": [
       {
         "stack": {
-          "key": "tile.flower.purple",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/flower_purple"
         }
       }
     ],
     "result": {
-      "key": "item.dye",
+      "id": "minecraft:item/dye",
       "amount": 2,
-      "meta":5
+      "meta": 5
     }
   },
   {
-    "name": "minecraft:workbench/flower_lightblue_to_dye",
+    "name": "minecraft:workbench/flower_red_to_dye",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
         "stack": {
-          "key": "tile.flower.lightblue",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/flower_red"
         }
       }
     ],
     "result": {
-      "key": "item.dye",
+      "id": "minecraft:item/dye",
       "amount": 2,
-      "meta":12
+      "meta": 1
     }
   },
   {
-    "name": "minecraft:workbench/flower_orange_to_dye",
+    "name": "minecraft:workbench/flower_yellow_to_dye",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
         "stack": {
-          "key": "tile.flower.orange",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/flower_yellow"
         }
       }
     ],
     "result": {
-      "key": "item.dye",
+      "id": "minecraft:item/dye",
       "amount": 2,
-      "meta":14
+      "meta": 11
     }
   },
   {
-    "name": "minecraft:workbench/bone_to_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/furnace",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "# #",
+      "###"
+    ],
+    "symbols": [
       {
-        "stack": {
-          "id": 16480,
-          "amount": 1,
-          "meta": 0
-        }
+        "symbol": "#",
+        "group": "minecraft:cobblestones"
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 3,
-      "meta": 15
+      "id": "minecraft:block/furnace_stone_idle"
     }
   },
   {
-    "name": "minecraft:workbench/red_dye_white_dye_to_pink_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
-        }
-      },
+    "name": "minecraft:workbench/glass_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XX",
+      "XX",
+      "XX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:block/glass"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 2,
-      "meta": 9
+      "id": "minecraft:item/door_glass",
+      "amount": 2
     }
   },
   {
-    "name": "minecraft:workbench/red_dye_yellow_dye_to_orange_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
-        }
-      },
+    "name": "minecraft:workbench/glass_trapdoor",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX",
+      "XXX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:block/glass"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 2,
-      "meta": 14
+      "id": "minecraft:block/trapdoor_glass",
+      "amount": 6
     }
   },
   {
-    "name": "minecraft:workbench/green_dye_white_dye_to_lime_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 2
-        }
-      },
+    "name": "minecraft:workbench/glowstone",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##"
+    ],
+    "symbols": [
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/dust_glowstone"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 2,
-      "meta": 10
+      "id": "minecraft:block/glowstone"
     }
   },
   {
-    "name": "minecraft:workbench/black_dye_white_dye_to_gray_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/golden_apple",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX",
+      "X#X",
+      "XXX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/block_gold"
         }
       },
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/food_apple"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 2,
-      "meta": 8
+      "id": "minecraft:item/food_apple_gold"
     }
   },
   {
-    "name": "minecraft:workbench/gray_dye_white_dye_to_light_gray_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/golden_arrow",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      " X ",
+      "X#X",
+      " X "
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:item/ammo_arrow"
         }
       },
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/ingot_gold"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 2,
-      "meta": 7
+      "id": "minecraft:item/ammo_arrow_gold",
+      "amount": 4
     }
   },
   {
-    "name": "minecraft:workbench/shears",
+    "name": "minecraft:workbench/golden_axe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      " #",
-      "# "
+      "XX",
+      "X#",
+      " #"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/ingot_gold"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16487,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_axe_gold"
+    }
   },
   {
-    "name": "minecraft:workbench/black_dye_gray_dye_gray_dye_to_light_gray_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
-        }
-      },
+    "name": "minecraft:workbench/golden_boots",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X X",
+      "X X"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/ingot_gold"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 3,
-      "meta": 7
+      "id": "minecraft:item/armor_boots_gold"
     }
   },
   {
-    "name": "minecraft:workbench/blue_dye_white_dye_to_light_blue_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/golden_bricks",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XX",
+      "XX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
-        }
-      },
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/ingot_gold"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 2,
-      "meta": 12
+      "id": "minecraft:block/brick_gold",
+      "amount": 4
     }
   },
   {
-    "name": "minecraft:workbench/blue_dye_green_dye_to_cyan_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
-        }
-      },
+    "name": "minecraft:workbench/golden_chestplate",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X X",
+      "XXX",
+      "XXX"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:item/ingot_gold"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 2,
-      "meta": 6
+      "id": "minecraft:item/armor_chestplate_gold"
     }
   },
   {
-    "name": "minecraft:workbench/blue_dye_red_dye_to_purple_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
-        }
-      },
+    "name": "minecraft:workbench/golden_helmet",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX",
+      "X X"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/ingot_gold"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 2,
-      "meta": 5
+      "id": "minecraft:item/armor_helmet_gold"
     }
   },
   {
-    "name": "minecraft:workbench/purple_dye_pink_dye_to_magenta_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/golden_hoe",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XX",
+      " #",
+      " #"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:item/ingot_gold"
         }
       },
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 2,
-      "meta": 13
+      "id": "minecraft:item/tool_hoe_gold"
     }
   },
   {
-    "name": "minecraft:workbench/blue_dye_red_dye_pink_dye_to_magenta_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
-        }
-      },
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
-        }
-      },
+    "name": "minecraft:workbench/golden_leggings",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX",
+      "X X",
+      "X X"
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:item/ingot_gold"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 3,
-      "meta": 13
+      "id": "minecraft:item/armor_leggings_gold"
     }
   },
   {
-    "name": "minecraft:workbench/blue_dye_red_dye_red_dye_white_dye_to_magenta_dye",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
-        }
-      },
-      {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
-        }
-      },
+    "name": "minecraft:workbench/golden_pickaxe",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX",
+      " # ",
+      " # "
+    ],
+    "symbols": [
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/ingot_gold"
         }
       },
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 4,
-      "meta": 13
+      "id": "minecraft:item/tool_pickaxe_gold"
     }
   },
   {
-    "name": "minecraft:workbench/marble_pillar",
+    "name": "minecraft:workbench/golden_shovel",
     "type": "minecraft:crafting/shaped",
     "pattern": [
+      "X",
       "#",
       "#"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 5,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_gold"
         }
-      }
-    ],
-    "result": {
-      "id": 20,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/sandstone",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##"
-    ],
-    "symbols": [
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 250,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 30,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_shovel_gold"
+    }
   },
   {
-    "name": "minecraft:workbench/torch_coal",
+    "name": "minecraft:workbench/golden_sword",
     "type": "minecraft:crafting/shaped",
     "pattern": [
+      "X",
       "X",
       "#"
     ],
@@ -4487,294 +3593,262 @@
       {
         "symbol": "X",
         "stack": {
-          "id": 16391,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_gold"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 60,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_sword_gold"
+    }
   },
   {
-    "name": "minecraft:workbench/steel_shears",
+    "name": "minecraft:workbench/granite_brick_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      " #",
-      "# "
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_granite"
         }
       }
     ],
     "result": {
-      "id": 16528,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_granite",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/oak_log_to_wooden_planks",
+    "name": "minecraft:workbench/granite_brick_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 280,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_granite"
         }
       }
     ],
     "result": {
-      "id": 50,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_granite",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/pine_log_to_brown_wooden_planks",
+    "name": "minecraft:workbench/granite_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 281,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/granite"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 4,
-      "meta": 12
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_granite",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/birch_log_to_white_wooden_planks",
+    "name": "minecraft:workbench/granite_to_polished_granite",
     "type": "minecraft:crafting/shaped",
     "pattern": [
+      "#",
       "#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 282,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/granite"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/granite_polished",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/mossy_oak_log_to_green_wooden_planks",
+    "name": "minecraft:workbench/gravel_from_flint_and_pebbles",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "FPF",
+      "PFP",
+      "FPF"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "F",
         "stack": {
-          "id": 285,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/flint"
+        }
+      },
+      {
+        "symbol": "P",
+        "stack": {
+          "id": "minecraft:item/ammo_pebble"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 4,
-      "meta": 13
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/gravel"
+    }
   },
   {
-    "name": "minecraft:workbench/eucalyptus_log_to_orange_wooden_planks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/gray_dye_white_dye_to_light_gray_dye",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 8
+        }
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 284,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 4,
-      "meta": 1
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/dye",
+      "amount": 2,
+      "meta": 7
+    }
   },
   {
-    "name": "minecraft:workbench/cherry_log_to_pink_wooden_planks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/gray_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 283,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 4,
-      "meta": 6
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 7
+    }
   },
   {
-    "name": "minecraft:workbench/thorn_log_to_red_wooden_planks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/gray_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:chests"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 286,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 4,
-      "meta": 14
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 112
+    }
   },
   {
-    "name": "minecraft:workbench/palm_log_to_yellow_wooden_planks",
+    "name": "minecraft:workbench/gray_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 287,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 4,
-      "meta": 4
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 112
+    }
   },
   {
-    "name": "minecraft:workbench/ladder",
+    "name": "minecraft:workbench/gray_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "# #",
-      "###",
-      "# #"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 70,
+      "id": "minecraft:item/door_oak_painted",
       "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 8
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_fence",
+    "name": "minecraft:workbench/gray_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#X#",
-      "#X#"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 50,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 7
         }
       },
       {
-        "symbol": "X",
+        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 80,
+      "id": "minecraft:block/fence_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 7
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_fence_gate",
+    "name": "minecraft:workbench/gray_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "#X#",
@@ -4784,2192 +3858,1954 @@
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       },
       {
         "symbol": "X",
         "stack": {
-          "id": 50,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 90,
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
       "amount": 3,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 112
+    }
   },
   {
-    "name": "minecraft:workbench/bookshelf",
+    "name": "minecraft:workbench/gray_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
       "XXX",
-      "###"
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "group": "minecraft:planks"
       },
       {
-        "symbol": "X",
+        "symbol": "D",
         "stack": {
-          "id": 16468,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 100,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 7
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_sword",
+    "name": "minecraft:workbench/gray_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "X",
-      "#"
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 16396,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 112
+    }
   },
   {
-    "name": "minecraft:workbench/string_to_wool",
+    "name": "minecraft:workbench/gray_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16415,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 112
+    }
   },
   {
-    "name": "minecraft:workbench/clay_bricks",
+    "name": "minecraft:workbench/gray_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16464,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 120,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 112
+    }
   },
   {
-    "name": "minecraft:workbench/golden_bricks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/gray_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:wools"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 124,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/wool",
+      "meta": 7
+    }
   },
   {
-    "name": "minecraft:workbench/iron_bricks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/green_dye_white_dye_to_lime_dye",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 2
+        }
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 133,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/dye",
+      "amount": 2,
+      "meta": 10
+    }
   },
   {
-    "name": "minecraft:workbench/polished_stone_bricks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/green_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 860,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 2
         }
       }
     ],
     "result": {
-      "id": 121,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 13
+    }
   },
   {
-    "name": "minecraft:workbench/stone_bricks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/green_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:chests"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 1,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 2
         }
       }
     ],
     "result": {
-      "id": 131,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 208
+    }
   },
   {
-    "name": "minecraft:workbench/sandstone_bricks",
+    "name": "minecraft:workbench/green_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 30,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 13
         }
       }
     ],
     "result": {
-      "id": 123,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 208
+    }
   },
   {
-    "name": "minecraft:workbench/lapis_lazuli_bricks",
+    "name": "minecraft:workbench/green_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 13
         }
       }
     ],
     "result": {
-      "id": 125,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 2
+    }
   },
   {
-    "name": "minecraft:workbench/basalt_bricks",
+    "name": "minecraft:workbench/green_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 13
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 2,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 126,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6,
+      "meta": 13
+    }
   },
   {
-    "name": "minecraft:workbench/limestone_bricks",
+    "name": "minecraft:workbench/green_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 3,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 13
         }
       }
     ],
     "result": {
-      "id": 127,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 208
+    }
   },
   {
-    "name": "minecraft:workbench/stone_sword",
+    "name": "minecraft:workbench/green_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "X",
-      "#"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
-		"group": "minecraft:cobblestones"
+        "group": "minecraft:planks"
       },
       {
-        "symbol": "#",
+        "symbol": "D",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 2
         }
       }
     ],
     "result": {
-      "id": 16400,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 13
+    }
   },
   {
-    "name": "minecraft:workbench/granite_bricks",
+    "name": "minecraft:workbench/green_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 4,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 13
         }
       }
     ],
     "result": {
-      "id": 128,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 208
+    }
   },
   {
-    "name": "minecraft:workbench/marble_bricks",
+    "name": "minecraft:workbench/green_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 5,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 13
         }
       }
     ],
     "result": {
-      "id": 129,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 208
+    }
   },
   {
-    "name": "minecraft:workbench/slate_bricks",
+    "name": "minecraft:workbench/green_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 6,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 13
         }
       }
     ],
     "result": {
-      "id": 130,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 208
+    }
   },
   {
-    "name": "minecraft:workbench/permafrost_bricks",
+    "name": "minecraft:workbench/green_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:wools"
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 2
+        }
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/wool",
+      "meta": 13
+    }
+  },
+  {
+    "name": "minecraft:workbench/hand_cannon",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "X  ",
+      "#X ",
+      " #O"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "group": "minecraft:logs"
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 7,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
+        }
+      },
+      {
+        "symbol": "O",
+        "stack": {
+          "id": "minecraft:item/tool_bow"
         }
       }
     ],
     "result": {
-      "id": 132,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/handcannon_unloaded"
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_slab",
+    "name": "minecraft:workbench/ice_cream_bucket",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      " Y ",
+      "#O#",
+      " X "
     ],
     "symbols": [
+      {
+        "symbol": "Y",
+        "stack": {
+          "id": "minecraft:item/food_cherry"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 50,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ammo_snowball"
+        }
+      },
+      {
+        "symbol": "O",
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 3
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/bucket"
         }
       }
     ],
     "result": {
-      "id": 140,
-      "amount": 6,
-      "meta": 0
+      "id": "minecraft:item/bucket_icecream"
     },
     "consumeContainers": true
   },
   {
-    "name": "minecraft:workbench/cobblestone_slab",
+    "name": "minecraft:workbench/iron_axe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XX",
+      "X#",
+      " #"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/ingot_iron"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 10,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 141,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_axe_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/sandstone_slab",
+    "name": "minecraft:workbench/iron_boots",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X X",
+      "X X"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 30,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "id": 142,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_boots_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/cobbled_permafrost_slab",
+    "name": "minecraft:workbench/iron_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "key": "tile.cobble.permafrost",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "key": "tile.slab.cobble.permafrost",
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_iron",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/brick_sandstone_slab",
+    "name": "minecraft:workbench/iron_chestplate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X X",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "key": "tile.brick.sandstone",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "key": "tile.slab.brick.sandstone",
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_chestplate_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/brick_permafrost_slab",
+    "name": "minecraft:workbench/iron_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "key": "tile.brick.permafrost",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "key": "tile.slab.brick.permafrost",
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_iron",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/polished_stone_brick_slab",
+    "name": "minecraft:workbench/iron_helmet",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX",
+      "X X"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 121,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "id": 143,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_helmet_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/polished_stone_slab",
+    "name": "minecraft:workbench/iron_hoe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XX",
+      " #",
+      " #"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/ingot_iron"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 860,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 144,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_hoe_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/polished_permafrost_slab",
+    "name": "minecraft:workbench/iron_leggings",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX",
+      "X X",
+      "X X"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "key": "tile.permafrost.polished",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "key": "tile.slab.permafrost.carved",
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_leggings_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/polished_granite_slab",
+    "name": "minecraft:workbench/iron_pickaxe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX",
+      " # ",
+      " # "
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/ingot_iron"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 861,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 157,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_pickaxe_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/iron_sword",
+    "name": "minecraft:workbench/iron_shovel",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "X",
-      "X",
+      "#",
       "#"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16395,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_shovel_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/polished_basalt_slab",
+    "name": "minecraft:workbench/iron_sword",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X",
+      "X",
+      "#"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/ingot_iron"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 863,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 159,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_sword_iron"
+    }
   },
   {
-    "name": "minecraft:workbench/polished_limestone_slab",
+    "name": "minecraft:workbench/iron_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 862,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "id": 158,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_iron",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/marble_brick_slab",
+    "name": "minecraft:workbench/jar",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "# #",
+      " # "
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 129,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/glass"
         }
       }
     ],
     "result": {
-      "id": 145,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/jar",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/clay_brick_slab",
+    "name": "minecraft:workbench/jukebox",
     "type": "minecraft:crafting/shaped",
     "pattern": [
+      "###",
+      "#D#",
       "###"
     ],
     "symbols": [
       {
         "symbol": "#",
+        "group": "minecraft:planks"
+      },
+      {
+        "symbol": "D",
         "stack": {
-          "id": 120,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/diamond"
         }
       }
     ],
     "result": {
-      "id": 146,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/jukebox"
+    }
   },
   {
-    "name": "minecraft:workbench/marble_slab",
+    "name": "minecraft:workbench/ladder",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X X",
+      "XXX",
+      "X X"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 5,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 147,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/ladder_oak",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/cobbled_basalt_slab",
+    "name": "minecraft:workbench/lamp",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "###",
+      "#O#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 12,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/glass"
+        }
+      },
+      {
+        "symbol": "O",
+        "stack": {
+          "id": "minecraft:item/quartz"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/dust_redstone"
         }
       }
     ],
     "result": {
-      "id": 148,
-      "amount": 6,
-      "meta": 0
+      "id": "minecraft:block/lamp_idle",
+      "amount": 4
+    }
+  },
+  {
+    "name": "minecraft:workbench/lamps_undyeing",
+    "type": "minecraft:crafting/undyeing",
+    "input": {
+      "group": "minecraft:lamps"
     },
-    "consumeContainers": true
+    "output": {
+      "id": "minecraft:block/lamp_idle",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/cobbled_limestone_slab",
+    "name": "minecraft:workbench/lapis_lazuli_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 13,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 149,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_lapis",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/cobbled_granite_slab",
+    "name": "minecraft:workbench/leather_boots",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X X",
+      "X X"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 14,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/leather"
         }
       }
     ],
     "result": {
-      "id": 150,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_boots_leather"
+    }
   },
   {
-    "name": "minecraft:workbench/basalt_brick_slab",
+    "name": "minecraft:workbench/leather_chestplate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X X",
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 126,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/leather"
         }
       }
     ],
     "result": {
-      "id": 151,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_chestplate_leather"
+    }
   },
   {
-    "name": "minecraft:workbench/limestone_brick_slab",
+    "name": "minecraft:workbench/leather_helmet",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX",
+      "X X"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 127,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/leather"
         }
       }
     ],
     "result": {
-      "id": 152,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_helmet_leather"
+    }
   },
   {
-    "name": "minecraft:workbench/diamond_sword",
+    "name": "minecraft:workbench/leather_leggings",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "X",
-      "#"
+      "XXX",
+      "X X",
+      "X X"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/leather"
         }
       }
     ],
     "result": {
-      "id": 16404,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_leggings_leather"
+    }
   },
   {
-    "name": "minecraft:workbench/granite_brick_slab",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/lightblue_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 128,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 12
         }
       }
     ],
     "result": {
-      "id": 153,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 3
+    }
   },
   {
-    "name": "minecraft:workbench/stone_brick_slab",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/lightblue_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:chests"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 131,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 12
         }
       }
     ],
     "result": {
-      "id": 156,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 48
+    }
   },
   {
-    "name": "minecraft:workbench/slate_brick_slab",
+    "name": "minecraft:workbench/lightblue_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 130,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "id": 155,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 48
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_stairs",
+    "name": "minecraft:workbench/lightblue_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 50,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "id": 160,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 12
+    }
   },
   {
-    "name": "minecraft:workbench/cobblestone_stairs",
+    "name": "minecraft:workbench/lightblue_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 3
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 10,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 161,
+      "id": "minecraft:block/fence_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 3
+    }
   },
   {
-    "name": "minecraft:workbench/cobblestone_permafrost_stairs",
+    "name": "minecraft:workbench/lightblue_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "key": "tile.cobble.permafrost",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "key": "tile.stairs.cobble.permafrost",
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 48
+    }
   },
   {
-    "name": "minecraft:workbench/brick_permafrost_stairs",
+    "name": "minecraft:workbench/lightblue_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
+      {
+        "symbol": "D",
         "stack": {
-          "key": "tile.brick.permafrost",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 12
         }
       }
     ],
     "result": {
-      "key": "tile.stairs.brick.permafrost",
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 3
+    }
   },
   {
-    "name": "minecraft:workbench/brick_sandstone_stairs",
+    "name": "minecraft:workbench/lightblue_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "key": "tile.brick.sandstone",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "key": "tile.stairs.brick.sandstone",
+      "id": "minecraft:block/slab_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 48
+    }
   },
   {
-    "name": "minecraft:workbench/sandstone_stairs",
+    "name": "minecraft:workbench/lightblue_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "key": "tile.sandstone",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "key": "tile.stairs.sandstone",
+      "id": "minecraft:block/stairs_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 48
+    }
   },
   {
-    "name": "minecraft:workbench/polished_stone_brick_stairs",
+    "name": "minecraft:workbench/lightblue_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 121,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 3
         }
       }
     ],
     "result": {
-      "id": 162,
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 48
+    }
   },
   {
-    "name": "minecraft:workbench/marble_brick_stairs",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#  ",
-      "## ",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/lightblue_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:wools"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 129,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 12
         }
       }
     ],
     "result": {
-      "id": 163,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/wool",
+      "meta": 3
+    }
   },
   {
-    "name": "minecraft:workbench/cobbled_basalt_stairs",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#  ",
-      "## ",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/lime_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 12,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 10
         }
       }
     ],
     "result": {
-      "id": 164,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 5
+    }
   },
   {
-    "name": "minecraft:workbench/cobbled_limestone_stairs",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#  ",
-      "## ",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/lime_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:chests"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 13,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 10
         }
       }
     ],
     "result": {
-      "id": 165,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 80
+    }
   },
   {
-    "name": "minecraft:workbench/cobbled_granite_stairs",
+    "name": "minecraft:workbench/lime_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 14,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 5
         }
       }
     ],
     "result": {
-      "id": 166,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 80
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_hoe",
+    "name": "minecraft:workbench/lime_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "XX",
-      " #",
-      " #"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 5
         }
       }
     ],
     "result": {
-      "id": 16418,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 10
+    }
   },
   {
-    "name": "minecraft:workbench/steel_hoe",
+    "name": "minecraft:workbench/lime_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XX",
-      " #",
-      " #"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 5
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16497,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6,
+      "meta": 5
+    }
   },
   {
-    "name": "minecraft:workbench/golden_sword",
+    "name": "minecraft:workbench/lime_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "X",
-      "#"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
-        "symbol": "X",
+        "symbol": "#",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       },
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 5
         }
       }
     ],
     "result": {
-      "id": 16411,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 80
+    }
   },
   {
-    "name": "minecraft:workbench/basalt_brick_stairs",
+    "name": "minecraft:workbench/lime_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
+      {
+        "symbol": "D",
         "stack": {
-          "id": 126,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 10
         }
       }
     ],
     "result": {
-      "id": 167,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 5
+    }
   },
   {
-    "name": "minecraft:workbench/limestone_brick_stairs",
+    "name": "minecraft:workbench/lime_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 127,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 5
         }
       }
     ],
     "result": {
-      "id": 168,
+      "id": "minecraft:block/slab_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 80
+    }
   },
   {
-    "name": "minecraft:workbench/granite_brick_stairs",
+    "name": "minecraft:workbench/lime_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 128,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 5
         }
       }
     ],
     "result": {
-      "id": 169,
+      "id": "minecraft:block/stairs_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 80
+    }
   },
   {
-    "name": "minecraft:workbench/clay_brick_stairs",
+    "name": "minecraft:workbench/lime_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 120,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 5
         }
       }
     ],
     "result": {
-      "id": 170,
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 80
+    }
   },
   {
-    "name": "minecraft:workbench/stone_brick_stairs",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#  ",
-      "## ",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/lime_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:wools"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 131,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 10
         }
       }
     ],
     "result": {
-      "id": 173,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/wool",
+      "meta": 5
+    }
   },
   {
-    "name": "minecraft:workbench/slate_brick_stairs",
+    "name": "minecraft:workbench/limestone_brick_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 130,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_limestone"
         }
       }
     ],
     "result": {
-      "id": 172,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_limestone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/redstone_torch",
+    "name": "minecraft:workbench/limestone_brick_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "#"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_limestone"
         }
       }
     ],
     "result": {
-      "id": 461,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_limestone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/stone_button",
+    "name": "minecraft:workbench/limestone_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:stones"
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/limestone"
+        }
       }
     ],
     "result": {
-      "id": 470,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_limestone",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/cobblestone_lever",
+    "name": "minecraft:workbench/limestone_to_polished_limestone",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
+      "#",
       "#"
     ],
     "symbols": [
       {
-        "symbol": "X",
+        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/limestone"
         }
-      },
-      {
-        "symbol": "#",
-        "group": "minecraft:cobblestones"
       }
     ],
     "result": {
-      "id": 480,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/limestone_polished",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/stone_pressure_plate",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/magenta_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
-        "group": "minecraft:stones"
+        "group": "minecraft:lamps"
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 13
+        }
       }
     ],
     "result": {
-      "id": 490,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 2
+    }
   },
   {
-    "name": "minecraft:workbench/steel_sword",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X",
-      "X",
-      "#"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/magenta_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "X",
-        "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:chests"
       },
       {
-        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 13
         }
       }
     ],
     "result": {
-      "id": 16493,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 32
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_pressure_plate",
+    "name": "minecraft:workbench/magenta_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 2
+        }
       }
     ],
     "result": {
-      "id": 491,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 32
+    }
   },
   {
-    "name": "minecraft:workbench/cobblestone_pressure_plate",
+    "name": "minecraft:workbench/magenta_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:cobblestones"
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 2
+        }
       }
     ],
     "result": {
-      "id": 492,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 13
+    }
   },
   {
-    "name": "minecraft:workbench/piston",
+    "name": "minecraft:workbench/magenta_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "TTT",
-      "#X#",
-      "#R#"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
-      {
-        "symbol": "T",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "#",
-        "group": "minecraft:cobblestones"
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 2
         }
       },
       {
-        "symbol": "R",
+        "symbol": "#",
         "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 520,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6,
+      "meta": 2
+    }
   },
   {
-    "name": "minecraft:workbench/sticky_piston",
+    "name": "minecraft:workbench/magenta_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "S",
-      "P"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
-        "symbol": "S",
+        "symbol": "#",
         "stack": {
-          "id": 16469,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       },
       {
-        "symbol": "P",
+        "symbol": "X",
         "stack": {
-          "id": 520,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 2
         }
       }
     ],
     "result": {
-      "id": 521,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 32
+    }
   },
   {
-    "name": "minecraft:workbench/note_block",
+    "name": "minecraft:workbench/magenta_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#X#",
-      "###"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "group": "minecraft:planks"
       },
       {
-        "symbol": "X",
+        "symbol": "D",
         "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 13
         }
       }
     ],
     "result": {
-      "id": 530,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 2
+    }
   },
   {
-    "name": "minecraft:workbench/rail",
+    "name": "minecraft:workbench/magenta_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
-      "X#X",
-      "X X"
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 2
         }
       }
     ],
     "result": {
-      "id": 540,
-      "amount": 16,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 32
+    }
   },
   {
-    "name": "minecraft:workbench/powered_rail",
+    "name": "minecraft:workbench/magenta_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
-      "X#X",
-      "XRX"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "R",
-        "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 2
         }
       }
     ],
     "result": {
-      "id": 541,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 32
+    }
   },
   {
-    "name": "minecraft:workbench/iron_rail",
+    "name": "minecraft:workbench/magenta_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
-      "X#X",
-      "XRX"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 2
         }
-      },
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 32
+    }
+  },
+  {
+    "name": "minecraft:workbench/magenta_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
-        "stack": {
-          "id": 490,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:wools"
       },
       {
-        "symbol": "R",
         "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 13
         }
       }
     ],
     "result": {
-      "id": 542,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/wool",
+      "meta": 2
+    }
   },
   {
-    "name": "minecraft:workbench/spikes",
+    "name": "minecraft:workbench/map",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      " # ",
-      "#X#",
-      "YYY"
+      "###",
+      "###",
+      "###"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "X",
-        "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/paper"
         }
-      },
-      {
-        "symbol": "Y",
-        "group": "minecraft:cobblestones"
       }
     ],
     "result": {
-      "id": 550,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/map"
+    }
   },
   {
-    "name": "minecraft:workbench/dispenser",
+    "name": "minecraft:workbench/marble_brick_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#X#",
-      "#R#"
+      "XXX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "group": "minecraft:cobblestones"
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16389,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "R",
-        "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_marble"
         }
       }
     ],
     "result": {
-      "id": 560,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_marble",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/bow",
+    "name": "minecraft:workbench/marble_brick_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      " #X",
-      "# X",
-      " #X"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16415,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_marble"
         }
       }
     ],
     "result": {
-      "id": 16389,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_marble",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_trapdoor",
+    "name": "minecraft:workbench/marble_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "key": "tile.planks.oak",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/marble"
         }
       }
     ],
     "result": {
-      "id": 570,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_marble",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/iron_trapdoor",
+    "name": "minecraft:workbench/marble_pillar",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "#",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/marble"
         }
       }
     ],
     "result": {
-      "id": 571,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/pillar_marble",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/steel_trapdoor",
+    "name": "minecraft:workbench/marble_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": "minecraft:item/ingot_steel",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/marble"
         }
       }
     ],
     "result": {
-      "id": "minecraft:block/trapdoor_steel",
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_capstone_marble",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/glass_trapdoor",
+    "name": "minecraft:workbench/mesh",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 190,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "id": 572,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/mesh",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/tnt",
+    "name": "minecraft:workbench/mesh_gold",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "#X#",
-      "X#X"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16417,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 250,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_gold"
         }
       }
     ],
     "result": {
-      "id": 580,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/mesh_gold",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/mesh",
+    "name": "minecraft:workbench/minecart",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
       "# #",
       "###"
     ],
@@ -6977,211 +5813,166 @@
       {
         "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "id": 600,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/minecart"
+    }
   },
   {
-    "name": "minecraft:workbench/mesh_gold",
+    "name": "minecraft:workbench/minecart_with_chest",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "A",
+      "B"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "A",
+        "group": "minecraft:chests"
+      },
+      {
+        "symbol": "B",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/minecart"
         }
       }
     ],
     "result": {
-      "id": 601,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/minecart_chest"
+    }
   },
   {
-    "name": "minecraft:workbench/cobweb",
+    "name": "minecraft:workbench/minecart_with_furnace",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###",
-      "###"
+      "A",
+      "B"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "A",
         "stack": {
-          "id": 16415,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/furnace_stone_idle"
+        }
+      },
+      {
+        "symbol": "B",
+        "stack": {
+          "id": "minecraft:item/minecart"
         }
       }
     ],
     "result": {
-      "id": 620,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/minecart_furnace"
+    }
   },
   {
-    "name": "minecraft:workbench/snow_block",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/mossy_oak_log_to_green_wooden_planks",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 16460,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/log_oak_mossy"
         }
       }
     ],
     "result": {
-      "id": 740,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 4,
+      "meta": 13
+    }
   },
   {
-    "name": "minecraft:workbench/clay_block",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/mushroom_stew",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 16465,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/bowl"
+        }
+      },
+      {
+        "stack": {
+          "id": "minecraft:block/mushroom_brown"
+        }
+      },
+      {
+        "stack": {
+          "id": "minecraft:block/mushroom_red"
         }
       }
     ],
     "result": {
-      "id": 760,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/food_stew_mushroom"
+    }
   },
   {
-    "name": "minecraft:workbench/jukebox",
+    "name": "minecraft:workbench/netherrack_brick_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#X#",
-      "###"
+      "XXX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_netherrack"
         }
       }
     ],
     "result": {
-      "id": 780,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_netherrack",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/paper",
+    "name": "minecraft:workbench/netherrack_brick_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16466,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_netherrack"
         }
       }
     ],
     "result": {
-      "id": 16467,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_netherrack",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/hand_cannon",
+    "name": "minecraft:workbench/netherrack_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X  ",
-      "#X ",
-      " #O"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "group": "minecraft:logs"
-      },
-      {
-        "symbol": "#",
         "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "O",
-        "stack": {
-          "id": 16389,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/netherrack"
         }
       }
     ],
     "result": {
-      "id": 16502,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_netherrack",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/book",
+    "name": "minecraft:workbench/netherrack_to_polished_netherrack",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#",
       "#",
       "#"
     ],
@@ -7189,2680 +5980,2523 @@
       {
         "symbol": "#",
         "stack": {
-          "id": 16467,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/netherrack"
         }
       }
     ],
     "result": {
-      "id": 16468,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/netherrack_polished",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/pumpkin_to_pumpkin_seeds",
+    "name": "minecraft:workbench/note_block",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "XXX",
+      "XRX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
+      {
+        "symbol": "R",
         "stack": {
-          "id": 790,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dust_redstone"
         }
       }
     ],
     "result": {
-      "id": 16530,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/noteblock"
+    }
   },
   {
-    "name": "minecraft:workbench/carved_pumpkin_to_jack_o_lantern",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "A",
-      "B"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/oak_leaves_to_leaf_pile",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "A",
         "stack": {
-          "id": 791,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/leaves_oak"
         }
-      },
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/layer_leaves_oak",
+      "amount": 8
+    }
+  },
+  {
+    "name": "minecraft:workbench/oak_log_to_wooden_planks",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "B",
         "stack": {
-          "id": 60,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/log_oak"
         }
       }
     ],
     "result": {
-      "id": 792,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/carved_pumpkin_to_redstone_jack_o_lantern",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "A",
-      "B"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/orange_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
       {
-        "symbol": "A",
         "stack": {
-          "id": 791,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 14
         }
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/lamp_idle",
+      "meta": 1
+    }
+  },
+  {
+    "name": "minecraft:workbench/orange_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:chests"
       },
       {
-        "symbol": "B",
         "stack": {
-          "id": 461,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 14
         }
       }
     ],
     "result": {
-      "id": 793,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 16
+    }
   },
   {
-    "name": "minecraft:workbench/glowstone",
+    "name": "minecraft:workbench/orange_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16476,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 1
         }
       }
     ],
     "result": {
-      "id": 820,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 16
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_door",
+    "name": "minecraft:workbench/orange_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "key": "tile.planks.oak",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 1
         }
       }
     ],
     "result": {
-      "id": 16452,
+      "id": "minecraft:item/door_oak_painted",
       "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 14
+    }
   },
   {
-    "name": "minecraft:workbench/iron_door",
+    "name": "minecraft:workbench/orange_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 1
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16458,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6,
+      "meta": 1
+    }
   },
   {
-    "name": "minecraft:workbench/steel_door",
+    "name": "minecraft:workbench/orange_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": "minecraft:item/ingot_steel",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 1
         }
       }
     ],
     "result": {
-      "id": "minecraft:item/door_steel",
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 16
+    }
   },
   {
-    "name": "minecraft:workbench/sign",
+    "name": "minecraft:workbench/orange_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###",
-      " X "
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "group": "minecraft:planks"
       },
       {
-        "symbol": "X",
+        "symbol": "D",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 14
         }
       }
     ],
     "result": {
-      "id": 16451,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 1
+    }
   },
   {
-    "name": "minecraft:workbench/cake",
+    "name": "minecraft:workbench/orange_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "AAA",
-      "BEB",
-      "CCC"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "A",
+        "symbol": "X",
         "stack": {
-          "id": 16463,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 1
         }
-      },
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 16
+    }
+  },
+  {
+    "name": "minecraft:workbench/orange_wooden_stairs",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X  ",
+      "XX ",
+      "XXX"
+    ],
+    "symbols": [
       {
-        "symbol": "B",
+        "symbol": "X",
         "stack": {
-          "id": 16481,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 1
         }
-      },
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 16
+    }
+  },
+  {
+    "name": "minecraft:workbench/orange_wooden_trapdoor",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XXX",
+      "XXX"
+    ],
+    "symbols": [
       {
-        "symbol": "E",
+        "symbol": "X",
         "stack": {
-          "id": 16472,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 1
         }
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 16
+    }
+  },
+  {
+    "name": "minecraft:workbench/orange_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:wools"
       },
       {
-        "symbol": "C",
         "stack": {
-          "id": 16424,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 14
         }
       }
     ],
     "result": {
-      "id": 16482,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": false
+      "id": "minecraft:block/wool",
+      "meta": 1
+    }
   },
-
   {
-    "name": "minecraft:workbench/pumpkin_pie",
+    "name": "minecraft:workbench/paintbrush",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "AAA",
-      "BEB",
-      "CCC"
+      "X",
+      "Y",
+      "Z"
     ],
     "symbols": [
       {
-        "symbol": "A",
-        "stack": {
-          "id": 16463,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "B",
+        "symbol": "X",
         "stack": {
-          "id": 16481,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/feather_chicken"
         }
       },
       {
-        "symbol": "E",
+        "symbol": "Y",
         "stack": {
-          "key": "tile.pumpkin",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       },
       {
-        "symbol": "C",
+        "symbol": "Z",
         "stack": {
-          "id": 16424,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "key": "item.food.pumpkin_pie",
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": false
+      "id": "minecraft:item/paintbrush",
+      "meta": 64
+    }
   },
   {
-    "name": "minecraft:workbench/arrow",
+    "name": "minecraft:workbench/painting",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "#",
-      "Y"
+      "XXX",
+      "XWX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16446,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       },
       {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
+        "symbol": "W",
+        "group": "minecraft:wools"
+      }
+    ],
+    "result": {
+      "id": "minecraft:item/painting"
+    }
+  },
+  {
+    "name": "minecraft:workbench/palm_log_to_yellow_wooden_planks",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "Y",
         "stack": {
-          "id": 16416,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/log_palm"
         }
       }
     ],
     "result": {
-      "id": 16390,
+      "id": "minecraft:block/planks_oak_painted",
       "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 4
+    }
   },
   {
-    "name": "minecraft:workbench/sugar_cane_to_sugar",
+    "name": "minecraft:workbench/paper",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "###"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 16466,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/sugarcane"
         }
       }
     ],
     "result": {
-      "id": 16481,
-      "amount": 3,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/paper",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/stick",
+    "name": "minecraft:workbench/paper_wall",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#",
-      "#"
+      "#X",
+      "X#"
     ],
     "symbols": [
       {
         "symbol": "#",
+        "stack": {
+          "id": "minecraft:item/paper"
+        }
+      },
+      {
+        "symbol": "X",
         "group": "minecraft:planks"
       }
     ],
     "result": {
-      "id": 16408,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/paper_wall",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/torch_charcoal",
+    "name": "minecraft:workbench/paper_wall_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "#"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16391,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/stick"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/paper_wall"
         }
       }
     ],
     "result": {
-      "id": 60,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_paper_wall",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/torch_nethercoal",
+    "name": "minecraft:workbench/pebbles_to_basalt",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "#"
+      "#X",
+      "X#"
     ],
     "symbols": [
       {
-        "symbol": "X",
+        "symbol": "#",
         "stack": {
-          "id": 16488,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ammo_pebble"
         }
       },
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/coal"
         }
       }
     ],
     "result": {
-      "id": 60,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/cobble_basalt",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/bowl",
+    "name": "minecraft:workbench/pebbles_to_cobblestone",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "# #",
-      " # "
+      "##",
+      "##"
     ],
     "symbols": [
       {
         "symbol": "#",
-        "group": "minecraft:planks"
+        "stack": {
+          "id": "minecraft:item/ammo_pebble"
+        }
       }
     ],
     "result": {
-      "id": 16409,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/cobble_stone"
+    }
   },
   {
-    "name": "minecraft:workbench/minecart",
+    "name": "minecraft:workbench/pebbles_to_granite",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "# #",
-      "###"
+      "#X",
+      "X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ammo_pebble"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/quartz"
         }
       }
     ],
     "result": {
-      "id": 16456,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/cobble_granite",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/minecart_with_chest",
+    "name": "minecraft:workbench/pebbles_to_limestone",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "A",
-      "B"
+      "#X",
+      "X#"
     ],
     "symbols": [
       {
-        "symbol": "A",
-        "group": "minecraft:chests"
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:item/ammo_pebble"
+        }
       },
       {
-        "symbol": "B",
+        "symbol": "X",
         "stack": {
-          "id": 16456,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/sand"
         }
       }
     ],
     "result": {
-      "id": 16470,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/cobble_limestone",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/minecart_with_furnace",
+    "name": "minecraft:workbench/perma_ice",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "A",
-      "B"
+      "#X",
+      "X#"
     ],
     "symbols": [
       {
-        "symbol": "A",
+        "symbol": "#",
         "stack": {
-          "id": 660,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/permafrost"
         }
       },
       {
-        "symbol": "B",
+        "symbol": "X",
         "stack": {
-          "id": 16456,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/ice"
         }
       }
     ],
     "result": {
-      "id": 16471,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/permaice",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/boat",
+    "name": "minecraft:workbench/permafrost_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "# #",
-      "###"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/permafrost"
+        }
       }
     ],
     "result": {
-      "id": 16461,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_permafrost",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/bucket",
+    "name": "minecraft:workbench/permafrost_to_polished_permafrost",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "# #",
-      " # "
+      "#",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/permafrost"
         }
       }
     ],
     "result": {
-      "id": 16453,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/permafrost_polished",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/golden_arrow",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      " X ",
-      "X#X",
-      " X "
-    ],
-    "symbols": [
-      {
-        "symbol": "X",
-        "stack": {
-          "id": 16390,
-          "amount": 1,
-          "meta": 0
-        }
-      },
+    "name": "minecraft:workbench/pine_log_to_brown_wooden_planks",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/log_pine"
         }
       }
     ],
     "result": {
-      "id": 16507,
+      "id": "minecraft:block/planks_oak_painted",
       "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 12
+    }
   },
   {
-    "name": "minecraft:workbench/fire_striker",
+    "name": "minecraft:workbench/pink_lamp_convert",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:lamps"
       },
       {
         "stack": {
-          "id": 16446,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 16387,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:block/lamp_idle",
+      "meta": 6
     }
   },
   {
-    "name": "minecraft:workbench/steel_fire_striker",
+    "name": "minecraft:workbench/pink_wooden_chest_from_chest",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:chests"
       },
       {
         "stack": {
-          "id": 16446,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 16529,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 96
     }
   },
   {
-    "name": "minecraft:workbench/bread",
+    "name": "minecraft:workbench/pink_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16424,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 6
         }
       }
     ],
     "result": {
-      "id": 16425,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 96
+    }
   },
   {
-    "name": "minecraft:workbench/fishing_rod",
+    "name": "minecraft:workbench/pink_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "  #",
-      " #X",
-      "# X"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16415,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 6
         }
       }
     ],
     "result": {
-      "id": 16474,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 9
+    }
   },
   {
-    "name": "minecraft:workbench/painting",
+    "name": "minecraft:workbench/pink_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#X#",
-      "###"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 6
         }
       },
       {
-        "symbol": "X",
-        "group": "minecraft:wools"
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:item/stick"
+        }
       }
     ],
     "result": {
-      "id": 16449,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6,
+      "meta": 6
+    }
   },
   {
-    "name": "minecraft:workbench/golden_apple",
+    "name": "minecraft:workbench/pink_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
       "#X#",
-      "###"
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 432,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       },
       {
         "symbol": "X",
         "stack": {
-          "id": 16388,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 6
         }
       }
     ],
     "result": {
-      "id": 16450,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 96
+    }
   },
   {
-    "name": "minecraft:workbench/redstone_repeater",
+    "name": "minecraft:workbench/pink_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#X#",
-      "III"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "stack": {
-          "id": 461,
-          "amount": 1,
-          "meta": 0
-        }
+        "symbol": "X",
+        "group": "minecraft:planks"
       },
       {
-        "symbol": "X",
+        "symbol": "D",
         "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 9
         }
-      },
-      {
-        "symbol": "I",
-        "group": "minecraft:stones"
       }
     ],
     "result": {
-      "id": 16484,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 6
+    }
   },
   {
-    "name": "minecraft:workbench/clock",
+    "name": "minecraft:workbench/pink_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      " # ",
-      "#X#",
-      " # "
+      "XXX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 6
         }
       }
     ],
     "result": {
-      "id": 16475,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 96
+    }
   },
   {
-    "name": "minecraft:workbench/compass",
+    "name": "minecraft:workbench/pink_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      " # ",
-      "#X#",
-      " # "
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 6
         }
       }
     ],
     "result": {
-      "id": 16473,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 96
+    }
   },
   {
-    "name": "minecraft:workbench/rotary_calendar",
+    "name": "minecraft:workbench/pink_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      " # ",
-      "#X#",
-      " # "
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
-        "group": "minecraft:planks"
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 6
+        }
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 96
+    }
+  },
+  {
+    "name": "minecraft:workbench/pink_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:wools"
       },
       {
-        "symbol": "X",
         "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 16509,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/wool",
+      "meta": 6
+    }
   },
   {
-    "name": "minecraft:workbench/explosive_charge",
+    "name": "minecraft:workbench/piston",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      " S ",
-      "#X#",
-      " # "
+      "XXX",
+      "#I#",
+      "#R#"
     ],
     "symbols": [
       {
-        "symbol": "S",
-        "stack": {
-          "id": 16415,
-          "amount": 1,
-          "meta": 0
-        }
+        "symbol": "X",
+        "group": "minecraft:planks"
       },
       {
         "symbol": "#",
+        "group": "minecraft:cobblestones"
+      },
+      {
+        "symbol": "I",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       },
       {
-        "symbol": "X",
+        "symbol": "R",
         "stack": {
-          "id": 16417,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dust_redstone"
         }
       }
     ],
     "result": {
-      "id": 16505,
-      "amount": 4,
-      "meta": 0
+      "id": "minecraft:block/piston_base"
+    }
+  },
+  {
+    "name": "minecraft:workbench/planks_undyeing",
+    "type": "minecraft:crafting/undyeing",
+    "input": {
+      "group": "minecraft:planks"
     },
-    "consumeContainers": true
+    "output": {
+      "id": "minecraft:block/planks_oak",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/map",
+    "name": "minecraft:workbench/polished_basalt_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16467,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/basalt_polished"
         }
       }
     ],
     "result": {
-      "id": 16486,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_basalt_carved",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/bed",
+    "name": "minecraft:workbench/polished_granite_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "YY#",
       "XXX"
     ],
     "symbols": [
       {
-        "symbol": "Y",
+        "symbol": "X",
         "stack": {
-          "id": 16504,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/granite_polished"
         }
-      },
-      {
-        "symbol": "#",
-        "group": "minecraft:wools"
-      },
-      {
-        "symbol": "X",
-        "group": "minecraft:planks"
       }
     ],
     "result": {
-      "id": 16483,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_granite_carved",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/crude_steel_to_steel_ingot",
+    "name": "minecraft:workbench/polished_limestone_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16499,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/limestone_polished"
         }
       }
     ],
     "result": {
-      "id": 16498,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_limestone_carved",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/lamp",
+    "name": "minecraft:workbench/polished_netherrack_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#O#",
-      "#X#"
+      "XXX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 190,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "O",
-        "stack": {
-          "id": 16512,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16459,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/netherrack_polished"
         }
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_netherrack_polished",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/tinted_glass",
+    "name": "minecraft:workbench/polished_permafrost_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#X",
-      "X#"
+      "XXX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 190,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16513,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/permafrost_polished"
         }
       }
     ],
     "result": {
-      "id": 191,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_permafrost_polished",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/steel_glass",
+    "name": "minecraft:workbench/polished_stone_brick_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#X",
-      "X#"
+      "XXX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": "minecraft:block/glass",
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": "minecraft:item/ingot_steel",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_stone_polished"
         }
       }
     ],
     "result": {
-      "id": "minecraft:block/glass_steel",
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_stone_polished",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/slate_to_slate_layers",
+    "name": "minecraft:workbench/polished_stone_brick_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 6,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_stone_polished"
         }
       }
     ],
     "result": {
-      "id": 722,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_stone_polished",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/snowballs_to_snow_layer",
+    "name": "minecraft:workbench/polished_stone_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16460,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/stone_polished"
         }
       }
     ],
     "result": {
-      "id": 720,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_stone_polished",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/oak_leaves_to_leaf_pile",
+    "name": "minecraft:workbench/polished_stone_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 290,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/stone_polished"
         }
       }
     ],
     "result": {
-      "id": 721,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_stone_polished",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/pebbles_to_cobblestone",
+    "name": "minecraft:workbench/powered_rail",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "X X",
+      "X#X",
+      "XRX"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/ingot_gold"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 16514,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "R",
+        "stack": {
+          "id": "minecraft:item/dust_redstone"
         }
       }
     ],
     "result": {
-      "id": 10,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/rail_powered",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/pebbles_to_limestone",
+    "name": "minecraft:workbench/pumpkin_pie",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#X",
-      "X#"
+      "AAA",
+      "BEB",
+      "CCC"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "A",
         "stack": {
-          "id": 16514,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/bucket_milk"
         }
       },
       {
-        "symbol": "X",
+        "symbol": "B",
         "stack": {
-          "id": 250,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dust_sugar"
+        }
+      },
+      {
+        "symbol": "E",
+        "stack": {
+          "id": "minecraft:block/pumpkin"
+        }
+      },
+      {
+        "symbol": "C",
+        "stack": {
+          "id": "minecraft:item/wheat"
         }
       }
     ],
     "result": {
-      "id": 13,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/food_pumpkin_pie"
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_gold",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "###",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/pumpkin_to_pumpkin_seeds",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 16394,
-          "amount": 9,
-          "meta": 0
+          "id": "minecraft:block/pumpkin"
         }
       }
     ],
     "result": {
-      "id": 432,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/seeds_pumpkin",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/pebbles_to_basalt",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#X",
-      "X#"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/purple_dye_pink_dye_to_magenta_dye",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
         "stack": {
-          "id": 16514,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 5
         }
       },
       {
-        "symbol": "X",
         "stack": {
-          "id": 16391,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 9
         }
       }
     ],
     "result": {
-      "id": 12,
+      "id": "minecraft:item/dye",
       "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 13
+    }
   },
   {
-    "name": "minecraft:workbench/pebbles_to_granite",
+    "name": "minecraft:workbench/purple_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 5
+        }
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/lamp_idle",
+      "meta": 10
+    }
+  },
+  {
+    "name": "minecraft:workbench/purple_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:chests"
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 5
+        }
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 160
+    }
+  },
+  {
+    "name": "minecraft:workbench/purple_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#X",
-      "X#"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16514,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 10
         }
-      },
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 160
+    }
+  },
+  {
+    "name": "minecraft:workbench/purple_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "XX",
+      "XX",
+      "XX"
+    ],
+    "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16512,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 10
         }
       }
     ],
     "result": {
-      "id": 14,
+      "id": "minecraft:item/door_oak_painted",
       "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 5
+    }
   },
   {
-    "name": "minecraft:workbench/slate_to_polished_slate",
+    "name": "minecraft:workbench/purple_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#",
-      "#"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 10
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 6,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 864,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6,
+      "meta": 10
+    }
   },
   {
-    "name": "minecraft:workbench/stone_to_polished_stone",
+    "name": "minecraft:workbench/purple_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#",
-      "#"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 1,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 10
         }
       }
     ],
     "result": {
-      "id": 860,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 160
+    }
   },
   {
-    "name": "minecraft:workbench/permafrost_to_permafrost_stone",
+    "name": "minecraft:workbench/purple_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#",
-      "#"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
+      {
+        "symbol": "D",
         "stack": {
-          "key": "tile.permafrost",
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 5
         }
       }
     ],
     "result": {
-      "key": "tile.permafrost.polished",
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 10
+    }
   },
   {
-    "name": "minecraft:workbench/granite_to_polished_granite",
+    "name": "minecraft:workbench/purple_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#",
-      "#"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 4,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 10
         }
       }
     ],
     "result": {
-      "id": 861,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 160
+    }
   },
   {
-    "name": "minecraft:workbench/limestone_to_polished_limestone",
+    "name": "minecraft:workbench/purple_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#",
-      "#"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 3,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 10
         }
       }
     ],
     "result": {
-      "id": 862,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 160
+    }
   },
   {
-    "name": "minecraft:workbench/basalt_to_polished_basalt",
+    "name": "minecraft:workbench/purple_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#",
-      "#"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 2,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 10
         }
       }
     ],
     "result": {
-      "id": 863,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 160
+    }
   },
   {
-    "name": "minecraft:workbench/sponge_to_wet_sponge",
+    "name": "minecraft:workbench/purple_wool",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "stack": {
-          "id": 230,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:wools"
       },
       {
         "stack": {
-          "id": 16454,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 5
         }
       }
     ],
     "result": {
-      "id": 231,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:block/wool",
+      "meta": 10
     }
   },
   {
-    "name": "minecraft:workbench/label",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
+    "name": "minecraft:workbench/quiver",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "#OO",
+      "#XX",
+      " XX"
+    ],
+    "symbols": [
       {
+        "symbol": "#",
         "stack": {
-          "id": 16415,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/string"
         }
       },
       {
+        "symbol": "O",
         "stack": {
-          "id": 16467,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/cloth"
         }
       },
       {
+        "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/leather"
         }
       }
     ],
     "result": {
-      "id": 16518,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:item/armor_quiver"
     }
   },
   {
-    "name": "minecraft:workbench/block_of_gold_to_gold_ingot",
+    "name": "minecraft:workbench/rail",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "X X",
+      "X#X",
+      "X X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/ingot_iron"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 432,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16394,
-      "amount": 9,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/rail",
+      "amount": 16
+    }
   },
   {
-    "name": "minecraft:workbench/gravel_from_flint_and_pebbles",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "FPF",
-      "PFP",
-      "FPF"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/red_dye_white_dye_to_pink_dye",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "F",
         "stack": {
-          "id": 16446,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 1
         }
       },
       {
-        "symbol": "P",
         "stack": {
-          "id": 16514,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 251,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/dye",
+      "amount": 2,
+      "meta": 9
+    }
   },
   {
-    "name": "minecraft:workbench/jar",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "# #",
-      " # "
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/red_dye_yellow_dye_to_orange_dye",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 1
+        }
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 190,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 16519,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/dye",
+      "amount": 2,
+      "meta": 14
+    }
   },
   {
-    "name": "minecraft:workbench/perma_ice",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#X",
-      "X#"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/red_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 7,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 1
         }
+      }
+    ],
+    "result": {
+      "id": "minecraft:block/lamp_idle",
+      "meta": 14
+    }
+  },
+  {
+    "name": "minecraft:workbench/red_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:chests"
       },
       {
-        "symbol": "X",
         "stack": {
-          "id": 730,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 1
         }
       }
     ],
     "result": {
-      "id": 731,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 224
+    }
   },
   {
-    "name": "minecraft:workbench/paper_wall_a",
+    "name": "minecraft:workbench/red_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#X",
-      "X#"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16467,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 14
         }
-      },
-      {
-        "symbol": "X",
-        "group": "minecraft:planks"
       }
     ],
     "result": {
-      "id": 910,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 224
+    }
   },
   {
-    "name": "minecraft:workbench/paper_wall_b",
+    "name": "minecraft:workbench/red_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#",
-      "#X"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "group": "minecraft:planks"
-      },
-      {
-        "symbol": "#",
         "stack": {
-          "id": 16467,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 14
         }
       }
     ],
     "result": {
-      "id": 910,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 1
+    }
   },
   {
-    "name": "minecraft:workbench/paper_wall_fence",
+    "name": "minecraft:workbench/red_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "I#I",
-      "I#I"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
       {
-        "symbol": "I",
+        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 14
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 910,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 891,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6,
+      "meta": 14
+    }
   },
   {
-    "name": "minecraft:workbench/chainlink_fence",
+    "name": "minecraft:workbench/red_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "I#I",
-      "I#I"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
-        "symbol": "I",
+        "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       },
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16503,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 14
         }
       }
     ],
     "result": {
-      "id": 890,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 224
+    }
   },
   {
-    "name": "minecraft:workbench/basket",
+    "name": "minecraft:workbench/red_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "YYY",
-      "X X",
+      "XXX",
+      "XDX",
       "XXX"
     ],
     "symbols": [
       {
-        "symbol": "Y",
-        "stack": {
-          "id": 16462,
-          "amount": 1,
-          "meta": 0
-        }
+        "symbol": "X",
+        "group": "minecraft:planks"
       },
       {
-        "symbol": "X",
+        "symbol": "D",
         "stack": {
-          "id": 16424,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 1
         }
       }
     ],
     "result": {
-      "id": 16525,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 14
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_iron",
+    "name": "minecraft:workbench/red_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 9,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 14
         }
       }
     ],
     "result": {
-      "id": 431,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 224
+    }
   },
   {
-    "name": "minecraft:workbench/flag",
+    "name": "minecraft:workbench/red_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XYY",
-      "XYY",
-      "X  "
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "Y",
-        "stack": {
-          "id": 16504,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 14
         }
       }
     ],
     "result": {
-      "id": 16526,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 224
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_sugarcane",
+    "name": "minecraft:workbench/red_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16466,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 14
         }
       }
     ],
     "result": {
-      "id": 771,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 224
+    }
   },
   {
-    "name": "minecraft:workbench/seat",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "X X"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/red_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
-        "stack": {
-          "id": 16504,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:wools"
       },
       {
-        "symbol": "X",
-        "group": "minecraft:planks"
+        "stack": {
+          "id": "minecraft:item/dye",
+          "meta": 1
+        }
       }
     ],
     "result": {
-      "id": 16531,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/wool",
+      "meta": 14
+    }
   },
   {
-    "name": "minecraft:workbench/cobblestone_pickaxe",
+    "name": "minecraft:workbench/redstone_repeater",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      " # ",
-      " # "
+      "#X#",
+      "III"
     ],
     "symbols": [
       {
-        "symbol": "X",
-        "group": "minecraft:cobblestones"
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:item/stick"
+        }
       },
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dust_redstone"
         }
+      },
+      {
+        "symbol": "I",
+        "group": "minecraft:stones"
       }
     ],
     "result": {
-      "id": 16402,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/repeater"
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_iron_to_iron_ingot",
+    "name": "minecraft:workbench/redstone_torch",
     "type": "minecraft:crafting/shaped",
     "pattern": [
+      "X",
       "#"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/dust_redstone"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 431,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16393,
-      "amount": 9,
-      "meta": 0
+      "id": "minecraft:block/torch_redstone_active"
+    }
+  },
+  {
+    "name": "minecraft:workbench/repair_chainmail_boots",
+    "type": "minecraft:crafting/repairable",
+    "input": {
+      "id": "minecraft:item/armor_boots_chainmail"
     },
-    "consumeContainers": true
+    "repairMaterial": {
+      "stack": {
+        "id": "minecraft:item/chainlink"
+      }
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_diamond",
+    "name": "minecraft:workbench/repair_chainmail_chestplate",
+    "type": "minecraft:crafting/repairable",
+    "input": {
+      "id": "minecraft:item/armor_chestplate_chainmail"
+    },
+    "repairMaterial": {
+      "stack": {
+        "id": "minecraft:item/chainlink"
+      }
+    }
+  },
+  {
+    "name": "minecraft:workbench/repair_chainmail_helmet",
+    "type": "minecraft:crafting/repairable",
+    "input": {
+      "id": "minecraft:item/armor_helmet_chainmail"
+    },
+    "repairMaterial": {
+      "stack": {
+        "id": "minecraft:item/chainlink"
+      }
+    }
+  },
+  {
+    "name": "minecraft:workbench/repair_chainmail_leggings",
+    "type": "minecraft:crafting/repairable",
+    "input": {
+      "id": "minecraft:item/armor_leggings_chainmail"
+    },
+    "repairMaterial": {
+      "stack": {
+        "id": "minecraft:item/chainlink"
+      }
+    }
+  },
+  {
+    "name": "minecraft:workbench/rope",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###",
-      "###"
+      "#",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 16392,
-          "amount": 9,
-          "meta": 0
+          "id": "minecraft:item/string"
         }
       }
     ],
     "result": {
-      "id": 435,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/rope",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_diamond_to_diamond",
+    "name": "minecraft:workbench/rotary_calendar",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      " X ",
+      "X#X",
+      " X "
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 435,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dust_redstone"
         }
       }
     ],
     "result": {
-      "id": 16392,
-      "amount": 9,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_calendar"
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_lapis_lazuli",
+    "name": "minecraft:workbench/sandstone",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###",
-      "###"
+      "##",
+      "##"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 9,
-          "meta": 4
+          "id": "minecraft:block/sand"
         }
       }
     ],
     "result": {
-      "id": 433,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/sandstone",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_lapis_lazuli_to_lapis_lazuli",
+    "name": "minecraft:workbench/sandstone_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 433,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/sandstone"
         }
       }
     ],
     "result": {
-      "id": 16479,
-      "amount": 9,
-      "meta": 4
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_sandstone",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_steel",
+    "name": "minecraft:workbench/sandstone_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16498,
-          "amount": 9,
-          "meta": 0
+          "id": "minecraft:block/sandstone"
         }
       }
     ],
     "result": {
-      "id": 437,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_sandstone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_steel_to_steel_ingot",
+    "name": "minecraft:workbench/sandstone_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 437,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/sandstone"
         }
       }
     ],
     "result": {
-      "id": 16498,
-      "amount": 9,
-      "meta": 0
+      "id": "minecraft:block/stairs_sandstone",
+      "amount": 6
+    }
+  },
+  {
+    "name": "minecraft:workbench/scrap_chainmail_boots",
+    "type": "minecraft:crafting/scrap",
+    "input": {
+      "id": "minecraft:item/armor_boots_chainmail"
     },
-    "consumeContainers": true
+    "output": {
+      "id": "minecraft:item/chainlink"
+    },
+    "maxYield": 4
   },
   {
-    "name": "minecraft:workbench/block_of_redstone",
+    "name": "minecraft:workbench/scrap_chainmail_chestplate",
+    "type": "minecraft:crafting/scrap",
+    "input": {
+      "id": "minecraft:item/armor_chestplate_chainmail"
+    },
+    "output": {
+      "id": "minecraft:item/chainlink"
+    },
+    "maxYield": 4
+  },
+  {
+    "name": "minecraft:workbench/scrap_chainmail_helmet",
+    "type": "minecraft:crafting/scrap",
+    "input": {
+      "id": "minecraft:item/armor_helmet_chainmail"
+    },
+    "output": {
+      "id": "minecraft:item/chainlink"
+    },
+    "maxYield": 4
+  },
+  {
+    "name": "minecraft:workbench/scrap_chainmail_leggings",
+    "type": "minecraft:crafting/scrap",
+    "input": {
+      "id": "minecraft:item/armor_leggings_chainmail"
+    },
+    "output": {
+      "id": "minecraft:item/chainlink"
+    },
+    "maxYield": 4
+  },
+  {
+    "name": "minecraft:workbench/seat",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "###",
-      "###",
-      "###"
+      "X X"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 16459,
-          "amount": 9,
-          "meta": 0
+          "id": "minecraft:item/cloth"
         }
+      },
+      {
+        "symbol": "X",
+        "group": "minecraft:planks"
       }
     ],
     "result": {
-      "id": 434,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/seat"
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_redstone_to_redstone",
+    "name": "minecraft:workbench/shears",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      " X",
+      "X "
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 434,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_iron"
         }
       }
     ],
     "result": {
-      "id": 16459,
-      "amount": 9,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_shears"
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_quartz",
+    "name": "minecraft:workbench/sign",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###",
-      "###"
+      "XXX",
+      "XXX",
+      " # "
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 16512,
-          "amount": 9,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 438,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/sign",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/stone_shovel",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X",
-      "#",
-      "#"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/silver_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "X",
-        "group": "minecraft:cobblestones"
+        "group": "minecraft:lamps"
       },
       {
-        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 16401,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 8
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_quartz_to_quartz",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "#"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/silver_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:chests"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 438,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 16512,
-      "amount": 9,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 128
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_coal",
+    "name": "minecraft:workbench/silver_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16391,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 430,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 128
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_charcoal",
+    "name": "minecraft:workbench/silver_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16391,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 440,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak_painted",
+      "amount": 2,
+      "meta": 7
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_coal_to_coal",
+    "name": "minecraft:workbench/silver_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 8
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 430,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16391,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6,
+      "meta": 8
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_charcoal_to_charcoal",
+    "name": "minecraft:workbench/silver_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 440,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 16391,
-      "amount": 8,
-      "meta": 1
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 128
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_olivine",
+    "name": "minecraft:workbench/silver_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
+      {
+        "symbol": "D",
         "stack": {
-          "id": 439,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 16513,
+      "id": "minecraft:block/planks_oak_painted",
       "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 8
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_olivine_to_olivine",
+    "name": "minecraft:workbench/silver_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16513,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 439,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6,
+      "meta": 128
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_nethercoal",
+    "name": "minecraft:workbench/silver_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 16488,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 436,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6,
+      "meta": 128
+    }
   },
   {
-    "name": "minecraft:workbench/block_of_nethercoal_to_nethercoal",
+    "name": "minecraft:workbench/silver_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 436,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 8
         }
       }
     ],
     "result": {
-      "id": 16488,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 128
+    }
   },
   {
-    "name": "minecraft:workbench/mushroom_stew",
+    "name": "minecraft:workbench/silver_wool",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "stack": {
-          "id": 340,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "stack": {
-          "id": 341,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:wools"
       },
       {
         "stack": {
-          "id": 16409,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 7
         }
       }
     ],
     "result": {
-      "id": 16410,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:block/wool",
+      "meta": 8
+    }
+  },
+  {
+    "name": "minecraft:workbench/slabs_planks_undyeing",
+    "type": "minecraft:crafting/undyeing",
+    "input": {
+      "group": "minecraft:slabs_planks"
     },
-    "consumeContainers": true
+    "output": {
+      "id": "minecraft:block/slab_planks_oak",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/stone_axe",
+    "name": "minecraft:workbench/slate_brick_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XX",
-      "X#",
-      " #"
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "group": "minecraft:cobblestones"
-      },
-      {
-        "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_slate"
         }
       }
     ],
     "result": {
-      "id": 16403,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_slate",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/cookie",
+    "name": "minecraft:workbench/slate_brick_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#X#"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16424,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 3
+          "id": "minecraft:block/brick_slate"
         }
       }
     ],
     "result": {
-      "id": 16485,
-      "amount": 8,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_slate",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/ice_cream_bucket",
+    "name": "minecraft:workbench/slate_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      " Y ",
-      "#O#",
-      " X "
+      "XX",
+      "XX"
     ],
     "symbols": [
-      {
-        "symbol": "Y",
-        "stack": {
-          "id": 16515,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 3
-        }
-      },
-      {
-        "symbol": "O",
-        "stack": {
-          "id": 16460,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16463,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/slate"
         }
       }
     ],
     "result": {
-      "id": 16516,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_slate",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/wooden_chest",
+    "name": "minecraft:workbench/slate_to_polished_slate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "#",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 50,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/slate"
         }
       }
     ],
     "result": {
-      "id": 682,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slate_polished",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/furnace",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "# #",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/slate_to_slate_layers",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "#",
-        "group": "minecraft:cobblestones"
+        "stack": {
+          "id": "minecraft:block/slate"
+        }
       }
     ],
     "result": {
-      "id": 660,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/layer_slate",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/workbench",
+    "name": "minecraft:workbench/snow_block",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "##",
@@ -9871,165 +8505,125 @@
     "symbols": [
       {
         "symbol": "#",
-        "group": "minecraft:planks"
+        "stack": {
+          "id": "minecraft:item/ammo_snowball"
+        }
       }
     ],
     "result": {
-      "id": 650,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/block_snow"
+    }
   },
   {
-    "name": "minecraft:workbench/blast_furnace",
+    "name": "minecraft:workbench/snowballs_to_snow_layer",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "#O#",
-      "###"
+      "##"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "O",
-        "stack": {
-          "id": 16488,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ammo_snowball"
         }
       }
     ],
     "result": {
-      "id": 662,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/layer_snow",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/trommel",
+    "name": "minecraft:workbench/spikes",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "CCC",
-      "CMC",
-      "LLL"
+      " # ",
+      "#X#",
+      "YYY"
     ],
     "symbols": [
       {
-        "symbol": "C",
-        "group": "minecraft:cobblestones"
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:item/ingot_iron"
+        }
       },
       {
-        "symbol": "M",
+        "symbol": "X",
         "stack": {
-          "id": 600,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dust_redstone"
         }
       },
       {
-        "symbol": "L",
-        "group": "minecraft:logs"
+        "symbol": "Y",
+        "group": "minecraft:cobblestones"
       }
     ],
     "result": {
-      "id": 670,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/spikes",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/leather_helmet",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "XXX",
-      "X X"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/sponge_to_wet_sponge",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "X",
         "stack": {
-          "id": 16462,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/sponge_dry"
         }
-      }
-    ],
-    "result": {
-      "id": 16426,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/leather_chestplate",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X X",
-      "XXX",
-      "XXX"
-    ],
-    "symbols": [
+      },
       {
-        "symbol": "X",
         "stack": {
-          "id": 16462,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/bucket_water"
         }
       }
     ],
     "result": {
-      "id": 16427,
-      "amount": 1,
-      "meta": 0
+      "id": "minecraft:block/sponge_wet"
+    }
+  },
+  {
+    "name": "minecraft:workbench/stairs_planks_undyeing",
+    "type": "minecraft:crafting/undyeing",
+    "input": {
+      "group": "minecraft:stairs_planks"
     },
-    "consumeContainers": true
+    "output": {
+      "id": "minecraft:block/stairs_planks_oak",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/stone_hoe",
+    "name": "minecraft:workbench/steel_axe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "XX",
-      " #",
+      "X#",
       " #"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "group": "minecraft:cobblestones"
+        "stack": {
+          "id": "minecraft:item/ingot_steel"
+        }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16419,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_axe_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/leather_leggings",
+    "name": "minecraft:workbench/steel_boots",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
       "X X",
       "X X"
     ],
@@ -10037,301 +8631,266 @@
       {
         "symbol": "X",
         "stack": {
-          "id": 16462,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       }
     ],
     "result": {
-      "id": 16428,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_boots_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/leather_boots",
+    "name": "minecraft:workbench/steel_chestplate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "X X",
-      "X X"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16462,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       }
     ],
     "result": {
-      "id": 16429,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_chestplate_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/iron_helmet",
+    "name": "minecraft:workbench/steel_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      "X X"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       }
     ],
     "result": {
-      "id": 16434,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_steel",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/iron_chestplate",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X X",
-      "XXX",
-      "XXX"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/steel_fire_striker",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
+        }
+      },
+      {
+        "stack": {
+          "id": "minecraft:item/flint"
         }
       }
     ],
     "result": {
-      "id": 16435,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_firestriker_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/iron_leggings",
+    "name": "minecraft:workbench/steel_glass",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      "X X",
-      "X X"
+      "#X",
+      "X#"
     ],
     "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:block/glass"
+        }
+      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       }
     ],
     "result": {
-      "id": 16436,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/glass_steel",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/iron_boots",
+    "name": "minecraft:workbench/steel_helmet",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
+      "XXX",
       "X X"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       }
     ],
     "result": {
-      "id": 16437,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_helmet_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/diamond_helmet",
+    "name": "minecraft:workbench/steel_hoe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      "X X"
+      "XX",
+      " #",
+      " #"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
+        }
+      },
+      {
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16438,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_hoe_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/diamond_chestplate",
+    "name": "minecraft:workbench/steel_leggings",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
       "XXX",
-      "XXX"
+      "X X",
+      "X X"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       }
     ],
     "result": {
-      "id": 16439,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/armor_leggings_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/diamond_leggings",
+    "name": "minecraft:workbench/steel_pickaxe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
       "XXX",
-      "X X",
-      "X X"
+      " # ",
+      " # "
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
+        }
+      },
+      {
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16440,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_pickaxe_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/diamond_boots",
+    "name": "minecraft:workbench/steel_shears",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
-      "X X"
+      " X",
+      "X "
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16392,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       }
     ],
     "result": {
-      "id": 16441,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_shears_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/iron_pickaxe",
+    "name": "minecraft:workbench/steel_shovel",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      " # ",
-      " # "
+      "X",
+      "#",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16385,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_shovel_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/golden_helmet",
+    "name": "minecraft:workbench/steel_sword",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      "X X"
+      "X",
+      "X",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
+        }
+      },
+      {
+        "symbol": "#",
+        "stack": {
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16442,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_sword_steel"
+    }
   },
   {
-    "name": "minecraft:workbench/golden_chestplate",
+    "name": "minecraft:workbench/steel_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
       "XXX",
       "XXX"
     ],
@@ -10339,1540 +8898,1309 @@
       {
         "symbol": "X",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/ingot_steel"
         }
       }
     ],
     "result": {
-      "id": 16443,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_steel",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/golden_leggings",
+    "name": "minecraft:workbench/stick",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      "X X",
-      "X X"
+      "X",
+      "X"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:planks"
       }
     ],
     "result": {
-      "id": 16444,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/stick",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/golden_boots",
+    "name": "minecraft:workbench/sticky_piston",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
-      "X X"
+      "S",
+      "P"
     ],
     "symbols": [
       {
-        "symbol": "X",
+        "symbol": "S",
         "stack": {
-          "id": 16394,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/slimeball"
         }
-      }
-    ],
-    "result": {
-      "id": 16445,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/steel_helmet",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "XXX",
-      "X X"
-    ],
-    "symbols": [
+      },
       {
-        "symbol": "X",
+        "symbol": "P",
         "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/piston_base"
         }
       }
     ],
     "result": {
-      "id": 16489,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/piston_base_sticky"
+    }
   },
   {
-    "name": "minecraft:workbench/steel_chestplate",
+    "name": "minecraft:workbench/stone_axe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
-      "XXX",
-      "XXX"
+      "XX",
+      "X#",
+      " #"
     ],
     "symbols": [
       {
         "symbol": "X",
+        "group": "minecraft:cobblestones"
+      },
+      {
+        "symbol": "#",
         "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16490,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_axe_stone"
+    }
   },
   {
-    "name": "minecraft:workbench/steel_leggings",
+    "name": "minecraft:workbench/stone_brick_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "XXX",
-      "X X",
-      "X X"
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_stone"
         }
       }
     ],
     "result": {
-      "id": 16491,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_brick_stone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/steel_boots",
+    "name": "minecraft:workbench/stone_brick_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X X",
-      "X X"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16498,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/brick_stone"
         }
       }
     ],
     "result": {
-      "id": 16492,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_brick_stone",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/quiver",
+    "name": "minecraft:workbench/stone_bricks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#OO",
-      "#XX",
-      " XX"
+      "XX",
+      "XX"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16415,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "symbol": "O",
-        "stack": {
-          "id": 16504,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
-          "id": 16462,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/stone"
         }
       }
     ],
     "result": {
-      "id": 16508,
-      "amount": 1,
-      "meta": 192
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/brick_stone",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/black_lamp_convert",
+    "name": "minecraft:workbench/stone_button",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
       {
-        "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 0
-        }
-      },
-      {
-        "group": "minecraft:lamps"
+        "group": "minecraft:stones"
       }
     ],
     "result": {
-      "id": 850,
-      "amount": 1,
-      "meta": 15
+      "id": "minecraft:block/button_stone",
+      "amount": 4
     }
   },
   {
-    "name": "minecraft:workbench/iron_shovel",
+    "name": "minecraft:workbench/stone_hoe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "#",
-      "#"
+      "XX",
+      " #",
+      " #"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:cobblestones"
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16384,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_hoe_stone"
+    }
   },
   {
-    "name": "minecraft:workbench/black_wooden_fence",
+    "name": "minecraft:workbench/stone_pickaxe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "XXX",
+      " # ",
+      " # "
     ],
     "symbols": [
       {
         "symbol": "X",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 15
-        }
+        "group": "minecraft:cobblestones"
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 81,
-      "amount": 6,
-      "meta": 15
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_pickaxe_stone"
+    }
   },
   {
-    "name": "minecraft:workbench/black_wooden_slab",
+    "name": "minecraft:workbench/stone_pressure_plate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "##"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:block/stone"
         }
       }
     ],
     "result": {
-      "id": 154,
-      "amount": 6,
-      "meta": 240
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/pressure_plate_stone"
+    }
   },
   {
-    "name": "minecraft:workbench/black_wooden_stairs",
+    "name": "minecraft:workbench/stone_shovel",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X",
+      "#",
+      "#"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "group": "minecraft:cobblestones"
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 171,
-      "amount": 6,
-      "meta": 240
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_shovel_tone"
+    }
   },
   {
-    "name": "minecraft:workbench/black_wooden_fence_gate",
+    "name": "minecraft:workbench/stone_sword",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X"
+      "X",
+      "X",
+      "#"
     ],
     "symbols": [
       {
         "symbol": "X",
-        "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:cobblestones"
       },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 91,
-      "amount": 3,
-      "meta": 240
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_sword_stone"
+    }
   },
   {
-    "name": "minecraft:workbench/black_wool",
-    "type": "minecraft:crafting/shapeless",
-    "inputs": [
-      {
-        "group": "minecraft:wools"
-      },
+    "name": "minecraft:workbench/stone_to_polished_stone",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "#",
+      "#"
+    ],
+    "symbols": [
       {
+        "symbol": "#",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/stone"
         }
       }
     ],
     "result": {
-      "id": 110,
-      "amount": 1,
-      "meta": 15
+      "id": "minecraft:block/stone_polished",
+      "amount": 2
     }
   },
   {
-    "name": "minecraft:workbench/black_wooden_chest_from_planks",
+    "name": "minecraft:workbench/string_to_wool",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "# #",
-      "###"
+      "##",
+      "##"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:item/string"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 240
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/wool"
+    }
   },
   {
-    "name": "minecraft:workbench/black_wooden_chest_from_chest",
+    "name": "minecraft:workbench/sugar_cane_to_sugar",
     "type": "minecraft:crafting/shapeless",
     "inputs": [
-      {
-        "group": "minecraft:chests"
-      },
       {
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/sugarcane"
         }
       }
     ],
     "result": {
-      "id": 683,
-      "amount": 1,
-      "meta": 240
+      "id": "minecraft:item/dust_sugar",
+      "amount": 3
     }
   },
   {
-    "name": "minecraft:workbench/black_wooden_planks",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "#0#",
-      "###"
-    ],
-    "symbols": [
-      {
-        "symbol": "#",
-        "group": "minecraft:planks"
-      },
+    "name": "minecraft:workbench/thorn_log_to_red_wooden_planks",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "0",
         "stack": {
-          "id": 16479,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/log_thorn"
         }
       }
     ],
     "result": {
-      "id": 51,
-      "amount": 8,
-      "meta": 15
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 4,
+      "meta": 14
+    }
   },
   {
-    "name": "minecraft:workbench/white_wooden_door",
+    "name": "minecraft:workbench/tinted_glass",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "#X",
+      "X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/glass"
         }
-      }
-    ],
-    "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 15
-    },
-    "consumeContainers": true
-  },
-  {
-    "name": "minecraft:workbench/orange_wooden_door",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##",
-      "##"
-    ],
-    "symbols": [
+      },
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/olivine"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 14
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/glass_tinted",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/magenta_wooden_door",
+    "name": "minecraft:workbench/tnt",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "X#X",
+      "#X#",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/sulphur"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:block/sand"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 13
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/tnt"
+    }
   },
   {
-    "name": "minecraft:workbench/light_blue_wooden_door",
+    "name": "minecraft:workbench/torch_charcoal",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "X",
+      "#"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/coal",
+          "meta": 1
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 3
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 12
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/torch_coal",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/yellow_wooden_door",
+    "name": "minecraft:workbench/torch_coal",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "X",
+      "#"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/coal"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 11
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/torch_coal",
+      "amount": 4
+    }
   },
   {
-    "name": "minecraft:workbench/lime_wooden_door",
+    "name": "minecraft:workbench/torch_nethercoal",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "X",
+      "#"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:item/nethercoal"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 10
+      "id": "minecraft:block/torch_coal",
+      "amount": 8
+    }
+  },
+  {
+    "name": "minecraft:workbench/trapdoor_planks_undyeing",
+    "type": "minecraft:crafting/undyeing",
+    "input": {
+      "group": "minecraft:trapdoor_planks"
     },
-    "consumeContainers": true
+    "output": {
+      "id": "minecraft:block/trapdoor_planks_oak",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/pink_wooden_door",
+    "name": "minecraft:workbench/trommel",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "CCC",
+      "CMC",
+      "LLL"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "C",
+        "group": "minecraft:cobblestones"
+      },
+      {
+        "symbol": "M",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 6
+          "id": "minecraft:block/mesh"
         }
+      },
+      {
+        "symbol": "L",
+        "group": "minecraft:logs"
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 9
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trommel_idle"
+    }
   },
   {
-    "name": "minecraft:workbench/gray_wooden_door",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##",
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/white_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 7
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 8
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle"
+    }
   },
   {
-    "name": "minecraft:workbench/silver_wooden_door",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##",
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/white_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:chests"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 7
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted"
+    }
   },
   {
-    "name": "minecraft:workbench/cyan_wooden_door",
+    "name": "minecraft:workbench/white_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 9
+          "id": "minecraft:block/planks_oak_painted"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 6
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted"
+    }
   },
   {
-    "name": "minecraft:workbench/purple_wooden_door",
+    "name": "minecraft:workbench/white_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:block/planks_oak_painted"
         }
       }
     ],
     "result": {
-      "id": 16532,
+      "id": "minecraft:item/door_oak_painted",
       "amount": 2,
-      "meta": 5
-    },
-    "consumeContainers": true
+      "meta": 15
+    }
   },
   {
-    "name": "minecraft:workbench/blue_wooden_door",
+    "name": "minecraft:workbench/white_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 4
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak_painted",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/brown_wooden_door",
+    "name": "minecraft:workbench/white_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 3
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3
+    }
   },
   {
-    "name": "minecraft:workbench/green_wooden_door",
+    "name": "minecraft:workbench/white_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
+      {
+        "symbol": "D",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 2
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/red_wooden_door",
+    "name": "minecraft:workbench/white_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 14,
-          "meta": 14
+          "id": "minecraft:block/planks_oak_painted"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 1
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak_painted",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/black_wooden_door",
+    "name": "minecraft:workbench/white_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##",
-      "##"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 15
+          "id": "minecraft:block/planks_oak_painted"
         }
       }
     ],
     "result": {
-      "id": 16532,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_planks_oak_painted",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/white_trap_door",
+    "name": "minecraft:workbench/white_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/orange_trap_door",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "###",
-      "###"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/white_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:wools"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 1
+          "id": "minecraft:item/dye",
+          "meta": 15
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 16
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/wool"
+    }
   },
   {
-    "name": "minecraft:workbench/magenta_trap_door",
+    "name": "minecraft:workbench/wooden_axe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XX",
+      "X#",
+      " #"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 2
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 32
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_axe_wood"
+    }
   },
   {
-    "name": "minecraft:workbench/light_blue_trap_door",
+    "name": "minecraft:workbench/wooden_chest",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 3
+          "id": "minecraft:block/planks_oak"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 48
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak"
+    }
   },
   {
-    "name": "minecraft:workbench/yellow_trap_door",
+    "name": "minecraft:workbench/wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 4
+          "id": "minecraft:block/planks_oak"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 64
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/door_oak",
+      "amount": 2
+    }
   },
   {
-    "name": "minecraft:workbench/lime_trap_door",
+    "name": "minecraft:workbench/wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak"
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 5
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 80
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_planks_oak",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/pink_trap_door",
+    "name": "minecraft:workbench/wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 6
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 96
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak",
+      "amount": 3
+    }
   },
   {
-    "name": "minecraft:workbench/gray_trap_door",
+    "name": "minecraft:workbench/wooden_hoe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XX",
+      " #",
+      " #"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 7
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 112
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_hoe_wood"
+    }
   },
   {
-    "name": "minecraft:workbench/silver_trap_door",
+    "name": "minecraft:workbench/wooden_pickaxe",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XXX",
+      " # ",
+      " # "
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 8
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 128
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_pickaxe_wood"
+    }
   },
   {
-    "name": "minecraft:workbench/cyan_trap_door",
+    "name": "minecraft:workbench/wooden_pressure_plate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "##"
     ],
     "symbols": [
       {
         "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 9
-        }
+        "group": "minecraft:planks"
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 144
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/pressure_plate_planks_oak"
+    }
   },
   {
-    "name": "minecraft:workbench/purple_trap_door",
+    "name": "minecraft:workbench/wooden_shovel",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "X",
+      "#",
+      "#"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 10
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 160
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_shovel_wood"
+    }
   },
   {
-    "name": "minecraft:workbench/blue_trap_door",
+    "name": "minecraft:workbench/wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 11
+          "id": "minecraft:block/planks_oak"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 176
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/slab_planks_oak",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/brown_trap_door",
+    "name": "minecraft:workbench/wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 12
+          "id": "minecraft:block/planks_oak"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 192
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/stairs_planks_oak",
+      "amount": 6
+    }
   },
   {
-    "name": "minecraft:workbench/green_trap_door",
+    "name": "minecraft:workbench/wooden_sword",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "X",
+      "X",
+      "#"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 13
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 208
-    },
-    "consumeContainers": true
+      "id": "minecraft:item/tool_sword_wood"
+    }
   },
   {
-    "name": "minecraft:workbench/red_trap_door",
+    "name": "minecraft:workbench/wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 51,
-          "amount": 14,
-          "meta": 14
+          "id": "minecraft:block/planks_oak"
         }
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 224
+      "id": "minecraft:block/trapdoor_planks_oak",
+      "amount": 6
+    }
+  },
+  {
+    "name": "minecraft:workbench/wools_undyeing",
+    "type": "minecraft:crafting/undyeing",
+    "input": {
+      "group": "minecraft:wools"
     },
-    "consumeContainers": true
+    "output": {
+      "id": "minecraft:block/wool",
+      "amount": 8
+    }
   },
   {
-    "name": "minecraft:workbench/black_trap_door",
+    "name": "minecraft:workbench/workbench",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###",
-      "###"
+      "##",
+      "##"
     ],
     "symbols": [
       {
         "symbol": "#",
-        "stack": {
-          "id": 51,
-          "amount": 1,
-          "meta": 15
-        }
+        "group": "minecraft:planks"
       }
     ],
     "result": {
-      "id": 573,
-      "amount": 6,
-      "meta": 240
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/workbench"
+    }
   },
   {
-    "name": "minecraft:workbench/glass_door",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "##",
-      "##",
-      "##"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/yellow_lamp_convert",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
+      {
+        "group": "minecraft:lamps"
+      },
       {
-        "symbol": "#",
         "stack": {
-          "id": 190,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 16533,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/lamp_idle",
+      "meta": 4
+    }
   },
   {
-    "name": "minecraft:workbench/brazier",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X X",
-      "X#X"
-    ],
-    "symbols": [
+    "name": "minecraft:workbench/yellow_wooden_chest_from_chest",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "X",
-        "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:chests"
       },
       {
-        "symbol": "#",
         "stack": {
-          "id": 800,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 631,
-      "amount": 1,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 64
+    }
   },
   {
-    "name": "minecraft:workbench/rope",
+    "name": "minecraft:workbench/yellow_wooden_chest_from_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X",
-      "X"
+      "XXX",
+      "X X",
+      "XXX"
     ],
     "symbols": [
       {
         "symbol": "X",
         "stack": {
-          "id": 16415,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 16534,
-      "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/chest_planks_oak_painted",
+      "meta": 64
+    }
   },
   {
-    "name": "minecraft:workbench/netherrack_to_polished_netherrack",
+    "name": "minecraft:workbench/yellow_wooden_door",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#",
-      "#"
+      "XX",
+      "XX",
+      "XX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 803,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 866,
+      "id": "minecraft:item/door_oak_painted",
       "amount": 2,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 11
+    }
   },
   {
-    "name": "minecraft:workbench/netherrack_brick_stairs",
+    "name": "minecraft:workbench/yellow_wooden_fence",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "X#X",
+      "X#X"
     ],
     "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 4
+        }
+      },
       {
         "symbol": "#",
         "stack": {
-          "id": 804,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
         }
       }
     ],
     "result": {
-      "id": 809,
+      "id": "minecraft:block/fence_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 4
+    }
   },
   {
-    "name": "minecraft:workbench/cobbled_netherrack_stairs",
+    "name": "minecraft:workbench/yellow_wooden_fence_gate",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "#  ",
-      "## ",
-      "###"
+      "#X#",
+      "#X#"
     ],
     "symbols": [
       {
         "symbol": "#",
         "stack": {
-          "id": 800,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/stick"
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 808,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/fence_gate_planks_oak_painted",
+      "amount": 3,
+      "meta": 64
+    }
   },
   {
-    "name": "minecraft:workbench/netherrack_brick_slab",
+    "name": "minecraft:workbench/yellow_wooden_planks",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX",
+      "XDX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
+        "group": "minecraft:planks"
+      },
+      {
+        "symbol": "D",
         "stack": {
-          "id": 804,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 807,
-      "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/planks_oak_painted",
+      "amount": 8,
+      "meta": 4
+    }
   },
   {
-    "name": "minecraft:workbench/cobbled_netherrack_slab",
+    "name": "minecraft:workbench/yellow_wooden_slab",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 800,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 806,
+      "id": "minecraft:block/slab_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 64
+    }
   },
   {
-    "name": "minecraft:workbench/polished_netherrack_slab",
+    "name": "minecraft:workbench/yellow_wooden_stairs",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "###"
+      "X  ",
+      "XX ",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 866,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 805,
+      "id": "minecraft:block/stairs_planks_oak_painted",
       "amount": 6,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "meta": 64
+    }
   },
   {
-    "name": "minecraft:workbench/netherrack_bricks",
+    "name": "minecraft:workbench/yellow_wooden_trapdoor",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "##",
-      "##"
+      "XXX",
+      "XXX"
     ],
     "symbols": [
       {
-        "symbol": "#",
+        "symbol": "X",
         "stack": {
-          "id": 803,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:block/planks_oak_painted",
+          "meta": 4
         }
       }
     ],
     "result": {
-      "id": 804,
-      "amount": 4,
-      "meta": 0
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/trapdoor_planks_oak_painted",
+      "amount": 6,
+      "meta": 64
+    }
   },
   {
-    "name": "minecraft:workbench/paintbrush",
-    "type": "minecraft:crafting/shaped",
-    "pattern": [
-      "X",
-      "Y",
-      "Z"
-    ],
-    "symbols": [
-      {
-        "symbol": "X",
-        "stack": {
-          "id": 16416,
-          "amount": 1,
-          "meta": 0
-        }
-      },
+    "name": "minecraft:workbench/yellow_wool",
+    "type": "minecraft:crafting/shapeless",
+    "inputs": [
       {
-        "symbol": "Y",
-        "stack": {
-          "id": 16393,
-          "amount": 1,
-          "meta": 0
-        }
+        "group": "minecraft:wools"
       },
       {
-        "symbol": "Z",
         "stack": {
-          "id": 16408,
-          "amount": 1,
-          "meta": 0
+          "id": "minecraft:item/dye",
+          "meta": 11
         }
       }
     ],
     "result": {
-      "id": 16538,
-      "amount": 1,
-      "meta": 64
-    },
-    "consumeContainers": true
+      "id": "minecraft:block/wool",
+      "meta": 4
+    }
   }
 ]
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index 9629d8876..c9aa34865 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -256,6 +256,8 @@ public class Minecraft
     public GameWindow gameWindow;
     public ClientSkinVariantList skinVariantList = new ClientSkinVariantList(this);
     public MainMenuBackground mainMenuBackground = new MainMenuBackground(this);
+    public @Nullable Integer overrideWidth = null;
+    public @Nullable Integer overrideHeight = null;
     /**
      * Do not display the ingame crash handler until this is set to true
      */
@@ -420,7 +422,7 @@ public class Minecraft
 
 		printWrongJavaVersionInfo();
 		
-		gameWindow.init(this, gameSettings.windowWidth.value, gameSettings.windowHeight.value);
+		gameWindow.init(this, overrideWidth != null ? overrideWidth : gameSettings.windowWidth.value, overrideHeight != null ? overrideHeight : gameSettings.windowHeight.value);
 
         LOGGER.info("Resolution: {} x {}", gameWindow.getWidthPixels(), gameWindow.getHeightPixels());
 
@@ -2485,7 +2487,7 @@ public class Minecraft
         this.renderer.reload();
     }
 
-    public static void startMainThread(String username, String sessionId, String uuid)
+    public static void startMainThread(@Nullable String username, @Nullable String sessionId, @Nullable String uuid, @Nullable String server, @Nullable Integer port, @Nullable Integer width, @Nullable Integer height)
     {
         GameWindow gameWindow = new GameWindowGLFW();
         Minecraft mc = new Minecraft(gameWindow);
@@ -2506,6 +2508,15 @@ public class Minecraft
         username = username == null ? "Player" + System.currentTimeMillis() % 1000L : username;
 
         mc.session = new Session(username, uuid, sessionId);
+        if (server != null) {
+            mc.setServer(server, port == null ? 25565 : port);
+        }
+        if (width != null) {
+            mc.overrideWidth = width;
+        }
+        if (height != null) {
+            mc.overrideHeight = height;
+        }
         mc.run();
     }
 
@@ -2515,6 +2526,10 @@ public class Minecraft
         String sessionId = null;
         String gameDirectory = null;
         String uuid = null;
+        String server = null;
+        Integer port = null;
+        Integer width = null;
+        Integer height = null;
 
         int pointer = 0;
         while (pointer < args.length) {
@@ -2559,11 +2574,51 @@ public class Minecraft
                     pointer++;
                     break;
                 }
+                case "--server": {
+                    try {
+                        server = args[pointer + 1];
+                        pointer++;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    pointer++;
+                    break;
+                }
+                case "--port": {
+                    try {
+                        port = Integer.parseInt(args[pointer + 1]);
+                        pointer++;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    pointer++;
+                    break;
+                }
+                case "--width": {
+                    try {
+                        width = Integer.parseInt(args[pointer + 1]);
+                        pointer++;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    pointer++;
+                    break;
+                }
+                case "--height": {
+                    try {
+                        height = Integer.parseInt(args[pointer + 1]);
+                        pointer++;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    pointer++;
+                    break;
+                }
                 default:
                     pointer++;
             }
         }
-        startMainThread(playerName, sessionId, uuid);
+        startMainThread(playerName, sessionId, uuid, server, port, width, height);
     }
     
     public void setInputType(InputType inputType) {
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java
index ee9512c2e..dec58e21e 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java
@@ -9,15 +9,32 @@ import net.minecraft.client.gui.guidebook.GuidebookSection;
 import net.minecraft.client.gui.guidebook.GuidebookSections;
 import net.minecraft.client.gui.guidebook.PageManager;
 import net.minecraft.client.gui.guidebook.RecipePage;
+import net.minecraft.client.gui.guidebook.crafting.displays.LabelDisplayAdapter;
+import net.minecraft.client.gui.guidebook.crafting.displays.LabelDyeDisplayAdapter;
+import net.minecraft.client.gui.guidebook.crafting.displays.MapDuplicationDisplayAdapter;
+import net.minecraft.client.gui.guidebook.crafting.displays.RecipeDisplayAdapter;
+import net.minecraft.client.gui.guidebook.crafting.displays.RepairableDisplayAdapter;
+import net.minecraft.client.gui.guidebook.crafting.displays.ScrapDisplayAdapter;
+import net.minecraft.client.gui.guidebook.crafting.displays.ShapedDisplayAdapter;
+import net.minecraft.client.gui.guidebook.crafting.displays.ShapelessDisplayAdapter;
+import net.minecraft.client.gui.guidebook.crafting.displays.ToolDisplayAdapter;
+import net.minecraft.client.gui.guidebook.crafting.displays.UndyeDisplayAdapter;
 import net.minecraft.client.gui.guidebook.search.SearchPage;
 import net.minecraft.client.render.Font;
 import net.minecraft.client.render.TextureManager;
 import net.minecraft.core.achievement.Achievements;
-import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCrafting;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShapeless;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingWithTool;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryLabel;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryLabelDye;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryMapDuplication;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryRepairable;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryScrap;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryUndyeing;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.player.inventory.slot.Slot;
 import net.minecraft.client.gui.guidebook.GuidebookSlot;
@@ -35,6 +52,21 @@ public class CraftingPage
 
     public List<GuidebookSlot> slots;
     public Map<RecipeEntryCrafting<?,?>,List<GuidebookSlot>> map;
+
+    public static Map<Class<? extends RecipeEntryCrafting<?, ?>>, RecipeDisplayAdapter<?>> recipeToDisplayAdapterMap = new HashMap<>();
+
+    static {
+        recipeToDisplayAdapterMap.put(RecipeEntryCraftingShaped.class, new ShapedDisplayAdapter());
+        recipeToDisplayAdapterMap.put(RecipeEntryCraftingShapeless.class, new ShapelessDisplayAdapter());
+        recipeToDisplayAdapterMap.put(RecipeEntryCraftingWithTool.class, new ToolDisplayAdapter());
+        recipeToDisplayAdapterMap.put(RecipeEntryRepairable.class, new RepairableDisplayAdapter());
+        recipeToDisplayAdapterMap.put(RecipeEntryScrap.class, new ScrapDisplayAdapter());
+        recipeToDisplayAdapterMap.put(RecipeEntryLabel.class, new LabelDisplayAdapter());
+        recipeToDisplayAdapterMap.put(RecipeEntryLabelDye.class, new LabelDyeDisplayAdapter());
+        recipeToDisplayAdapterMap.put(RecipeEntryMapDuplication.class, new MapDuplicationDisplayAdapter());
+        recipeToDisplayAdapterMap.put(RecipeEntryUndyeing.class, new UndyeDisplayAdapter());
+    }
+
     private final TooltipElement tooltipElement;
     private final ItemElement itemElement;
     private static final Minecraft mc = Minecraft.getMinecraft(GuidebookPage.class);
@@ -54,117 +86,12 @@ public class CraftingPage
         int xOffset = 32;
         int yOffset = 12;
         for (RecipeEntryCrafting<?,?> recipe : recipes) {
-            List<GuidebookSlot> recipeSlots = new ArrayList<>();
-            if (recipe instanceof RecipeEntryCraftingShaped)
-            {
-                final RecipeEntryCraftingShaped r = (RecipeEntryCraftingShaped) recipe;
-                int slotsAmount;
-
-                if (r.recipeHeight > 2 || r.recipeWidth > 2)
-                {
-                    slotsAmount = 10;
-
-                    for (int i = 0; i < slotsAmount - 1; i++)
-                    {
-                        final int slotX = i % 3;
-                        final int slotY = i / 3;
-
-                        if (slotX >= r.recipeWidth || slotY >= r.recipeHeight)
-                        {
-                            recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe));
-                        }
-                        else
-                        {
-                            RecipeSymbol stack = r.getInput()[slotX + (slotY * r.recipeWidth)];
-                            recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, stack, false,recipe));
-                        }
-                    }
-
-                    int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-8).y) / 2;
-                    recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput().copy()), false,recipe).setAsOutput());
-
-                    map.put(recipe,recipeSlots);
-                    slots.addAll(recipeSlots);
-                    yOffset += 10;
-                }
-                else
-                {
-                    slotsAmount = 5;
-
-
-                    for (int i = 0; i < slotsAmount - 1; i++)
-                    {
-                        final int slotX = i % 2;
-                        final int slotY = i / 2;
-
-                        if (slotX >= r.recipeWidth || slotY >= r.recipeHeight)
-                        {
-                            recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, null, false,recipe));
-                        }
-                        else
-                        {
-                            RecipeSymbol stack = r.getInput()[slotX + (slotY * r.recipeWidth)];
-                            recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, stack, false,recipe));
-                        }
-                    }
-
-                    int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
-                    recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput()), false,recipe).setAsOutput());
-
-                    map.put(recipe,recipeSlots);
-                    slots.addAll(recipeSlots);
-                    yOffset += 10;
-                }
-                recipeAmount++;
-            }
-            else if (recipe instanceof RecipeEntryCraftingShapeless)
-            {
-                final RecipeEntryCraftingShapeless r = (RecipeEntryCraftingShapeless) recipe;
-                int slotsAmount = 0;
-
-                if (r.getInput().size() > 4)
-                {
-                    slotsAmount = 10;
-
-
-                    for (int i = 0; i < Math.max(r.getInput().size(),9); i++)
-                    {
-                        if(i >= r.getInput().size()){
-                            recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe));
-                            continue;
-                        }
-                        RecipeSymbol stack = r.getInput().get(i);
-                        recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, stack, false,recipe));
-                    }
-
-                    int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-8).y) / 2;
-                    recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput()), false,recipe).setAsOutput());
-
-                    map.put(recipe,recipeSlots);
-                    slots.addAll(recipeSlots);
-                    yOffset += 10;
-                }
-                else
-                {
-                    slotsAmount = 5;
-
-                    for (int i = 0; i < Math.max(r.getInput().size(),4); i++)
-                    {
-                        if(i >= r.getInput().size()){
-                            recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, null, false,recipe));
-                            continue;
-                        }
-                        RecipeSymbol stack = r.getInput().get(i);
-                        recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, stack, false,recipe));
-                    }
-
-                    int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
-                    recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput()), false,recipe).setAsOutput());
-
-                    map.put(recipe,recipeSlots);
-                    slots.addAll(recipeSlots);
-                    yOffset += 10;
-                }
+            if (recipeToDisplayAdapterMap.containsKey(recipe.getClass())) {
+                RecipeDisplayAdapter adapter = recipeToDisplayAdapterMap.get(recipe.getClass());
+                List<GuidebookSlot> recipeSlots = adapter.getSlots(recipe, recipeAmount, xOffset, yOffset);
+                map.put(recipe,recipeSlots);
+                slots.addAll(recipeSlots);
+                yOffset += 10;
                 recipeAmount++;
             }
         }
@@ -268,4 +195,8 @@ public class CraftingPage
             }
         }
     }
+
+    public static boolean guidebookSupportsRecipe(RecipeEntryBase<?, ?, ?> recipe) {
+        return recipeToDisplayAdapterMap.containsKey(recipe.getClass());
+    }
 }
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingSection.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingSection.java
index 9eb0887f0..e0a985018 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingSection.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingSection.java
@@ -3,11 +3,8 @@ package net.minecraft.client.gui.guidebook.crafting;
 import net.minecraft.client.gui.guidebook.GuidebookPage;
 import net.minecraft.client.gui.guidebook.SearchableGuidebookSection;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
-import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCrafting;
-import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped;
-import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShapeless;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.collection.Pair;
@@ -30,7 +27,7 @@ public class CraftingSection
     public void reloadRecipes(){
         pages.clear();
         List<RecipeEntryCrafting<?, ?>> allRecipes = new ArrayList<>(Registries.RECIPES.getAllCraftingRecipes());
-        allRecipes.removeIf((R)->(!(R instanceof RecipeEntryCraftingShaped) && !(R instanceof RecipeEntryCraftingShapeless)));
+        allRecipes.removeIf((R)->(!CraftingPage.guidebookSupportsRecipe(R)));
         int totalRecipes = allRecipes.size();
         int totalPages = MathHelper.ceilInt(totalRecipes, CraftingPage.RECIPES_PER_PAGE);
         for (int i = 0; i < totalPages; i++) {
@@ -55,7 +52,7 @@ public class CraftingSection
         if(filteredPages == null || !Objects.equals(filteredPages.getLeft(), query.rawQuery)) {
             ArrayList<RecipeEntryCrafting<?, ?>> filteredRecipes = new ArrayList<>();
             List<RecipeEntryCrafting<?, ?>> allRecipes = new ArrayList<>(Registries.RECIPES.getAllCraftingRecipes());
-            allRecipes.removeIf((R)->(!(R instanceof RecipeEntryCraftingShaped) && !(R instanceof RecipeEntryCraftingShapeless)));
+            allRecipes.removeIf((R)->(!CraftingPage.guidebookSupportsRecipe(R)));
             for (RecipeEntryCrafting<?, ?> recipe : allRecipes) {
                 if(recipe.matchesQueryIgnoreExceptions(query)){
                     filteredRecipes.add(recipe);
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/LabelDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/LabelDisplayAdapter.java
new file mode 100644
index 000000000..db18caa3f
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/LabelDisplayAdapter.java
@@ -0,0 +1,121 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryLabel;
+import net.minecraft.core.item.IItemConvertible;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class LabelDisplayAdapter implements RecipeDisplayAdapter<RecipeEntryLabel>{
+    protected static final IItemConvertible[] randomOptions = new IItemConvertible[100];
+    public static final String[] randomNames = new String[] {"Useless", "Bob", "Steve", "Adam", "Lucas", "George", "Ferdinand", "Hemingway", "Greg", "Brian", "Fells", "Herobrine"};
+    static {
+        {
+            int blocksAdded = 0;
+            int lastId = 0;
+            int offset = 1;
+            while (blocksAdded < 50) {
+                Block b = null;
+                while (b == null) {
+                    b = Block.getBlock(lastId + offset++);
+                }
+                randomOptions[blocksAdded++] = b;
+                lastId = b.id;
+                offset = 1;
+            }
+        }
+        {
+            int itemsAdded = 0;
+            int lastId = 0;
+            int offset = 1;
+            while (itemsAdded < 50) {
+                Item b = null;
+                while (b == null) {
+                    b = Item.getItem(lastId + offset++);
+                }
+                randomOptions[50 + itemsAdded++] = b;
+                lastId = b.id;
+                offset = 1;
+            }
+        }
+    }
+    @Override
+    public List<GuidebookSlot> getSlots(RecipeEntryLabel recipe, int recipeAmount, int xOffset, int yOffset) {
+        List<GuidebookSlot> recipeSlots = new ArrayList<>();
+
+        ItemStack[] sharedBuffer = new ItemStack[2]; // 0:Label | 1:Item to name
+        RecipeSymbol[] symbols = {new RecipeSymbol(Items.LABEL.getDefaultStack()), new RecipeSymbol(randomOptions[0].getDefaultStack()), null, null, new RecipeSymbol(randomOptions[0].getDefaultStack())};
+
+        for (int i = 0; i < 4; i++) {
+            GuidebookSlot slot;
+            int x = 13 + 18 * (i % 2) + xOffset;
+            int y = 10 + 18 * ((i / 2) + recipeAmount * 3) + yOffset;
+            if (i == 0) {
+                slot = new LabelGuidebookSlot(i, x, y, symbols[i], false, recipe, sharedBuffer);
+            } else if (i == 1) {
+                slot = new UnnamedInputGuidebookSlot(i, x, y, symbols[i], false, recipe, sharedBuffer);
+            } else {
+                slot = new GuidebookSlot(i, x, y, symbols[i], false, recipe);
+            }
+            recipeSlots.add(slot);
+        }
+
+        int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+        recipeSlots.add(new NamedOutputGuidebookSlot(symbols.length - 1, 81 + xOffset, centerY, symbols[4], false, recipe, sharedBuffer).setAsOutput());
+        return recipeSlots;
+    }
+
+    public static class LabelGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] itemBuffer;
+        public LabelGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, ItemStack[] itemBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            this.itemBuffer = itemBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            Random r = new Random();
+            item = new ItemStack(Items.LABEL);
+            itemBuffer[0] = item;
+            item.setCustomName(randomNames[r.nextInt(randomNames.length)]);
+        }
+    }
+
+    public static class UnnamedInputGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] itemBuffer;
+        public UnnamedInputGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, ItemStack[] itemBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            this.itemBuffer = itemBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            Random r = new Random();
+            item = randomOptions[r.nextInt(randomOptions.length)].getDefaultStack();
+            itemBuffer[1] = item;
+        }
+    }
+
+    public static class NamedOutputGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] itemBuffer;
+        public NamedOutputGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, ItemStack[] itemBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            this.itemBuffer = itemBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            item = new ItemStack(itemBuffer[1]);
+            item.setCustomName(itemBuffer[0].getCustomName());
+            item.setCustomColor(itemBuffer[0].getCustomColor());
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/LabelDyeDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/LabelDyeDisplayAdapter.java
new file mode 100644
index 000000000..e41eb1db1
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/LabelDyeDisplayAdapter.java
@@ -0,0 +1,88 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingWithTool;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryLabelDye;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.util.helper.DyeColor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class LabelDyeDisplayAdapter implements RecipeDisplayAdapter<RecipeEntryLabelDye> {
+    @Override
+    public List<GuidebookSlot> getSlots(RecipeEntryLabelDye recipe, int recipeAmount, int xOffset, int yOffset) {
+        List<GuidebookSlot> recipeSlots = new ArrayList<>();
+
+        ItemStack[] sharedBuffer = new ItemStack[2]; // 0:Label | 1:Dye
+        RecipeSymbol[] symbols = {new RecipeSymbol(Items.LABEL.getDefaultStack()), new RecipeSymbol(Items.DYE.getDefaultStack()), null, null, new RecipeSymbol(Items.LABEL.getDefaultStack())};
+
+        for (int i = 0; i < 4; i++) {
+            GuidebookSlot slot;
+            int x = 13 + 18 * (i % 2) + xOffset;
+            int y = 10 + 18 * ((i / 2) + recipeAmount * 3) + yOffset;
+            if (i == 0) {
+                slot = new LabelGuidebookSlot(i, x, y, symbols[i], false, recipe, sharedBuffer);
+            } else if (i == 1) {
+                slot = new DyeGuidebookSlot(i, x, y, symbols[i], false, recipe, sharedBuffer);
+            } else {
+                slot = new GuidebookSlot(i, x, y, symbols[i], false, recipe);
+            }
+            recipeSlots.add(slot);
+        }
+
+        int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+        recipeSlots.add(new NamedOutputGuidebookSlot(symbols.length - 1, 81 + xOffset, centerY, symbols[4], false,recipe, sharedBuffer).setAsOutput());
+        return recipeSlots;
+    }
+
+    public static class LabelGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] itemBuffer;
+        public LabelGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, ItemStack[] itemBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            this.itemBuffer = itemBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            Random r = new Random();
+            item = new ItemStack(Items.LABEL);
+            itemBuffer[0] = item;
+            item.setCustomName(LabelDisplayAdapter.randomNames[r.nextInt(LabelDisplayAdapter.randomNames.length)]);
+        }
+    }
+
+    public static class DyeGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] itemBuffer;
+        public DyeGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, ItemStack[] itemBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            this.itemBuffer = itemBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            Random r = new Random();
+            item = new ItemStack(Items.DYE, 1, r.nextInt(DyeColor.COLOR_AMOUNT));
+            itemBuffer[1] = item;
+        }
+    }
+
+    public static class NamedOutputGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] itemBuffer;
+        public NamedOutputGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, ItemStack[] itemBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            this.itemBuffer = itemBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            item = new ItemStack(itemBuffer[0]);
+            item.setCustomName(itemBuffer[0].getCustomName());
+            item.setCustomColor((byte) (15 - itemBuffer[1].getMetadata()));
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/MapDuplicationDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/MapDuplicationDisplayAdapter.java
new file mode 100644
index 000000000..a6e1596e8
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/MapDuplicationDisplayAdapter.java
@@ -0,0 +1,33 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryMapDuplication;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MapDuplicationDisplayAdapter implements RecipeDisplayAdapter<RecipeEntryMapDuplication>{
+    @Override
+    public List<GuidebookSlot> getSlots(RecipeEntryMapDuplication recipe, int recipeAmount, int xOffset, int yOffset) {
+        List<GuidebookSlot> recipeSlots = new ArrayList<>();
+
+        ItemStack initMap = new ItemStack(Items.MAP, 1, 1);
+        initMap.getData().putBoolean("initialized", true);
+        ItemStack initMapX2 = new ItemStack(initMap);
+        initMapX2.stackSize = 2;
+        RecipeSymbol[] symbols = {new RecipeSymbol(initMap), new RecipeSymbol(Items.MAP.getDefaultStack()), null, null, new RecipeSymbol(initMapX2)};
+
+        for (int i = 0; i < 4; i++) {
+            int x = 13 + 18 * (i % 2) + xOffset;
+            int y = 10 + 18 * ((i / 2) + recipeAmount * 3) + yOffset;
+            recipeSlots.add(new GuidebookSlot(i, x, y, symbols[i], false, recipe));
+        }
+
+        int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+        recipeSlots.add(new GuidebookSlot(symbols.length - 1, 81 + xOffset, centerY, symbols[4], false, recipe).setAsOutput());
+        return recipeSlots;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/RecipeDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/RecipeDisplayAdapter.java
new file mode 100644
index 000000000..fe2c09c79
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/RecipeDisplayAdapter.java
@@ -0,0 +1,10 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCrafting;
+
+import java.util.List;
+
+public interface RecipeDisplayAdapter<T extends RecipeEntryCrafting<?, ?>> {
+    List<GuidebookSlot> getSlots(T recipe, int recipeAmount, int xOffset, int yOffset);
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/RepairableDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/RepairableDisplayAdapter.java
new file mode 100644
index 000000000..8d5ed8f0a
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/RepairableDisplayAdapter.java
@@ -0,0 +1,130 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryRepairable;
+import net.minecraft.core.item.ItemStack;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class RepairableDisplayAdapter implements RecipeDisplayAdapter<RecipeEntryRepairable>{
+    @Override
+    public List<GuidebookSlot> getSlots(RecipeEntryRepairable recipe, int recipeAmount, int xOffset, int yOffset) {
+        List<GuidebookSlot> recipeSlots = new ArrayList<>();
+
+        ItemStack[] sharedItemBuffer = new ItemStack[1]; // Cursed shared reference
+        int[] sharedInt = new int[1]; // Another Cursed shared reference
+        RecipeSymbol[] symbols = {new RecipeSymbol(recipe.inItem), recipe.repairMaterial, recipe.repairMaterial, recipe.repairMaterial, new RecipeSymbol(recipe.inItem)};
+
+        for (int i = 0; i < 4; i++) {
+            GuidebookSlot slot;
+            int x = 13 + 18 * (i % 2) + xOffset;
+            int y = 10 + 18 * ((i / 2) + recipeAmount * 3) + yOffset;
+            if (i == 0) {
+                slot = new RepariableGuidebookSlot(i, x, y, symbols[i], false, recipe, sharedItemBuffer);
+            } else {
+                slot = new MaterialGuidebookSlot(i, x, y, symbols[i], false, recipe, sharedInt);
+            }
+            recipeSlots.add(slot);
+        }
+
+        int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+        recipeSlots.add(new RepairOutputGuidebookSlot(symbols.length - 1, 81 + xOffset, centerY, symbols[4], false,recipe, sharedItemBuffer, sharedInt).setAsOutput());
+        return recipeSlots;
+    }
+
+    public static class RepariableGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] buffer;
+        private int tickCount = 0;
+        public RepariableGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, ItemStack[] itemBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            buffer = itemBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            tickCount++;
+            if (tickCount % 3 == 1) {
+                Random r = new Random();
+                if(symbol != null && symbol.getItemGroup() != null){
+                    List<ItemStack> list = symbol.resolve();
+                    ItemStack newItem = list.get(r.nextInt(list.size()));
+                    if (list.size() > 1) {
+                        while (newItem == item){
+                            newItem = list.get(r.nextInt(list.size()));
+                        }
+                    }
+                    item = newItem;
+                }
+                item.setMetadata(r.nextInt(item.getMaxDamage()));
+            }
+            buffer[0] = item;
+        }
+    }
+
+    public static class MaterialGuidebookSlot extends GuidebookSlot {
+        private final int[] buffer;
+        public MaterialGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, int[] intBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            buffer = intBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            Random r = new Random(System.currentTimeMillis());
+            if (index == 1) buffer[0] = 0; // Reset buffer on first slot
+            if (r.nextInt(3) >= (index)) {
+                item = null;
+                return;
+            }
+            buffer[0]++; // Increment if has a chainlink
+            if(symbol != null && symbol.getItemGroup() != null){
+                List<ItemStack> list = symbol.resolve();
+                ItemStack newItem = list.get(r.nextInt(list.size()));
+                if (list.size() > 1) {
+                    while (newItem == item){
+                        newItem = list.get(r.nextInt(list.size()));
+                    }
+                }
+                item = newItem;
+            } else if (symbol != null) {
+                item = symbol.resolve().get(0);
+            }
+        }
+    }
+
+    public static class RepairOutputGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] itemBuffer;
+        private final int[] intBuffer;
+        public RepairOutputGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, ItemStack[] itemBuffer, int[] intBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            this.itemBuffer = itemBuffer;
+            this.intBuffer = intBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            if (itemBuffer[0] == null) {
+                item = null;
+                return;
+            }
+            int chains = intBuffer[0];
+
+            item = new ItemStack(itemBuffer[0]);
+            for (int i = 0; i < chains; i++)
+            {
+                if (item.getMetadata() <= item.getMaxDamage())
+                {
+                    item.setMetadata(item.getMetadata() - item.getMaxDamage() / 8);
+                }
+            }
+            if (item.getMetadata() < 0) {
+                item.setMetadata(0);
+            }
+
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ScrapDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ScrapDisplayAdapter.java
new file mode 100644
index 000000000..8d5dd04c7
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ScrapDisplayAdapter.java
@@ -0,0 +1,95 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryScrap;
+import net.minecraft.core.item.ItemStack;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class ScrapDisplayAdapter implements RecipeDisplayAdapter<RecipeEntryScrap>{
+    @Override
+    public List<GuidebookSlot> getSlots(RecipeEntryScrap recipe, int recipeAmount, int xOffset, int yOffset) {
+        List<GuidebookSlot> recipeSlots = new ArrayList<>();
+
+        ItemStack[] sharedItemBuffer = new ItemStack[1]; // Cursed shared reference
+        RecipeSymbol[] symbols = {new RecipeSymbol(recipe.itemToScrap.getDefaultStack()), null, null, null, new RecipeSymbol(recipe.scrapYieldStack)};
+
+        for (int i = 0; i < 4; i++) {
+            GuidebookSlot slot;
+            int x = 13 + 18 * (i % 2) + xOffset;
+            int y = 10 + 18 * ((i / 2) + recipeAmount * 3) + yOffset;
+            if (i == 0) {
+                slot = new ToScrapGuidebookSlot(i, x, y, symbols[i], false, recipe, sharedItemBuffer);
+            } else {
+                slot = new GuidebookSlot(i, x, y, symbols[i], false, recipe);
+            }
+            recipeSlots.add(slot);
+        }
+
+        int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+        recipeSlots.add(new ScrapYieldGuidebookSlot(symbols.length - 1, 81 + xOffset, centerY, symbols[4], false,recipe, sharedItemBuffer).setAsOutput());
+        return recipeSlots;
+    }
+
+    public static class ToScrapGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] itemBuffer;
+        public ToScrapGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe, ItemStack[] itemBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            this.itemBuffer = itemBuffer;
+        }
+
+        @Override
+        public void showRandomItem() {
+            Random r = new Random();
+            if(symbol != null && symbol.getItemGroup() != null){
+                List<ItemStack> list = symbol.resolve();
+                ItemStack newItem = list.get(r.nextInt(list.size()));
+                if (list.size() > 1) {
+                    while (newItem == item){
+                        newItem = list.get(r.nextInt(list.size()));
+                    }
+                }
+                item = newItem;
+            }
+            item.setMetadata(r.nextInt(item.getMaxDamage()));
+            itemBuffer[0] = item;
+        }
+    }
+
+    public static class ScrapYieldGuidebookSlot extends GuidebookSlot {
+        private final ItemStack[] itemBuffer;
+        private final RecipeEntryScrap recipe;
+        public ScrapYieldGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryScrap recipe, ItemStack[] itemBuffer) {
+            super(id, x, y, symbol, discovered, recipe);
+            this.itemBuffer = itemBuffer;
+            this.recipe = recipe;
+        }
+
+        @Override
+        public void showRandomItem() {
+            if (itemBuffer[0] == null) {
+                item = null;
+                return;
+            } else {
+                item = recipe.scrapYield.getDefaultStack();
+            }
+            Random r = new Random();
+            if(symbol != null && symbol.getItemGroup() != null){
+                List<ItemStack> list = symbol.resolve();
+                ItemStack newItem = list.get(r.nextInt(list.size()));
+                if (list.size() > 1) {
+                    while (newItem == item){
+                        newItem = list.get(r.nextInt(list.size()));
+                    }
+                }
+                item = newItem;
+            }
+            item.stackSize = (int) (((float)(itemBuffer[0].getMaxDamage() - (itemBuffer[0].getMetadata())) / itemBuffer[0].getMaxDamage()) * (recipe.maxYield - 1)) + 1;
+            if (item.stackSize <= 0) item = null;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ShapedDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ShapedDisplayAdapter.java
new file mode 100644
index 000000000..251c82a57
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ShapedDisplayAdapter.java
@@ -0,0 +1,65 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ShapedDisplayAdapter implements RecipeDisplayAdapter<RecipeEntryCraftingShaped> {
+    @Override
+    public List<GuidebookSlot> getSlots(RecipeEntryCraftingShaped recipe, int recipeAmount, int xOffset, int yOffset) {
+        List<GuidebookSlot> recipeSlots = new ArrayList<>();
+        int slotsAmount;
+
+        if (recipe.recipeHeight > 2 || recipe.recipeWidth > 2)
+        {
+            slotsAmount = 10;
+
+            for (int i = 0; i < slotsAmount - 1; i++)
+            {
+                final int slotX = i % 3;
+                final int slotY = i / 3;
+
+                if (slotX >= recipe.recipeWidth || slotY >= recipe.recipeHeight)
+                {
+                    recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe));
+                }
+                else
+                {
+                    RecipeSymbol stack = recipe.getInput()[slotX + (slotY * recipe.recipeWidth)];
+                    recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, stack, false,recipe));
+                }
+            }
+
+            int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-8).y) / 2;
+            recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(recipe.getOutput().copy()), false,recipe).setAsOutput());
+        }
+        else
+        {
+            slotsAmount = 5;
+
+
+            for (int i = 0; i < slotsAmount - 1; i++)
+            {
+                final int slotX = i % 2;
+                final int slotY = i / 2;
+
+                if (slotX >= recipe.recipeWidth || slotY >= recipe.recipeHeight)
+                {
+                    recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, null, false,recipe));
+                }
+                else
+                {
+                    RecipeSymbol stack = recipe.getInput()[slotX + (slotY * recipe.recipeWidth)];
+                    recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, stack, false,recipe));
+                }
+            }
+
+            int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+            recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(recipe.getOutput()), false,recipe).setAsOutput());
+        }
+        return recipeSlots;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ShapelessDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ShapelessDisplayAdapter.java
new file mode 100644
index 000000000..b87b71c28
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ShapelessDisplayAdapter.java
@@ -0,0 +1,53 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShapeless;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ShapelessDisplayAdapter implements RecipeDisplayAdapter<RecipeEntryCraftingShapeless>{
+    @Override
+    public List<GuidebookSlot> getSlots(RecipeEntryCraftingShapeless recipe, int recipeAmount, int xOffset, int yOffset) {
+        List<GuidebookSlot> recipeSlots = new ArrayList<>();
+        int slotsAmount;
+
+        if (recipe.getInput().size() > 4)
+        {
+            slotsAmount = 10;
+
+
+            for (int i = 0; i < Math.max(recipe.getInput().size(),9); i++)
+            {
+                if(i >= recipe.getInput().size()){
+                    recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe));
+                    continue;
+                }
+                RecipeSymbol stack = recipe.getInput().get(i);
+                recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, stack, false,recipe));
+            }
+
+            int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-8).y) / 2;
+            recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(recipe.getOutput()), false,recipe).setAsOutput());
+        }
+        else
+        {
+            slotsAmount = 5;
+
+            for (int i = 0; i < Math.max(recipe.getInput().size(),4); i++)
+            {
+                if(i >= recipe.getInput().size()){
+                    recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, null, false,recipe));
+                    continue;
+                }
+                RecipeSymbol stack = recipe.getInput().get(i);
+                recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, stack, false,recipe));
+            }
+
+            int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+            recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(recipe.getOutput()), false,recipe).setAsOutput());
+        }
+        return recipeSlots;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ToolDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ToolDisplayAdapter.java
new file mode 100644
index 000000000..a52b1bf75
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/ToolDisplayAdapter.java
@@ -0,0 +1,59 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingWithTool;
+import net.minecraft.core.item.ItemStack;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class ToolDisplayAdapter implements RecipeDisplayAdapter<RecipeEntryCraftingWithTool>{
+    @Override
+    public List<GuidebookSlot> getSlots(RecipeEntryCraftingWithTool recipe, int recipeAmount, int xOffset, int yOffset) {
+        List<GuidebookSlot> recipeSlots = new ArrayList<>();
+
+        RecipeSymbol[] symbols = {recipe.inputSymbol, recipe.toolToUse, null, null, new RecipeSymbol(recipe.output)};
+
+        for (int i = 0; i < 4; i++) {
+            GuidebookSlot slot;
+            int x = 13 + 18 * (i % 2) + xOffset;
+            int y = 10 + 18 * ((i / 2) + recipeAmount * 3) + yOffset;
+            if (symbols[i] == recipe.toolToUse) {
+                slot = new ToolGuidebookSlot(i, x, y, symbols[i], false, recipe);
+            } else {
+                slot = new GuidebookSlot(i, x, y, symbols[i], false, recipe);
+            }
+            recipeSlots.add(slot);
+        }
+
+        int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+        recipeSlots.add(new GuidebookSlot(symbols.length - 1, 81 + xOffset, centerY, symbols[4], false,recipe).setAsOutput());
+        return recipeSlots;
+    }
+
+    public static class ToolGuidebookSlot extends GuidebookSlot {
+
+        public ToolGuidebookSlot(int id, int x, int y, RecipeSymbol symbol, boolean discovered, RecipeEntryBase<?, ?, ?> recipe) {
+            super(id, x, y, symbol, discovered, recipe);
+        }
+
+        @Override
+        public void showRandomItem() {
+            Random r = new Random();
+            if(symbol != null && symbol.getItemGroup() != null){
+                List<ItemStack> list = symbol.resolve();
+                ItemStack newItem = list.get(r.nextInt(list.size()));
+                if (list.size() > 1) {
+                    while (newItem == item){
+                        newItem = list.get(r.nextInt(list.size()));
+                    }
+                }
+                item = newItem;
+            }
+            item.setMetadata(r.nextInt(item.getMaxDamage()));
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/UndyeDisplayAdapter.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/UndyeDisplayAdapter.java
new file mode 100644
index 000000000..bc8b8a0dd
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/displays/UndyeDisplayAdapter.java
@@ -0,0 +1,33 @@
+package net.minecraft.client.gui.guidebook.crafting.displays;
+
+import net.minecraft.client.gui.guidebook.GuidebookSlot;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryUndyeing;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class UndyeDisplayAdapter implements RecipeDisplayAdapter<RecipeEntryUndyeing>{
+    @Override
+    public List<GuidebookSlot> getSlots(RecipeEntryUndyeing recipe, int recipeAmount, int xOffset, int yOffset) {
+        List<GuidebookSlot> recipeSlots = new ArrayList<>();
+
+        int slotsAmount = 10;
+        for (int i = 0; i < slotsAmount - 1; i++)
+        {
+            if (i == 4) {
+                recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, new RecipeSymbol(Blocks.SPONGE_WET.getDefaultStack()), false,recipe));
+            } else {
+                RecipeSymbol stack = recipe.inputSymbol;
+                recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, stack, false,recipe));
+            }
+        }
+
+        int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-8).y) / 2;
+        recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(recipe.output.copy()), false,recipe).setAsOutput());
+
+
+        return recipeSlots;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/entity/NoteBlockEntity.java b/src/main/java/net/minecraft/core/block/entity/NoteBlockEntity.java
index e221f94e3..cbe8141d8 100644
--- a/src/main/java/net/minecraft/core/block/entity/NoteBlockEntity.java
+++ b/src/main/java/net/minecraft/core/block/entity/NoteBlockEntity.java
@@ -53,24 +53,24 @@ public class NoteBlockEntity extends BlockEntity
             return;
         }
         Material material = world.getBlockMaterial(x, y - 1, z);
-        byte byte0 = 0;
+        byte noteIndex = 0;
         if(material == Material.stone)
         {
-            byte0 = 1;
+            noteIndex = 1;
         }
         if(material == Material.sand)
         {
-            byte0 = 2;
+            noteIndex = 2;
         }
         if(material == Material.glass)
         {
-            byte0 = 3;
+            noteIndex = 3;
         }
         if(material == Material.wood)
         {
-            byte0 = 4;
+            noteIndex = 4;
         }
-        world.triggerEvent(x, y, z, byte0, note);
+        world.triggerEvent(x, y, z, noteIndex, note);
     }
 
     public byte note;
diff --git a/src/main/java/net/minecraft/core/block/piston/BasePistonBlock.java b/src/main/java/net/minecraft/core/block/piston/BasePistonBlock.java
index 42e14c874..31edea354 100644
--- a/src/main/java/net/minecraft/core/block/piston/BasePistonBlock.java
+++ b/src/main/java/net/minecraft/core/block/piston/BasePistonBlock.java
@@ -105,7 +105,8 @@ public class BasePistonBlock extends Block
         if(world.getSignal(x, y, z, Side.BOTTOM)) {
             return true;
         }
-        if(world.getSignal(x, y + 2, z, Side.TOP)) {
+        // QC
+        if(direction != 1 && world.getSignal(x, y + 2, z, Side.TOP)) {
             return true;
         }
         if(world.getSignal(x, y + 1, z - 1, Side.NORTH)) {
@@ -123,6 +124,7 @@ public class BasePistonBlock extends Block
     @Override
     public void triggerEvent(World world, int x, int y, int z, int index, int data)
     {
+        // Index 0 is pushing, index 1 is retracting
         int direction = data;
         if (direction >= 6) direction = 0;
         if(index == 0)
@@ -138,10 +140,15 @@ public class BasePistonBlock extends Block
             BlockEntity tileentity = world.getBlockEntity(x + PistonDirections.xOffset[direction], y + PistonDirections.yOffset[direction], z + PistonDirections.zOffset[direction]);
             if(tileentity != null && (tileentity instanceof MovingPistonBlockEntity))
             {
-                ((MovingPistonBlockEntity)tileentity).finalTick();
+                MovingPistonBlockEntity moving = ((MovingPistonBlockEntity) tileentity);
+                if (!moving.isExtending()) {
+                    ((MovingPistonBlockEntity)tileentity).finalTick();
+                } else {
+                    world.setBlock(x + PistonDirections.xOffset[direction], y + PistonDirections.yOffset[direction], z + PistonDirections.zOffset[direction], 0);
+                }
             }
             world.setBlockAndMetadata(x, y, z, Blocks.PISTON_MOVING.id, direction);
-            world.setBlockTileEntity(x, y, z, MovingPistonBlock.createTileEntity(id, direction, direction, false, true));
+            world.replaceBlockTileEntity(x, y, z, MovingPistonBlock.createTileEntity(id, direction, direction, false, true));
             if(isSticky)
             {
                 int x1 = x + PistonDirections.xOffset[direction] * 2;
@@ -167,12 +174,13 @@ public class BasePistonBlock extends Block
                 }
                 if(!flag && id1 > 0 && isPushable(id1, world, x1, y1, z1, false) && (Block.blocksList[id1].getPistonPushReaction() == 0 || id1 == Blocks.PISTON_BASE.id || id1 == Blocks.PISTON_BASE_STICKY.id))
                 {
-                    world.setBlockWithNotify(x1, y1, z1, 0);
+                    world.setBlock(x1, y1, z1, 0);
                     x += PistonDirections.xOffset[direction];
                     y += PistonDirections.yOffset[direction];
                     z += PistonDirections.zOffset[direction];
                     world.setBlockAndMetadata(x, y, z, Blocks.PISTON_MOVING.id, meta1);
-                    world.setBlockTileEntity(x, y, z, MovingPistonBlock.createTileEntity(id1, meta1, direction, false, false));
+                    world.replaceBlockTileEntity(x, y, z, MovingPistonBlock.createTileEntity(id1, meta1, direction, false, false));
+                    world.notifyBlockChange(x1, y1, z1, 0);
                 } else
                 if(!flag)
                 {
@@ -288,7 +296,7 @@ public class BasePistonBlock extends Block
             {
                 break;
             }
-            if(yo <= 0 || yo >= world.getHeightBlocks() - 1)
+            if(yo < 0 || yo >= world.getHeightBlocks())
             {
                 return false;
             }
@@ -328,9 +336,9 @@ public class BasePistonBlock extends Block
 
     private boolean tryExtend(World world, int x, int y, int z, int direction)
     {
-        int i1 = x + PistonDirections.xOffset[direction % 6];
-        int j1 = y + PistonDirections.yOffset[direction % 6];
-        int k1 = z + PistonDirections.zOffset[direction % 6];
+        int xo = x + PistonDirections.xOffset[direction % 6];
+        int yo = y + PistonDirections.yOffset[direction % 6];
+        int zo = z + PistonDirections.zOffset[direction % 6];
         int l1 = 0;
         do
         {
@@ -338,53 +346,66 @@ public class BasePistonBlock extends Block
             {
                 break;
             }
-            if(j1 <= 0 || j1 >= world.getHeightBlocks() - 1)
+            if(yo < 0 || yo >= world.getHeightBlocks())
             {
                 return false;
             }
-            int j2 = world.getBlockId(i1, j1, k1);
+            int j2 = world.getBlockId(xo, yo, zo);
             if(j2 == 0)
             {
                 break;
             }
-            if(!isPushable(j2, world, i1, j1, k1, true))
+            if(!isPushable(j2, world, xo, yo, zo, true))
             {
                 return false;
             }
             if(Block.blocksList[j2].getPistonPushReaction() == 1)
             {
-                Block.blocksList[j2].dropBlockWithCause(world, EnumDropCause.WORLD, i1, j1, k1, world.getBlockMetadata(i1, j1, k1), null, null);
-                world.setBlockWithNotify(i1, j1, k1, 0);
+                Block.blocksList[j2].dropBlockWithCause(world, EnumDropCause.WORLD, xo, yo, zo, world.getBlockMetadata(xo, yo, zo), null, null);
+                world.setBlockWithNotify(xo, yo, zo, 0);
                 break;
             }
             if(l1 == 12)
             {
                 return false;
             }
-            i1 += PistonDirections.xOffset[direction % 6];
-            j1 += PistonDirections.yOffset[direction % 6];
-            k1 += PistonDirections.zOffset[direction % 6];
+            xo += PistonDirections.xOffset[direction % 6];
+            yo += PistonDirections.yOffset[direction % 6];
+            zo += PistonDirections.zOffset[direction % 6];
             l1++;
         } while(true);
         int l2 = 0;
-        for(; i1 != x || j1 != y || k1 != z; k1 = l2)
+        for(; xo != x || yo != y || zo != z; zo = l2)
         {
-            int i2 = i1 - PistonDirections.xOffset[direction % 6];
-            int k2 = j1 - PistonDirections.yOffset[direction % 6];
-            l2 = k1 - PistonDirections.zOffset[direction % 6];
+            int i2 = xo - PistonDirections.xOffset[direction % 6];
+            int k2 = yo - PistonDirections.yOffset[direction % 6];
+            l2 = zo - PistonDirections.zOffset[direction % 6];
             int i3 = world.getBlockId(i2, k2, l2);
             int j3 = world.getBlockMetadata(i2, k2, l2);
             if(i3 == id && i2 == x && k2 == y && l2 == z)
             {
-                world.setBlockAndMetadata(i1, j1, k1, Blocks.PISTON_MOVING.id, direction | (isSticky ? 8 : 0));
-                world.setBlockTileEntity(i1, j1, k1, MovingPistonBlock.createTileEntity(Blocks.PISTON_HEAD.id, direction | (isSticky ? 8 : 0), direction, true, false));
+                world.setBlockAndMetadata(xo, yo, zo, Blocks.PISTON_MOVING.id, direction | (isSticky ? 8 : 0));
+                world.replaceBlockTileEntity(xo, yo, zo, MovingPistonBlock.createTileEntity(Blocks.PISTON_HEAD.id, direction | (isSticky ? 8 : 0), direction, true, false));
+            } else if (i3 == Blocks.PISTON_MOVING.id)
+            {
+                BlockEntity old = world.getBlockEntity(i2, k2, l2);
+                if (old instanceof MovingPistonBlockEntity) {
+                    MovingPistonBlockEntity moving = (MovingPistonBlockEntity) old;
+                    if (!moving.isSourcePiston()) {
+                        i3 = moving.getMovedId();
+                        j3 = moving.getMovedData();
+                        world.removeBlockTileEntity(i2, k2, l2);
+                    }
+                }
+                world.setBlockAndMetadata(xo, yo, zo, Blocks.PISTON_MOVING.id, j3);
+                world.replaceBlockTileEntity(xo, yo, zo, MovingPistonBlock.createTileEntity(i3, j3, direction, true, false));
             } else
             {
-                world.setBlockAndMetadata(i1, j1, k1, Blocks.PISTON_MOVING.id, j3);
-                world.setBlockTileEntity(i1, j1, k1, MovingPistonBlock.createTileEntity(i3, j3, direction, true, false));
+                world.setBlockAndMetadata(xo, yo, zo, Blocks.PISTON_MOVING.id, j3);
+                world.replaceBlockTileEntity(xo, yo, zo, MovingPistonBlock.createTileEntity(i3, j3, direction, true, false));
             }
-            i1 = i2;
-            j1 = k2;
+            xo = i2;
+            yo = k2;
         }
 
         return true;
diff --git a/src/main/java/net/minecraft/core/block/piston/MovingPistonBlock.java b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlock.java
index ab847f4e2..a21b97e82 100644
--- a/src/main/java/net/minecraft/core/block/piston/MovingPistonBlock.java
+++ b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlock.java
@@ -14,8 +14,8 @@ import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockContainer, Material, World, TileEntityPiston, 
-//            Block, PistonBlockTextures, AxisAlignedBB, IBlockAccess, 
+//            BlockContainer, Material, World, TileEntityPiston,
+//            Block, PistonBlockTextures, AxisAlignedBB, IBlockAccess,
 //            BlockEntity, Player
 
 public class MovingPistonBlock extends EntityBlock
@@ -80,7 +80,10 @@ public class MovingPistonBlock extends EntityBlock
     {
         if(!world.isClientSide && world.getBlockEntity(x, y, z) == null)
         {
-            world.setBlockWithNotify(x, y, z, 0);
+            int id = 0;
+            MovingPistonBlockEntity piston = getBlockEntity(world, x, y, z);
+            if (piston != null) id = piston.getMovedId();
+            world.setBlockWithNotify(x, y, z, id);
             return true;
         } else
         {
diff --git a/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java
index e03fe5436..e9406cf4d 100644
--- a/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java
+++ b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java
@@ -24,6 +24,7 @@ public class MovingPistonBlockEntity extends BlockEntity
         this.direction = direction;
         this.extending = extending;
         this.isSourcePiston = isSourcePiston;
+        this.progress = this.progressO = 0.0F;
     }
 
     public int getMovedId()
@@ -126,15 +127,11 @@ public class MovingPistonBlockEntity extends BlockEntity
 
     public void finalTick()
     {
-        if(progressO < 1.0F)
-        {
-            progressO = progress = 1.0F;
-            worldObj.removeBlockTileEntity(x, y, z);
-            invalidate();
-            if(worldObj.getBlockId(x, y, z) == Blocks.PISTON_MOVING.id)
-            {
-                worldObj.setBlockAndMetadataWithNotify(x, y, z, movedId, movedData);
-            }
+        progressO = progress = 1.0F;
+        worldObj.removeBlockTileEntity(x, y, z);
+        invalidate();
+        if(worldObj.getBlockId(x, y, z) == Blocks.PISTON_MOVING.id) {
+            worldObj.setBlockAndMetadataWithNotify(x, y, z, movedId, movedData);
         }
     }
 
@@ -145,12 +142,7 @@ public class MovingPistonBlockEntity extends BlockEntity
         if(progressO >= 1.0F)
         {
             moveCollidedEntities(1.0F, 0.25F);
-            worldObj.removeBlockTileEntity(x, y, z);
-            invalidate();
-            if(worldObj.getBlockId(x, y, z) == Blocks.PISTON_MOVING.id)
-            {
-                worldObj.setBlockAndMetadataWithNotify(x, y, z, movedId, movedData);
-            }
+            finalTick();
             return;
         }
         progress += 0.5F;
diff --git a/src/main/java/net/minecraft/core/data/registry/Registries.java b/src/main/java/net/minecraft/core/data/registry/Registries.java
index f73bf4200..9b061abca 100644
--- a/src/main/java/net/minecraft/core/data/registry/Registries.java
+++ b/src/main/java/net/minecraft/core/data/registry/Registries.java
@@ -10,6 +10,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.data.gamerule.GameRule;
 import net.minecraft.core.data.gamerule.GameRules;
 import net.minecraft.core.item.Items;
+import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.type.WorldType;
@@ -60,6 +61,7 @@ public class Registries extends Registry<Registry<?>>
         RECIPE_TYPES.register("minecraft:crafting/repairable_stackable", RecipeEntryRepairableStackable.class);
         RECIPE_TYPES.register("minecraft:crafting/uses_tool", RecipeEntryCraftingWithTool.class);
         RECIPE_TYPES.register("minecraft:crafting/map_duplication", RecipeEntryMapDuplication.class);
+        RECIPE_TYPES.register("minecraft:crafting/undyeing", RecipeEntryUndyeing.class);
         RECIPE_TYPES.register("minecraft:smelting", RecipeEntryFurnace.class);
         RECIPE_TYPES.register("minecraft:smelting/blast", RecipeEntryBlastFurnace.class);
         RECIPE_TYPES.register("minecraft:trommeling", RecipeEntryTrommel.class);
@@ -84,6 +86,50 @@ public class Registries extends Registry<Registry<?>>
         ITEM_GROUPS.register("minecraft:wools", stackListOf(new ItemStack(Blocks.WOOL, 1, 0), new ItemStack(Blocks.WOOL, 1, 1), new ItemStack(Blocks.WOOL, 1, 2), new ItemStack(Blocks.WOOL, 1, 3), new ItemStack(Blocks.WOOL, 1, 4), new ItemStack(Blocks.WOOL, 1, 5), new ItemStack(Blocks.WOOL, 1, 6), new ItemStack(Blocks.WOOL, 1, 7), new ItemStack(Blocks.WOOL, 1, 8), new ItemStack(Blocks.WOOL, 1, 9), new ItemStack(Blocks.WOOL, 1, 10), new ItemStack(Blocks.WOOL, 1, 11), new ItemStack(Blocks.WOOL, 1, 12), new ItemStack(Blocks.WOOL, 1, 13), new ItemStack(Blocks.WOOL, 1, 14), new ItemStack(Blocks.WOOL, 1, 15)));
         ITEM_GROUPS.register("minecraft:lamps", stackListOf(new ItemStack(Blocks.LAMP_IDLE, 1, 0), new ItemStack(Blocks.LAMP_IDLE, 1, 1), new ItemStack(Blocks.LAMP_IDLE, 1, 2), new ItemStack(Blocks.LAMP_IDLE, 1, 3), new ItemStack(Blocks.LAMP_IDLE, 1, 4), new ItemStack(Blocks.LAMP_IDLE, 1, 5), new ItemStack(Blocks.LAMP_IDLE, 1, 6), new ItemStack(Blocks.LAMP_IDLE, 1, 7), new ItemStack(Blocks.LAMP_IDLE, 1, 8), new ItemStack(Blocks.LAMP_IDLE, 1, 9), new ItemStack(Blocks.LAMP_IDLE, 1, 10), new ItemStack(Blocks.LAMP_IDLE, 1, 11), new ItemStack(Blocks.LAMP_IDLE, 1, 12), new ItemStack(Blocks.LAMP_IDLE, 1, 13), new ItemStack(Blocks.LAMP_IDLE, 1, 14), new ItemStack(Blocks.LAMP_IDLE, 1, 15)));
 
+        ITEM_GROUPS.register("minecraft:tool_swords",
+            stackListOf( // metadata of -1 to indicate that the metadata check should be skipped
+                new ItemStack(Items.TOOL_SWORD_WOOD, 1, -1),
+                new ItemStack(Items.TOOL_SWORD_STONE, 1, -1),
+                new ItemStack(Items.TOOL_SWORD_IRON, 1, -1),
+                new ItemStack(Items.TOOL_SWORD_GOLD, 1, -1),
+                new ItemStack(Items.TOOL_SWORD_DIAMOND, 1, -1),
+                new ItemStack(Items.TOOL_SWORD_STEEL, 1, -1)));
+
+        List<ItemStack> stackList = new ArrayList<>();
+        stackList.add(Blocks.STAIRS_PLANKS_OAK.getDefaultStack());
+        for (DyeColor color : DyeColor.values()) {
+            stackList.add(new ItemStack(Blocks.STAIRS_PLANKS_PAINTED, 1, color.blockMeta << 4));
+        }
+        ITEM_GROUPS.register("minecraft:stairs_planks", stackList);
+
+        stackList = new ArrayList<>();
+        stackList.add(Blocks.SLAB_PLANKS_OAK.getDefaultStack());
+        for (DyeColor color : DyeColor.values()) {
+            stackList.add(new ItemStack(Blocks.SLAB_PLANKS_PAINTED, 1, color.blockMeta << 4));
+        }
+        ITEM_GROUPS.register("minecraft:slabs_planks", stackList);
+
+        stackList = new ArrayList<>();
+        stackList.add(Blocks.FENCE_PLANKS_OAK.getDefaultStack());
+        for (DyeColor color : DyeColor.values()) {
+            stackList.add(new ItemStack(Blocks.FENCE_PLANKS_OAK_PAINTED, 1, color.blockMeta));
+        }
+        ITEM_GROUPS.register("minecraft:fences_planks", stackList);
+
+        stackList = new ArrayList<>();
+        stackList.add(Blocks.FENCE_GATE_PLANKS_OAK.getDefaultStack());
+        for (DyeColor color : DyeColor.values()) {
+            stackList.add(new ItemStack(Blocks.FENCE_GATE_PLANKS_OAK_PAINTED, 1, color.blockMeta << 4));
+        }
+        ITEM_GROUPS.register("minecraft:fence_gates_planks", stackList);
+
+        stackList = new ArrayList<>();
+        stackList.add(Blocks.TRAPDOOR_PLANKS_OAK.getDefaultStack());
+        for (DyeColor color : DyeColor.values()) {
+            stackList.add(new ItemStack(Blocks.TRAPDOOR_PLANKS_PAINTED, 1, color.blockMeta << 4));
+        }
+        ITEM_GROUPS.register("minecraft:trapdoor_planks", stackList);
+
         if(RECIPES == null) new RecipeRegistry();
     }
 
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/RecipeRegistry.java b/src/main/java/net/minecraft/core/data/registry/recipe/RecipeRegistry.java
index bcbbac3d7..748ce6e9d 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/RecipeRegistry.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/RecipeRegistry.java
@@ -42,23 +42,6 @@ public class RecipeRegistry extends Registry<RecipeNamespace> {
         WORKBENCH.register("label",new RecipeEntryLabel());
         WORKBENCH.register("label_dye",new RecipeEntryLabelDye());
 
-        addCustomRecipe("minecraft:workbench/repair_chainmail_boots",       new RecipeEntryRepairable(Items.ARMOR_BOOTS_CHAINMAIL.getDefaultStack(),        new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
-        addCustomRecipe("minecraft:workbench/repair_chainmail_leggings",    new RecipeEntryRepairable(Items.ARMOR_LEGGINGS_CHAINMAIL.getDefaultStack(),     new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
-        addCustomRecipe("minecraft:workbench/repair_chainmail_chestplate",  new RecipeEntryRepairable(Items.ARMOR_CHESTPLATE_CHAINMAIL.getDefaultStack(),   new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
-        addCustomRecipe("minecraft:workbench/repair_chainmail_helmet",      new RecipeEntryRepairable(Items.ARMOR_HELMET_CHAINMAIL.getDefaultStack(),       new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
-
-        addCustomRecipe("minecraft:workbench/scrap_chainmail_boots",        new RecipeEntryScrap(Items.ARMOR_BOOTS_CHAINMAIL,       Items.CHAINLINK));
-        addCustomRecipe("minecraft:workbench/scrap_chainmail_leggings",     new RecipeEntryScrap(Items.ARMOR_LEGGINGS_CHAINMAIL,    Items.CHAINLINK));
-        addCustomRecipe("minecraft:workbench/scrap_chainmail_chestplate",   new RecipeEntryScrap(Items.ARMOR_CHESTPLATE_CHAINMAIL,  Items.CHAINLINK));
-        addCustomRecipe("minecraft:workbench/scrap_chainmail_helmet",       new RecipeEntryScrap(Items.ARMOR_HELMET_CHAINMAIL,      Items.CHAINLINK));
-
-        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_wood",     new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_WOOD,     new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
-        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_stone",    new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_STONE,    new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
-        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_iron",     new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_IRON,     new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
-        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_gold",     new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_GOLD,     new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
-        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_diamond",  new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_DIAMOND,  new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
-        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_steel",    new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_STEEL,    new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
-
         addCustomRecipe("minecraft:workbench/map_duplication", new RecipeEntryMapDuplication());
     }
 
@@ -267,17 +250,17 @@ public class RecipeRegistry extends Registry<RecipeNamespace> {
         group.register(key,recipe);
     }
 
-    public static RecipeEntryCraftingShaped parseRecipe(ItemStack itemstack, boolean consumeContainerItem, Object... aobj) {
+    public static RecipeEntryCraftingShaped parseRecipe(ItemStack itemstack, boolean consumeContainerItem, boolean allowMirror, Object... aobj) {
         StringBuilder s = new StringBuilder();
         int i = 0;
-        int j = 0;
-        int k = 0;
+        int w = 0;
+        int h = 0;
         if(aobj[i] instanceof String[])
         {
             String[] as = (String[])aobj[i++];
             for (String s2 : as) {
-                k++;
-                j = s2.length();
+                h++;
+                w = s2.length();
                 s.append(s2);
             }
 
@@ -286,8 +269,8 @@ public class RecipeRegistry extends Registry<RecipeNamespace> {
             while (aobj[i] instanceof String)
             {
                 String s1 = (String)aobj[i++];
-                k++;
-                j = s1.length();
+                h++;
+                w = s1.length();
                 s = new StringBuilder(s + s1);
             }
         }
@@ -318,8 +301,8 @@ public class RecipeRegistry extends Registry<RecipeNamespace> {
             map.put(character, recipeSymbol);
         }
 
-        RecipeSymbol[] symbols = new RecipeSymbol[j * k];
-        for(int i1 = 0; i1 < j * k; i1++)
+        RecipeSymbol[] symbols = new RecipeSymbol[w * h];
+        for(int i1 = 0; i1 < w * h; i1++)
         {
             char c = s.charAt(i1);
             if(map.containsKey(c))
@@ -330,10 +313,10 @@ public class RecipeRegistry extends Registry<RecipeNamespace> {
                 symbols[i1] = null;
             }
         }
-        return new RecipeEntryCraftingShaped(j,k,symbols,itemstack,consumeContainerItem);
+        return new RecipeEntryCraftingShaped(w, h, symbols, itemstack, consumeContainerItem, allowMirror);
     }
 
-    public static RecipeEntryCraftingShaped parseRecipe(List<String> pattern, List<RecipeSymbol> symbols, ItemStack result, boolean consumeContainerItem) {
+    public static RecipeEntryCraftingShaped parseRecipe(List<String> pattern, List<RecipeSymbol> symbols, ItemStack result, boolean consumeContainerItem, boolean allowMirror) {
         Set<Character> chars = new HashSet<>();
         for (String s : pattern) {
             char[] chars1 = s.toCharArray();
@@ -352,7 +335,7 @@ public class RecipeRegistry extends Registry<RecipeNamespace> {
             }
         }
         objs.add(0,pattern.toArray(new String[0]));
-        return parseRecipe(result,consumeContainerItem,objs.toArray());
+        return parseRecipe(result,consumeContainerItem, allowMirror,objs.toArray());
     }
 
     public void addShapelessRecipe(String recipeKey, ItemStack result, Object... ingredients) {
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/ItemStackJsonAdapter.java b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/ItemStackJsonAdapter.java
index ae90a6116..9319c04ae 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/ItemStackJsonAdapter.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/ItemStackJsonAdapter.java
@@ -19,6 +19,13 @@ import java.lang.reflect.Type;
 
 public class ItemStackJsonAdapter implements JsonDeserializer<ItemStack>, JsonSerializer<ItemStack> {
     private static final Logger LOGGER = LogUtils.getLogger();
+    public final boolean verbose;
+    public ItemStackJsonAdapter() {
+        this(false);
+    }
+    public ItemStackJsonAdapter(boolean verbose) {
+        this.verbose = verbose;
+    }
     @Override
     public ItemStack deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
         JsonObject obj = json.getAsJsonObject();
@@ -51,12 +58,15 @@ public class ItemStackJsonAdapter implements JsonDeserializer<ItemStack>, JsonSe
             }
 
         }
-        if(obj.has("amount")){
-           stack = new ItemStack(item,obj.get("amount").getAsInt(),obj.get("meta").getAsInt());
-        } else {
-            stack = new ItemStack(item,1,obj.get("meta").getAsInt());
+        int amount = 1;
+        int meta = 0;
+        if (obj.has("amount")) {
+            amount = obj.get("amount").getAsInt();
         }
-        return stack;
+        if (obj.has("meta")) {
+            meta = obj.get("meta").getAsInt();
+        }
+        return new ItemStack(item, amount, meta);
     }
 
     @Override
@@ -64,8 +74,12 @@ public class ItemStackJsonAdapter implements JsonDeserializer<ItemStack>, JsonSe
         JsonObject obj = new JsonObject();
 //        obj.addProperty("id",src.itemID); // Preferring namespace ids over integer ids for readability reasons
         obj.addProperty("id",src.getItem().namespaceID.toString());
-        obj.addProperty("amount",src.stackSize);
-        obj.addProperty("meta",src.getMetadata());
+        if (verbose || src.stackSize != 1) {
+            obj.addProperty("amount",src.stackSize);
+        }
+        if (verbose || src.getMetadata() != 0) {
+            obj.addProperty("meta",src.getMetadata());
+        }
         return obj;
     }
 }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeCraftingShapedJsonAdapter.java b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeCraftingShapedJsonAdapter.java
index 6bbce2c41..5cc1a36ee 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeCraftingShapedJsonAdapter.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeCraftingShapedJsonAdapter.java
@@ -12,6 +12,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import static net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped.DEFAULT_ALLOW_MIRROR;
+import static net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped.DEFAULT_CONSUME_CONTAINER;
+
 public class RecipeCraftingShapedJsonAdapter implements RecipeJsonAdapter<RecipeEntryCraftingShaped> {
 
     @Override
@@ -20,8 +23,9 @@ public class RecipeCraftingShapedJsonAdapter implements RecipeJsonAdapter<Recipe
         List<String> pattern = obj.get("pattern").getAsJsonArray().asList().stream().map(JsonElement::getAsString).collect(Collectors.toList());
         List<RecipeSymbol> symbols = obj.get("symbols").getAsJsonArray().asList().stream().map((E)->context.<RecipeSymbol>deserialize(E,RecipeSymbol.class)).collect(Collectors.toList());
         ItemStack result = context.deserialize(obj.get("result").getAsJsonObject(),ItemStack.class);
-        boolean consumeContainers = obj.get("consumeContainers").getAsBoolean();
-        return RecipeRegistry.parseRecipe(pattern,symbols,result,consumeContainers);
+        boolean consumeContainers = obj.has("consumeContainers") ? obj.get("consumeContainers").getAsBoolean() : DEFAULT_CONSUME_CONTAINER;
+        boolean mirror = obj.has("mirror") ? obj.get("mirror").getAsBoolean() : DEFAULT_ALLOW_MIRROR;
+        return RecipeRegistry.parseRecipe(pattern, symbols, result, consumeContainers, mirror);
     }
 
     @Override
@@ -65,7 +69,12 @@ public class RecipeCraftingShapedJsonAdapter implements RecipeJsonAdapter<Recipe
         obj.add("pattern",arr);
         obj.add("symbols",context.serialize(list));
         obj.add("result",context.serialize(src.getOutput()));
-        obj.addProperty("consumeContainers",src.consumeContainerItem);
+        if (src.consumeContainerItem != DEFAULT_CONSUME_CONTAINER) {
+            obj.addProperty("consumeContainers",src.consumeContainerItem);
+        }
+        if (src.allowMirrored != DEFAULT_ALLOW_MIRROR) {
+            obj.addProperty("mirror",src.allowMirrored);
+        }
         return obj;
     }
 }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryCraftingWithToolJsonAdapter.java b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryCraftingWithToolJsonAdapter.java
new file mode 100644
index 000000000..4c384bf6b
--- /dev/null
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryCraftingWithToolJsonAdapter.java
@@ -0,0 +1,36 @@
+package net.minecraft.core.data.registry.recipe.adapter;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingWithTool;
+import net.minecraft.core.item.ItemStack;
+
+import java.lang.reflect.Type;
+
+public class RecipeEntryCraftingWithToolJsonAdapter implements RecipeJsonAdapter<RecipeEntryCraftingWithTool> {
+    @Override
+    public RecipeEntryCraftingWithTool deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+        JsonObject object = json.getAsJsonObject();
+        RecipeSymbol input = context.deserialize(object.get("input"), RecipeSymbol.class);
+        RecipeSymbol tool = context.deserialize(object.get("tool"), RecipeSymbol.class);
+        ItemStack output = context.deserialize(object.get("output"), ItemStack.class);
+        return new RecipeEntryCraftingWithTool(input, tool, output);
+    }
+
+    @Override
+    public JsonElement serialize(RecipeEntryCraftingWithTool src, Type typeOfSrc, JsonSerializationContext context) {
+        JsonObject object = new JsonObject();
+        object.addProperty("name",src.toString());
+        object.addProperty("type", Registries.RECIPE_TYPES.getKey(src.getClass()));
+
+        object.add("input", context.serialize(src.inputSymbol));
+        object.add("tool", context.serialize(src.toolToUse));
+        object.add("output", context.serialize(src.output));
+        return object;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryRepairableJsonAdapter.java b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryRepairableJsonAdapter.java
new file mode 100644
index 000000000..79e9f4920
--- /dev/null
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryRepairableJsonAdapter.java
@@ -0,0 +1,34 @@
+package net.minecraft.core.data.registry.recipe.adapter;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryRepairable;
+import net.minecraft.core.item.ItemStack;
+
+import java.lang.reflect.Type;
+
+public class RecipeEntryRepairableJsonAdapter implements RecipeJsonAdapter<RecipeEntryRepairable> {
+    @Override
+    public RecipeEntryRepairable deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+        JsonObject obj = json.getAsJsonObject();
+        ItemStack inputItem = context.deserialize(obj.get("input"), ItemStack.class);
+        RecipeSymbol repairMaterial = context.deserialize(obj.get("repairMaterial"), RecipeSymbol.class);
+        return new RecipeEntryRepairable(inputItem, repairMaterial);
+    }
+
+    @Override
+    public JsonElement serialize(RecipeEntryRepairable src, Type typeOfSrc, JsonSerializationContext context) {
+        JsonObject object = new JsonObject();
+        object.addProperty("name",src.toString());
+        object.addProperty("type", Registries.RECIPE_TYPES.getKey(src.getClass()));
+
+        object.add("input", context.serialize(src.inItem));
+        object.add("repairMaterial", context.serialize(src.repairMaterial));
+        return object;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryScrapJsonAdapter.java b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryScrapJsonAdapter.java
new file mode 100644
index 000000000..080319801
--- /dev/null
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryScrapJsonAdapter.java
@@ -0,0 +1,35 @@
+package net.minecraft.core.data.registry.recipe.adapter;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryScrap;
+import net.minecraft.core.item.ItemStack;
+
+import java.lang.reflect.Type;
+
+public class RecipeEntryScrapJsonAdapter implements RecipeJsonAdapter<RecipeEntryScrap> {
+    @Override
+    public RecipeEntryScrap deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+        JsonObject obj = json.getAsJsonObject();
+        ItemStack input = context.deserialize(obj.get("input").getAsJsonObject(),ItemStack.class);
+        ItemStack scrapItem = context.deserialize(obj.get("output").getAsJsonObject(),ItemStack.class);
+        int maxYield = obj.get("maxYield").getAsInt();
+        return new RecipeEntryScrap(input.getItem(), scrapItem.getItem(), maxYield);
+    }
+
+    @Override
+    public JsonElement serialize(RecipeEntryScrap src, Type typeOfSrc, JsonSerializationContext context) {
+        JsonObject object = new JsonObject();
+        object.addProperty("name",src.toString());
+        object.addProperty("type", Registries.RECIPE_TYPES.getKey(src.getClass()));
+
+        object.add("input", context.serialize(new ItemStack(src.itemToScrap)));
+        object.add("output", context.serialize(new ItemStack(src.scrapYield)));
+        object.addProperty("maxYield", src.maxYield);
+        return object;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryUndyeingJsonAdapter.java b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryUndyeingJsonAdapter.java
new file mode 100644
index 000000000..bc736362d
--- /dev/null
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeEntryUndyeingJsonAdapter.java
@@ -0,0 +1,34 @@
+package net.minecraft.core.data.registry.recipe.adapter;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryUndyeing;
+import net.minecraft.core.item.ItemStack;
+
+import java.lang.reflect.Type;
+
+public class RecipeEntryUndyeingJsonAdapter implements RecipeJsonAdapter<RecipeEntryUndyeing>{
+    @Override
+    public RecipeEntryUndyeing deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+        JsonObject obj = json.getAsJsonObject();
+        RecipeSymbol input = context.deserialize(obj.get("input"), RecipeSymbol.class);
+        ItemStack output = context.deserialize(obj.get("output"), ItemStack.class);
+        return new RecipeEntryUndyeing(input, output);
+    }
+
+    @Override
+    public JsonElement serialize(RecipeEntryUndyeing src, Type typeOfSrc, JsonSerializationContext context) {
+        JsonObject object = new JsonObject();
+        object.addProperty("name",src.toString());
+        object.addProperty("type", Registries.RECIPE_TYPES.getKey(src.getClass()));
+
+        object.add("input", context.serialize(src.inputSymbol));
+        object.add("output", context.serialize(src.output));
+        return object;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeSymbolJsonAdapter.java b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeSymbolJsonAdapter.java
index f6578cec0..9a001cee9 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeSymbolJsonAdapter.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/RecipeSymbolJsonAdapter.java
@@ -7,6 +7,13 @@ import net.minecraft.core.item.ItemStack;
 import java.lang.reflect.Type;
 
 public class RecipeSymbolJsonAdapter implements JsonDeserializer<RecipeSymbol>, JsonSerializer<RecipeSymbol> {
+    public final boolean verbose;
+    public RecipeSymbolJsonAdapter() {
+        this(false);
+    }
+    public RecipeSymbolJsonAdapter(boolean verbose) {
+        this.verbose = verbose;
+    }
     @Override
     public RecipeSymbol deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
         JsonObject obj = json.getAsJsonObject();
@@ -32,16 +39,16 @@ public class RecipeSymbolJsonAdapter implements JsonDeserializer<RecipeSymbol>,
     @Override
     public JsonElement serialize(RecipeSymbol src, Type typeOfSrc, JsonSerializationContext context) {
         JsonObject obj = new JsonObject();
-        if(src.getSymbol() != 0){
+        if(verbose || src.getSymbol() != 0){
             obj.addProperty("symbol",src.getSymbol());
         }
-        if(src.getItemGroup() != null) {
+        if(verbose || src.getItemGroup() != null) {
             obj.addProperty("group",src.getItemGroup());
         }
-        if(src.getAmount() != 1){
+        if(verbose || src.getAmount() != 1){
             obj.addProperty("amount",src.getAmount());
         }
-        if(src.getStack() != null){
+        if(verbose || src.getStack() != null){
             obj.add("stack",context.serialize(src.getStack()));
         }
         return obj;
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCloneMap.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCloneMap.java
deleted file mode 100644
index 822251e7c..000000000
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCloneMap.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package net.minecraft.core.data.registry.recipe.entry;
-
-import net.minecraft.core.data.registry.recipe.SearchQuery;
-import net.minecraft.core.item.Items;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.container.CraftingContainer;
-
-public class RecipeEntryCloneMap extends RecipeEntryCraftingDynamic {
-
-	@Override
-	public boolean matches(CraftingContainer crafting) {
-		for(int x = 0; x < 3; x++) {
-			for(int y = 0; y < 3; y++) {
-				ItemStack stack = crafting.getItemStackAt(x, y);
-				
-				if(stack == null) {
-					return false;
-				}
-				
-				if(x == 1 && y == 1) {
-					if(stack.itemID != Items.MAP.id) {
-						return false;
-					}
-				}else {
-					if(stack.itemID != Items.PAPER.id) {
-						return false;
-					}
-				}
-			}
-		}
-		
-		return true;
-	}
-
-	@Override
-	public ItemStack getCraftingResult(CraftingContainer crafting) {
-		ItemStack output = crafting.getItemStackAt(1, 1).copy();
-		output.stackSize = 2;
-		return output;
-	}
-
-	@Override
-	public int getRecipeSize() {
-		return 9;
-	}
-
-	@Override
-	public boolean matchesQuery(SearchQuery query) {
-		return false;
-	}
-
-	@Override
-	public ItemStack[] onCraftResult(CraftingContainer crafting) {
-		for(int i = 0; i < crafting.getContainerSize(); i++) {
-			ItemStack stack = crafting.getItem(i);
-			stack.stackSize--;
-			if(stack.stackSize <= 0) {
-				crafting.setItem(i, null);
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCrafting.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCrafting.java
index 3d9b181bd..e50fe88a7 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCrafting.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCrafting.java
@@ -23,7 +23,7 @@ public abstract class RecipeEntryCrafting<I,O> extends RecipeEntryBase<I,O,Void>
         return false;
     }
 
-    public abstract boolean matches(CraftingContainer inventorycrafting);
+    public abstract boolean matches(CraftingContainer craftingContainer);
 
     public boolean matchesQueryIgnoreExceptions(SearchQuery query){
         try {
@@ -35,9 +35,9 @@ public abstract class RecipeEntryCrafting<I,O> extends RecipeEntryBase<I,O,Void>
 
     public abstract boolean matchesQuery(SearchQuery query);
 
-    public abstract ItemStack getCraftingResult(CraftingContainer inventorycrafting);
+    public abstract ItemStack getCraftingResult(CraftingContainer craftingContainer);
 
     public abstract int getRecipeSize();
 
-    public abstract ItemStack[] onCraftResult(CraftingContainer inventorycrafting);
+    public abstract ItemStack[] onCraftResult(CraftingContainer craftingContainer);
 }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShaped.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShaped.java
index fa6c2000e..80e8f6a5b 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShaped.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShaped.java
@@ -15,7 +15,12 @@ import java.util.List;
 import java.util.Objects;
 
 public class RecipeEntryCraftingShaped extends RecipeEntryCrafting<RecipeSymbol[], ItemStack> implements HasJsonAdapter {
+    // Changing defaults can have unexpected consequences, probably best to not ever change them
+    public static final boolean DEFAULT_CONSUME_CONTAINER = false;
+    public static final boolean DEFAULT_ALLOW_MIRROR = true;
+
     public boolean consumeContainerItem;
+    public boolean allowMirrored;
     public final int recipeWidth;
     public final int recipeHeight;
 
@@ -23,12 +28,22 @@ public class RecipeEntryCraftingShaped extends RecipeEntryCrafting<RecipeSymbol[
         super(input, output);
         this.recipeWidth = recipeWidth;
         this.recipeHeight = recipeHeight;
-        this.consumeContainerItem = false;
+        this.consumeContainerItem = DEFAULT_CONSUME_CONTAINER;
+        this.allowMirrored = DEFAULT_ALLOW_MIRROR;
     }
 
     public RecipeEntryCraftingShaped(int recipeWidth, int recipeHeight, RecipeSymbol[] input, ItemStack output, boolean consumeContainerItem) {
         super(input, output);
         this.consumeContainerItem = consumeContainerItem;
+        this.allowMirrored = DEFAULT_ALLOW_MIRROR;
+        this.recipeWidth = recipeWidth;
+        this.recipeHeight = recipeHeight;
+    }
+
+    public RecipeEntryCraftingShaped(int recipeWidth, int recipeHeight, RecipeSymbol[] input, ItemStack output, boolean consumeContainerItem, boolean allowMirrored) {
+        super(input, output);
+        this.consumeContainerItem = consumeContainerItem;
+        this.allowMirrored = allowMirrored;
         this.recipeWidth = recipeWidth;
         this.recipeHeight = recipeHeight;
     }
@@ -36,16 +51,18 @@ public class RecipeEntryCraftingShaped extends RecipeEntryCrafting<RecipeSymbol[
     public RecipeEntryCraftingShaped() {
         this.recipeWidth = 0;
         this.recipeHeight = 0;
+        this.consumeContainerItem = DEFAULT_CONSUME_CONTAINER;
+        this.allowMirrored = DEFAULT_ALLOW_MIRROR;
     }
 
     @Override
-    public boolean matches(CraftingContainer inventory) {
-        for (int i = 0; i <= 3 - recipeWidth; i++) {
-            for (int j = 0; j <= 3 - recipeHeight; j++) {
-                if (isRecipeMatching(inventory, i, j, true)) {
+    public boolean matches(CraftingContainer craftingContainer) {
+        for (int _w = 0; _w <= 3 - recipeWidth; _w++) {
+            for (int _h = 0; _h <= 3 - recipeHeight; _h++) {
+                if (allowMirrored && isRecipeMatching(craftingContainer, _w, _h, true)) {
                     return true;
                 }
-                if (isRecipeMatching(inventory, i, j, false)) {
+                if (isRecipeMatching(craftingContainer, _w, _h, false)) {
                     return true;
                 }
             }
@@ -135,14 +152,14 @@ public class RecipeEntryCraftingShaped extends RecipeEntryCrafting<RecipeSymbol[
         return false;
     }
 
-    private boolean isRecipeMatching(CraftingContainer inventory, int i, int j, boolean flag) {
+    private boolean isRecipeMatching(CraftingContainer inventory, int x, int y, boolean mirror) {
         for (int k = 0; k < 3; k++) {
             for (int l = 0; l < 3; l++) {
-                int i1 = k - i;
-                int j1 = l - j;
+                int i1 = k - x;
+                int j1 = l - y;
                 RecipeSymbol symbol = null;
                 if (i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight) {
-                    if (flag) {
+                    if (mirror) {
                         symbol = getInput()[(recipeWidth - i1 - 1) + j1 * recipeWidth];
                     } else {
                         symbol = getInput()[i1 + j1 * recipeWidth];
@@ -170,21 +187,21 @@ public class RecipeEntryCraftingShaped extends RecipeEntryCrafting<RecipeSymbol[
     }
 
     @Override
-    public ItemStack getCraftingResult(CraftingContainer inventorycrafting) {
+    public ItemStack getCraftingResult(CraftingContainer craftingContainer) {
         return new ItemStack(getOutput().itemID, getOutput().stackSize, getOutput().getMetadata());
     }
 
     @Override
-    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting) {
+    public ItemStack[] onCraftResult(CraftingContainer craftingContainer) {
         ItemStack[] returnStack = new ItemStack[9];
-        for (int i = 0; i < inventorycrafting.getContainerSize(); i++) {
-            ItemStack itemstack1 = inventorycrafting.getItem(i);
+        for (int i = 0; i < craftingContainer.getContainerSize(); i++) {
+            ItemStack itemstack1 = craftingContainer.getItem(i);
             if (itemstack1 == null) {
                 continue;
             }
-            inventorycrafting.removeItem(i, 1);
+            craftingContainer.removeItem(i, 1);
             if (!consumeContainerItem && itemstack1.getItem().hasContainerItem()) {
-                inventorycrafting.setItem(i, new ItemStack(itemstack1.getItem().getContainerItem()));
+                craftingContainer.setItem(i, new ItemStack(itemstack1.getItem().getContainerItem()));
             }
         }
         return returnStack;
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShapeless.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShapeless.java
index 8547ed7cd..81e7fce33 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShapeless.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShapeless.java
@@ -23,7 +23,7 @@ public class RecipeEntryCraftingShapeless extends RecipeEntryCrafting<List<Recip
     public RecipeEntryCraftingShapeless() {}
 
     @Override
-    public boolean matches(CraftingContainer inventorycrafting)
+    public boolean matches(CraftingContainer craftingContainer)
     {
         ArrayList<RecipeSymbol> arraylist = new ArrayList<>(getInput());
         int i = 0;
@@ -35,7 +35,7 @@ public class RecipeEntryCraftingShapeless extends RecipeEntryCrafting<List<Recip
             }
             for(int j = 0; j < 3; j++)
             {
-                ItemStack itemstack = inventorycrafting.getItemStackAt(j, i);
+                ItemStack itemstack = craftingContainer.getItemStackAt(j, i);
                 if(itemstack == null)
                 {
                     continue;
@@ -141,26 +141,26 @@ public class RecipeEntryCraftingShapeless extends RecipeEntryCrafting<List<Recip
     }
 
     @Override
-    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting){
+    public ItemStack[] onCraftResult(CraftingContainer craftingContainer){
         ItemStack[] returnStack = new ItemStack[9];
-        for(int i = 0; i < inventorycrafting.getContainerSize(); i++)
+        for(int i = 0; i < craftingContainer.getContainerSize(); i++)
         {
-            ItemStack itemStack = inventorycrafting.getItem(i);
+            ItemStack itemStack = craftingContainer.getItem(i);
             if(itemStack == null)
             {
                 continue;
             }
-            inventorycrafting.removeItem(i, 1);
+            craftingContainer.removeItem(i, 1);
             if(itemStack.getItem().hasContainerItem())
             {
-                inventorycrafting.setItem(i, new ItemStack(itemStack.getItem().getContainerItem()));
+                craftingContainer.setItem(i, new ItemStack(itemStack.getItem().getContainerItem()));
             }
         }
         return returnStack;
     }
 
     @Override
-    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
+    public ItemStack getCraftingResult(CraftingContainer craftingContainer)
     {
         return getOutput().copy();
     }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingWithTool.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingWithTool.java
index 996e881ca..c20817f61 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingWithTool.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingWithTool.java
@@ -1,32 +1,45 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.HasJsonAdapter;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeNamespace;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeEntryCraftingWithToolJsonAdapter;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeJsonAdapter;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.inventory.container.CraftingContainer;
 
-public class RecipeEntryCraftingWithTool extends RecipeEntryCraftingDynamic {
-    public RecipeEntryCraftingWithTool(ItemStack inItemStack, Item toolToUse, ItemStack output) {
-        this.inItemStack = inItemStack;
-        this.toolToUse = toolToUse;
-        this.output = output;
-    }
+import java.util.List;
+import java.util.Objects;
 
+public class RecipeEntryCraftingWithTool extends RecipeEntryCraftingDynamic implements HasJsonAdapter {
+    public RecipeSymbol inputSymbol;
+    public RecipeSymbol toolToUse;
+    public ItemStack output;
     public RecipeEntryCraftingWithTool() {
     }
 
+    public RecipeEntryCraftingWithTool(RecipeSymbol inputSymbol, RecipeSymbol toolToUse, ItemStack output) {
+        this.inputSymbol = inputSymbol;
+        this.toolToUse = toolToUse;
+        this.output = output;
+    }
+
     @Override
-    public boolean matches(CraftingContainer inventorycrafting) {
+    public boolean matches(CraftingContainer craftingContainer) {
         boolean toolMatch = false;
         boolean itemMatch = false;
 
         for (int x = 0; x < 3; x++) {
             for (int y = 0; y < 3; y++) {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
-                if (stack.itemID == toolToUse.id) {
+                if (toolToUse.matches(stack)) {
                     toolMatch = true;
-                } else if (stack.itemID == inItemStack.itemID) {
+                } else if (inputSymbol.matches(stack)) {
                     itemMatch = true;
                 } else {
                     return false;
@@ -40,24 +53,99 @@ public class RecipeEntryCraftingWithTool extends RecipeEntryCraftingDynamic {
 
     @Override
     public boolean matchesQuery(SearchQuery query) {
+        switch (query.mode){
+            case ALL: {
+                if ((matchesRecipe(query) || matchesUsage(query)) && matchesScope(query)) return true;
+                break;
+            }
+            case RECIPE: {
+                if (matchesRecipe(query) && matchesScope(query)) return true;
+                break;
+            }
+            case USAGE: {
+                if (matchesUsage(query) && matchesScope(query)) return true;
+                break;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesScope(SearchQuery query){
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NONE) return true;
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE) {
+            RecipeNamespace namespace = Registries.RECIPES.getItem(query.scope.getRight());
+            if(namespace == parent.getParent()){
+                return true;
+            }
+        } else if (query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE_GROUP) {
+            RecipeGroup group;
+            try {
+                group = Registries.RECIPES.getGroupFromKey(query.scope.getRight());
+            } catch (IllegalArgumentException e){
+                group = null;
+            }
+            if(group == parent){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesRecipe(SearchQuery query) {
+        if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+            if(query.strict && output.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                return true;
+            } else if(!query.strict && output.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())){
+                return true;
+            }
+        } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+            List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+            if(groupStacks == null) return false;
+            return groupStacks.contains(output);
+        }
+        return false;
+    }
+
+    public boolean matchesUsage(SearchQuery query) {
+        RecipeSymbol[] symbols = {inputSymbol, toolToUse};
+        for (RecipeSymbol symbol : symbols) {
+            if(symbol == null) continue;
+            List<ItemStack> stacks = symbol.resolve();
+            if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+                for (ItemStack stack : stacks) {
+                    if(query.strict && stack.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                        return true;
+                    } else if (!query.strict && stack.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())) {
+                        return true;
+                    }
+                }
+            } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+                List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+                if(groupStacks == null) return false;
+                if(stacks.stream().anyMatch((groupStacks::contains))){
+                    return true;
+                }
+            }
+
+        }
         return false;
     }
 
     @Override
-    public ItemStack getCraftingResult(CraftingContainer inventorycrafting) {
+    public ItemStack getCraftingResult(CraftingContainer craftingContainer) {
         return new ItemStack(output.itemID, output.stackSize, output.getMetadata());
     }
 
     @Override
-    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting) {
+    public ItemStack[] onCraftResult(CraftingContainer craftingContainer) {
         ItemStack[] returnStack = new ItemStack[9];
         for (int x = 0; x < 3; x++) {
             for (int y = 0; y < 3; y++) {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
                 ItemStack stack2;
 
-                if(stack.getItem() == toolToUse){
+                if(toolToUse.matches(new ItemStack(stack))){
                     if (stack.getMetadata() + 1 > stack.getMaxDamage())
                         stack2 = null;
                     else {
@@ -70,7 +158,7 @@ public class RecipeEntryCraftingWithTool extends RecipeEntryCraftingDynamic {
                         stack2 = new ItemStack(stack.getItem(), stack.stackSize - 1);
                     }
                 }
-                inventorycrafting.setSlotContentsAt(x, y, stack2);
+                craftingContainer.setSlotContentsAt(x, y, stack2);
             }
         }
         return returnStack;
@@ -81,7 +169,8 @@ public class RecipeEntryCraftingWithTool extends RecipeEntryCraftingDynamic {
         return 2;
     }
 
-    public ItemStack inItemStack;
-    public Item toolToUse;
-    public ItemStack output;
+    @Override
+    public RecipeJsonAdapter<?> getAdapter() {
+        return new RecipeEntryCraftingWithToolJsonAdapter();
+    }
 }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabel.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabel.java
index 70a0770a9..c03d85fc6 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabel.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabel.java
@@ -1,19 +1,26 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeNamespace;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.inventory.container.CraftingContainer;
 
+import java.util.List;
+import java.util.Objects;
+
 public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
     @Override
-    public ItemStack getCraftingResult(final CraftingContainer inventorycrafting) {
+    public ItemStack getCraftingResult(final CraftingContainer craftingContainer) {
         ItemStack labelStack = null;
         ItemStack otherItem = null;
 
         label0: for(int x = 0; x < 3; x++) {
             for(int y = 0; y < 3; y++) {
-                final ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                final ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if(stack == null) {
                     continue;
                 }
@@ -48,13 +55,13 @@ public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public boolean matches(final CraftingContainer crafting) {
+    public boolean matches(final CraftingContainer craftingContainer) {
         ItemStack labelStack = null;
         ItemStack otherStack = null;
 
         for(int x = 0; x < 3; x++) {
             for(int y = 0; y < 3; y++) {
-                final ItemStack stack = crafting.getItemStackAt(x, y);
+                final ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if(stack == null) {
                     continue;
                 }
@@ -107,22 +114,86 @@ public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
 
     @Override
     public boolean matchesQuery(SearchQuery query) {
+        switch (query.mode){
+            case ALL: {
+                if ((matchesRecipe(query) || matchesUsage(query)) && matchesScope(query)) return true;
+                break;
+            }
+            case RECIPE: {
+                if (matchesRecipe(query) && matchesScope(query)) return true;
+                break;
+            }
+            case USAGE: {
+                if (matchesUsage(query) && matchesScope(query)) return true;
+                break;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesScope(SearchQuery query){
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NONE) return true;
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE) {
+            RecipeNamespace namespace = Registries.RECIPES.getItem(query.scope.getRight());
+            if(namespace == parent.getParent()){
+                return true;
+            }
+        } else if (query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE_GROUP) {
+            RecipeGroup group;
+            try {
+                group = Registries.RECIPES.getGroupFromKey(query.scope.getRight());
+            } catch (IllegalArgumentException e){
+                group = null;
+            }
+            if(group == parent){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesRecipe(SearchQuery query) {
+        return false;
+    }
+
+    public boolean matchesUsage(SearchQuery query) {
+        RecipeSymbol[] symbols = {new RecipeSymbol(Items.LABEL.getDefaultStack())};
+        for (RecipeSymbol symbol : symbols) {
+            if(symbol == null) continue;
+            List<ItemStack> stacks = symbol.resolve();
+            if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+                for (ItemStack stack : stacks) {
+                    if(query.strict && stack.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                        return true;
+                    } else if (!query.strict && stack.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())) {
+                        return true;
+                    }
+                }
+            } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+                List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+                if(groupStacks == null) return false;
+                if(stacks.stream().anyMatch((groupStacks::contains))){
+                    return true;
+                }
+            }
+
+        }
         return false;
     }
 
     @Override
-    public ItemStack[] onCraftResult(final CraftingContainer crafting) {
+    public ItemStack[] onCraftResult(final CraftingContainer craftingContainer) {
         final ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++) {
             for(int y = 0; y < 3; y++) {
-                final ItemStack stack = crafting.getItemStackAt(x, y);
+                final ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if(stack == null) {
                     continue;
                 }
                 if(stack.itemID != Items.LABEL.id) {
                     stack.stackSize--;
                     if(stack.stackSize <= 0) {
-                        crafting.setSlotContentsAt(x, y, null);
+                        craftingContainer.setSlotContentsAt(x, y, null);
                     }
                 }
             }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabelDye.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabelDye.java
index 17c5b0331..28f7a448a 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabelDye.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabelDye.java
@@ -1,19 +1,26 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeNamespace;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.inventory.container.CraftingContainer;
 
+import java.util.List;
+import java.util.Objects;
+
 public class RecipeEntryLabelDye extends RecipeEntryCraftingDynamic{
     @Override
-    public ItemStack getCraftingResult(final CraftingContainer inventorycrafting) {
+    public ItemStack getCraftingResult(final CraftingContainer craftingContainer) {
         ItemStack labelStack = null;
         ItemStack dyeStack = null;
 
         label0: for(int x = 0; x < 3; x++) {
             for(int y = 0; y < 3; y++) {
-                final ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                final ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if(stack == null) {
                     continue;
                 }
@@ -45,13 +52,13 @@ public class RecipeEntryLabelDye extends RecipeEntryCraftingDynamic{
     }
 
     @Override
-    public boolean matches(final CraftingContainer crafting) {
+    public boolean matches(final CraftingContainer craftingContainer) {
         ItemStack labelStack = null;
         ItemStack dyeStack = null;
 
         for(int x = 0; x < 3; x++) {
             for(int y = 0; y < 3; y++) {
-                final ItemStack stack = crafting.getItemStackAt(x, y);
+                final ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if(stack == null) {
                     continue;
                 }
@@ -84,21 +91,97 @@ public class RecipeEntryLabelDye extends RecipeEntryCraftingDynamic{
 
     @Override
     public boolean matchesQuery(SearchQuery query) {
+        switch (query.mode){
+            case ALL: {
+                if ((matchesRecipe(query) || matchesUsage(query)) && matchesScope(query)) return true;
+                break;
+            }
+            case RECIPE: {
+                if (matchesRecipe(query) && matchesScope(query)) return true;
+                break;
+            }
+            case USAGE: {
+                if (matchesUsage(query) && matchesScope(query)) return true;
+                break;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesScope(SearchQuery query){
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NONE) return true;
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE) {
+            RecipeNamespace namespace = Registries.RECIPES.getItem(query.scope.getRight());
+            if(namespace == parent.getParent()){
+                return true;
+            }
+        } else if (query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE_GROUP) {
+            RecipeGroup group;
+            try {
+                group = Registries.RECIPES.getGroupFromKey(query.scope.getRight());
+            } catch (IllegalArgumentException e){
+                group = null;
+            }
+            if(group == parent){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesRecipe(SearchQuery query) {
+        ItemStack output = Items.LABEL.getDefaultStack();
+        if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+            if(query.strict && output.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                return true;
+            } else if(!query.strict && output.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())){
+                return true;
+            }
+        } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+            List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+            if(groupStacks == null) return false;
+            return groupStacks.contains(output);
+        }
+        return false;
+    }
+
+    public boolean matchesUsage(SearchQuery query) {
+        RecipeSymbol[] symbols = {new RecipeSymbol(Items.LABEL.getDefaultStack()), new RecipeSymbol(new ItemStack(Items.DYE, 1, -1))};
+        for (RecipeSymbol symbol : symbols) {
+            if(symbol == null) continue;
+            List<ItemStack> stacks = symbol.resolve();
+            if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+                for (ItemStack stack : stacks) {
+                    if(query.strict && stack.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                        return true;
+                    } else if (!query.strict && stack.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())) {
+                        return true;
+                    }
+                }
+            } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+                List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+                if(groupStacks == null) return false;
+                if(stacks.stream().anyMatch((groupStacks::contains))){
+                    return true;
+                }
+            }
+
+        }
         return false;
     }
 
     @Override
-    public ItemStack[] onCraftResult(final CraftingContainer crafting) {
+    public ItemStack[] onCraftResult(final CraftingContainer craftingContainer) {
         final ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++) {
             for(int y = 0; y < 3; y++) {
-                final ItemStack stack = crafting.getItemStackAt(x, y);
+                final ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if(stack == null) {
                     continue;
                 }
                 stack.stackSize--;
                 if(stack.stackSize <= 0) {
-                    crafting.setSlotContentsAt(x, y, null);
+                    craftingContainer.setSlotContentsAt(x, y, null);
                 }
             }
         }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryMapDuplication.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryMapDuplication.java
index 314f3fbd8..9e043c216 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryMapDuplication.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryMapDuplication.java
@@ -1,5 +1,9 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeNamespace;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
@@ -7,15 +11,18 @@ import net.minecraft.core.item.Items;
 import net.minecraft.core.item.MapItem;
 import net.minecraft.core.player.inventory.container.CraftingContainer;
 
+import java.util.List;
+import java.util.Objects;
+
 public class RecipeEntryMapDuplication extends RecipeEntryCraftingDynamic{
 
     @Override
-    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
+    public ItemStack getCraftingResult(CraftingContainer craftingContainer)
     {
         ItemStack map = null;
         int paperAmount = 0;
-        for (int i = 0; i < inventorycrafting.getContainerSize(); i++) {
-            ItemStack s = inventorycrafting.getItem(i);
+        for (int i = 0; i < craftingContainer.getContainerSize(); i++) {
+            ItemStack s = craftingContainer.getItem(i);
             if (s != null)
             {
                 Item item = s.getItem();
@@ -38,21 +45,21 @@ public class RecipeEntryMapDuplication extends RecipeEntryCraftingDynamic{
     }
 
     @Override
-    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting) {
-        for (int i = 0; i < inventorycrafting.getContainerSize(); i++) {
-            inventorycrafting.setItem(i, null);
+    public ItemStack[] onCraftResult(CraftingContainer craftingContainer) {
+        for (int i = 0; i < craftingContainer.getContainerSize(); i++) {
+            craftingContainer.setItem(i, null);
         }
         return new ItemStack[0];
     }
 
     @Override
-    public boolean matches(CraftingContainer inventorycrafting) {
+    public boolean matches(CraftingContainer craftingContainer) {
         ItemStack mapStack = null;
         boolean hasPaper = false;
 
         for(int x = 0; x < 3; x++) {
             for(int y = 0; y < 3; y++) {
-                final ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                final ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if(stack == null) {
                     continue;
                 }
@@ -78,6 +85,82 @@ public class RecipeEntryMapDuplication extends RecipeEntryCraftingDynamic{
 
     @Override
     public boolean matchesQuery(SearchQuery query) {
+        switch (query.mode){
+            case ALL: {
+                if ((matchesRecipe(query) || matchesUsage(query)) && matchesScope(query)) return true;
+                break;
+            }
+            case RECIPE: {
+                if (matchesRecipe(query) && matchesScope(query)) return true;
+                break;
+            }
+            case USAGE: {
+                if (matchesUsage(query) && matchesScope(query)) return true;
+                break;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesScope(SearchQuery query){
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NONE) return true;
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE) {
+            RecipeNamespace namespace = Registries.RECIPES.getItem(query.scope.getRight());
+            if(namespace == parent.getParent()){
+                return true;
+            }
+        } else if (query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE_GROUP) {
+            RecipeGroup group;
+            try {
+                group = Registries.RECIPES.getGroupFromKey(query.scope.getRight());
+            } catch (IllegalArgumentException e){
+                group = null;
+            }
+            if(group == parent){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesRecipe(SearchQuery query) {
+        ItemStack output = Items.MAP.getDefaultStack();
+        if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+            if(query.strict && output.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                return true;
+            } else if(!query.strict && output.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())){
+                return true;
+            }
+        } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+            List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+            if(groupStacks == null) return false;
+            return groupStacks.contains(output);
+        }
+        return false;
+    }
+
+    public boolean matchesUsage(SearchQuery query) {
+        RecipeSymbol[] symbols = {new RecipeSymbol(Items.MAP.getDefaultStack())};
+        for (RecipeSymbol symbol : symbols) {
+            if(symbol == null) continue;
+            List<ItemStack> stacks = symbol.resolve();
+            if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+                for (ItemStack stack : stacks) {
+                    if(query.strict && stack.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                        return true;
+                    } else if (!query.strict && stack.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())) {
+                        return true;
+                    }
+                }
+            } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+                List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+                if(groupStacks == null) return false;
+                if(stacks.stream().anyMatch((groupStacks::contains))){
+                    return true;
+                }
+            }
+
+        }
         return false;
     }
 }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairable.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairable.java
index 223cb68d3..ace2cb176 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairable.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairable.java
@@ -1,14 +1,26 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.HasJsonAdapter;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeNamespace;
 import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeEntryRepairableJsonAdapter;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeJsonAdapter;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.inventory.container.CraftingContainer;
 
-public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
+import java.util.List;
+import java.util.Objects;
+
+public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic implements HasJsonAdapter {
     public ItemStack inItem;
     public RecipeSymbol repairMaterial;
 
+    public RecipeEntryRepairable() {
+
+    }
 
     public RecipeEntryRepairable(ItemStack inItem, RecipeSymbol repairMaterial)
     {
@@ -17,7 +29,7 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public boolean matches(CraftingContainer inventorycrafting)
+    public boolean matches(CraftingContainer craftingContainer)
     {
         int repairMaterialCount = 0;
         int inItemCount = 0;
@@ -26,7 +38,7 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
         {
             for (int y = 0; y < 3; y++)
             {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
                 if (repairMaterial.matches(stack))
                 {
@@ -49,10 +61,86 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
 
     @Override
     public boolean matchesQuery(SearchQuery query) {
+        switch (query.mode){
+            case ALL: {
+                if ((matchesRecipe(query) || matchesUsage(query)) && matchesScope(query)) return true;
+                break;
+            }
+            case RECIPE: {
+                if (matchesRecipe(query) && matchesScope(query)) return true;
+                break;
+            }
+            case USAGE: {
+                if (matchesUsage(query) && matchesScope(query)) return true;
+                break;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesScope(SearchQuery query){
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NONE) return true;
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE) {
+            RecipeNamespace namespace = Registries.RECIPES.getItem(query.scope.getRight());
+            if(namespace == parent.getParent()){
+                return true;
+            }
+        } else if (query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE_GROUP) {
+            RecipeGroup group;
+            try {
+                group = Registries.RECIPES.getGroupFromKey(query.scope.getRight());
+            } catch (IllegalArgumentException e){
+                group = null;
+            }
+            if(group == parent){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesRecipe(SearchQuery query) {
+        ItemStack output = inItem;
+        if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+            if(query.strict && output.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                return true;
+            } else if(!query.strict && output.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())){
+                return true;
+            }
+        } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+            List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+            if(groupStacks == null) return false;
+            return groupStacks.contains(output);
+        }
+        return false;
+    }
+
+    public boolean matchesUsage(SearchQuery query) {
+        RecipeSymbol[] symbols = {new RecipeSymbol(inItem), repairMaterial};
+        for (RecipeSymbol symbol : symbols) {
+            if(symbol == null) continue;
+            List<ItemStack> stacks = symbol.resolve();
+            if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+                for (ItemStack stack : stacks) {
+                    if(query.strict && stack.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                        return true;
+                    } else if (!query.strict && stack.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())) {
+                        return true;
+                    }
+                }
+            } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+                List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+                if(groupStacks == null) return false;
+                if(stacks.stream().anyMatch((groupStacks::contains))){
+                    return true;
+                }
+            }
+
+        }
         return false;
     }
     @Override
-    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
+    public ItemStack getCraftingResult(CraftingContainer craftingContainer)
     {
         int repairMaterialCount = 0;
         ItemStack inItemStack = null;
@@ -61,7 +149,7 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
         {
             for (int y = 0; y < 3; y++)
             {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
                 if (repairMaterial.matches(stack))
                 {
@@ -91,12 +179,12 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting){
+    public ItemStack[] onCraftResult(CraftingContainer craftingContainer){
         ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++)
         {
             for(int y = 0; y < 3; y++) {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
                 ItemStack stack2;
                 if(stack.stackSize-1 == 0)
@@ -104,7 +192,7 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
                 else {
                     stack2 = new ItemStack(stack.getItem(), stack.stackSize - 1);
                 }
-                inventorycrafting.setSlotContentsAt(x, y, stack2);
+                craftingContainer.setSlotContentsAt(x, y, stack2);
             }
         }
         return returnStack;
@@ -114,4 +202,9 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
     public int getRecipeSize() {
         return 2;
     }
+
+    @Override
+    public RecipeJsonAdapter<?> getAdapter() {
+        return new RecipeEntryRepairableJsonAdapter();
+    }
 }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairableStackable.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairableStackable.java
index e7e02ccae..8e3040c08 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairableStackable.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairableStackable.java
@@ -15,7 +15,7 @@ public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public boolean matches(CraftingContainer inventorycrafting)
+    public boolean matches(CraftingContainer craftingContainer)
     {
         int materialStackCount = 0;
         int inItemCount = 0;
@@ -24,7 +24,7 @@ public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
         {
             for (int y = 0; y < 3; y++)
             {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
                 if (stack.itemID == materialStack.itemID)
                 {
@@ -51,7 +51,7 @@ public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
+    public ItemStack getCraftingResult(CraftingContainer craftingContainer)
     {
         ItemStack inItemStack = null;
         totalStackCount = 0;
@@ -59,7 +59,7 @@ public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
         {
             for (int y = 0; y < 3; y++)
             {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
                 if (stack.itemID == materialStack.itemID)
                 {
@@ -87,15 +87,15 @@ public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting){
+    public ItemStack[] onCraftResult(CraftingContainer craftingContainer){
         int repairCost =  originalDamage - inItemStack.getMetadata();
         ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++)
         {
             for(int y = 0; y < 3; y++) {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
-                if (stack.getItem() == inItem) inventorycrafting.setSlotContentsAt(x, y, null);
+                if (stack.getItem() == inItem) craftingContainer.setSlotContentsAt(x, y, null);
                 if (stack.getItem() == materialStack.getItem()) {
                     ItemStack replacementStack;
                     if (repairCost <= 0) return returnStack;
@@ -105,7 +105,7 @@ public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
                         replacementStack = new ItemStack(stack.getItem(), stack.stackSize - repairCost);
                     }
                     repairCost = repairCost - stack.stackSize;
-                    inventorycrafting.setSlotContentsAt(x, y, replacementStack);
+                    craftingContainer.setSlotContentsAt(x, y, replacementStack);
                 }
             }
         }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryScrap.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryScrap.java
index c63678393..45c18bc6c 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryScrap.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryScrap.java
@@ -1,32 +1,47 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.HasJsonAdapter;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeNamespace;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeEntryScrapJsonAdapter;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeJsonAdapter;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.inventory.container.CraftingContainer;
 
-public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
+import java.util.List;
+import java.util.Objects;
+
+public class RecipeEntryScrap extends RecipeEntryCraftingDynamic implements HasJsonAdapter {
     public Item itemToScrap;
     public Item scrapYield;
     public ItemStack scrapYieldStack;
+    public int maxYield;
+
+    public RecipeEntryScrap() {
 
+    }
 
-    public RecipeEntryScrap(Item itemToScrap, Item scrapYield)
+    public RecipeEntryScrap(Item itemToScrap, Item scrapYield, int maxYield)
     {
         this.itemToScrap = itemToScrap;
         this.scrapYield = scrapYield;
+        this.maxYield = maxYield;
         scrapYieldStack = new ItemStack(scrapYield);
     }
 
     @Override
-    public boolean matches(CraftingContainer inventorycrafting)
+    public boolean matches(CraftingContainer craftingContainer)
     {
         int itemToScrapCount = 0;
         for (int x = 0; x < 3; x++)
         {
             for (int y = 0; y < 3; y++)
             {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
                 if (stack.itemID == itemToScrap.id)
                 {
@@ -44,11 +59,87 @@ public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
 
     @Override
     public boolean matchesQuery(SearchQuery query) {
+        switch (query.mode){
+            case ALL: {
+                if ((matchesRecipe(query) || matchesUsage(query)) && matchesScope(query)) return true;
+                break;
+            }
+            case RECIPE: {
+                if (matchesRecipe(query) && matchesScope(query)) return true;
+                break;
+            }
+            case USAGE: {
+                if (matchesUsage(query) && matchesScope(query)) return true;
+                break;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesScope(SearchQuery query){
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NONE) return true;
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE) {
+            RecipeNamespace namespace = Registries.RECIPES.getItem(query.scope.getRight());
+            if(namespace == parent.getParent()){
+                return true;
+            }
+        } else if (query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE_GROUP) {
+            RecipeGroup group;
+            try {
+                group = Registries.RECIPES.getGroupFromKey(query.scope.getRight());
+            } catch (IllegalArgumentException e){
+                group = null;
+            }
+            if(group == parent){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesRecipe(SearchQuery query) {
+        ItemStack output = scrapYield.getDefaultStack();
+        if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+            if(query.strict && output.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                return true;
+            } else if(!query.strict && output.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())){
+                return true;
+            }
+        } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+            List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+            if(groupStacks == null) return false;
+            return groupStacks.contains(getOutput());
+        }
+        return false;
+    }
+
+    public boolean matchesUsage(SearchQuery query) {
+        RecipeSymbol[] symbols = {new RecipeSymbol(itemToScrap.getDefaultStack())};
+        for (RecipeSymbol symbol : symbols) {
+            if(symbol == null) continue;
+            List<ItemStack> stacks = symbol.resolve();
+            if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+                for (ItemStack stack : stacks) {
+                    if(query.strict && stack.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                        return true;
+                    } else if (!query.strict && stack.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())) {
+                        return true;
+                    }
+                }
+            } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+                List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+                if(groupStacks == null) return false;
+                if(stacks.stream().anyMatch((groupStacks::contains))){
+                    return true;
+                }
+            }
+
+        }
         return false;
     }
 
     @Override
-    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
+    public ItemStack getCraftingResult(CraftingContainer craftingContainer)
     {
         float itemToScrapDamage = 0;
         float itemMaxDamage = 0;
@@ -58,7 +149,7 @@ public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
         {
             for (int y = 0; y < 3; y++)
             {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
                 if (stack.itemID == itemToScrap.id)
                 {
@@ -67,19 +158,19 @@ public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
                 }
             }
         }
-        float scrapYieldResult = ((itemMaxDamage - itemToScrapDamage) / itemMaxDamage) * 4;
+        float scrapYieldResult = (((itemMaxDamage - itemToScrapDamage) / itemMaxDamage) * (maxYield - 1)) + 1;
         if(scrapYieldResult >= 1)
             return new ItemStack(scrapYield, (int)scrapYieldResult);
         return null;
     }
 
     @Override
-    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting){
+    public ItemStack[] onCraftResult(CraftingContainer craftingContainer){
         ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++)
         {
             for(int y = 0; y < 3; y++) {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                ItemStack stack = craftingContainer.getItemStackAt(x, y);
                 if (stack == null) continue;
                 ItemStack stack2;
                 if(stack.stackSize-1 == 0)
@@ -87,7 +178,7 @@ public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
                 else {
                     stack2 = new ItemStack(stack.getItem(), stack.stackSize - 1);
                 }
-                inventorycrafting.setSlotContentsAt(x, y, stack2);
+                craftingContainer.setSlotContentsAt(x, y, stack2);
             }
         }
         return returnStack;
@@ -97,4 +188,9 @@ public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
     public int getRecipeSize() {
         return 2;
     }
+
+    @Override
+    public RecipeJsonAdapter<?> getAdapter() {
+        return new RecipeEntryScrapJsonAdapter();
+    }
 }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryUndyeing.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryUndyeing.java
new file mode 100644
index 000000000..31b322fbd
--- /dev/null
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryUndyeing.java
@@ -0,0 +1,157 @@
+package net.minecraft.core.data.registry.recipe.entry;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.HasJsonAdapter;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeNamespace;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.SearchQuery;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeEntryUndyeingJsonAdapter;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeJsonAdapter;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
+
+import java.util.List;
+import java.util.Objects;
+
+public class RecipeEntryUndyeing extends RecipeEntryCraftingDynamic implements HasJsonAdapter {
+    public RecipeSymbol inputSymbol;
+    public ItemStack output;
+    public RecipeEntryUndyeing() {
+        
+    }
+
+    public RecipeEntryUndyeing(RecipeSymbol input, ItemStack output) {
+        this.inputSymbol = input;
+        this.output = output;
+    }
+
+    @Override
+    public boolean matches(CraftingContainer craftingContainer) {
+        if (craftingContainer.getContainerSize() < 9) return false;
+        for (int i = 0; i < 9; i++) {
+            if (i == 4) {
+                ItemStack stack = craftingContainer.getItem(i);
+                if (stack == null || stack.getItem() != Blocks.SPONGE_WET.asItem()) {
+                    return false;
+                }
+            } else {
+               if (!inputSymbol.matches(craftingContainer.getItem(i))) {
+                   return false;
+               }
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public boolean matchesQuery(SearchQuery query) {
+        switch (query.mode){
+            case ALL: {
+                if ((matchesRecipe(query) || matchesUsage(query)) && matchesScope(query)) return true;
+                break;
+            }
+            case RECIPE: {
+                if (matchesRecipe(query) && matchesScope(query)) return true;
+                break;
+            }
+            case USAGE: {
+                if (matchesUsage(query) && matchesScope(query)) return true;
+                break;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesScope(SearchQuery query){
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NONE) return true;
+        if(query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE) {
+            RecipeNamespace namespace = Registries.RECIPES.getItem(query.scope.getRight());
+            if(namespace == parent.getParent()){
+                return true;
+            }
+        } else if (query.scope.getLeft() == SearchQuery.SearchScope.NAMESPACE_GROUP) {
+            RecipeGroup group;
+            try {
+                group = Registries.RECIPES.getGroupFromKey(query.scope.getRight());
+            } catch (IllegalArgumentException e){
+                group = null;
+            }
+            if(group == parent){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesRecipe(SearchQuery query) {
+        if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+            if(query.strict && output.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                return true;
+            } else if(!query.strict && output.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())){
+                return true;
+            }
+        } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+            List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+            if(groupStacks == null) return false;
+            return groupStacks.contains(output);
+        }
+        return false;
+    }
+
+    public boolean matchesUsage(SearchQuery query) {
+        RecipeSymbol[] symbols = {inputSymbol, new RecipeSymbol(Blocks.SPONGE_WET.getDefaultStack())};
+        for (RecipeSymbol symbol : symbols) {
+            if(symbol == null) continue;
+            List<ItemStack> stacks = symbol.resolve();
+            if(query.query.getLeft() == SearchQuery.QueryType.NAME) {
+                for (ItemStack stack : stacks) {
+                    if(query.strict && stack.getDisplayName().equalsIgnoreCase(query.query.getRight())){
+                        return true;
+                    } else if (!query.strict && stack.getDisplayName().toLowerCase().contains(query.query.getRight().toLowerCase())) {
+                        return true;
+                    }
+                }
+            } else if (query.query.getLeft() == SearchQuery.QueryType.GROUP && !Objects.equals(query.query.getRight(), "")) {
+                List<ItemStack> groupStacks = new RecipeSymbol(query.query.getRight()).resolve();
+                if(groupStacks == null) return false;
+                if(stacks.stream().anyMatch((groupStacks::contains))){
+                    return true;
+                }
+            }
+
+        }
+        return false;
+    }
+
+    @Override
+    public ItemStack getCraftingResult(CraftingContainer craftingContainer) {
+        return new ItemStack(output);
+    }
+
+    @Override
+    public int getRecipeSize() {
+        return 9;
+    }
+
+    @Override
+    public ItemStack[] onCraftResult(CraftingContainer craftingContainer) {
+        ItemStack[] returnStack = new ItemStack[9];
+        for (int i = 0; i < craftingContainer.getContainerSize(); i++) {
+            ItemStack itemstack1 = craftingContainer.getItem(i);
+            if (itemstack1 == null) {
+                continue;
+            }
+            if (i != 4) {
+                craftingContainer.removeItem(i, 1);
+            }
+        }
+        return returnStack;
+    }
+
+    @Override
+    public RecipeJsonAdapter<?> getAdapter() {
+        return new RecipeEntryUndyeingJsonAdapter();
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/World.java b/src/main/java/net/minecraft/core/world/World.java
index be9cae290..fc277ad9d 100644
--- a/src/main/java/net/minecraft/core/world/World.java
+++ b/src/main/java/net/minecraft/core/world/World.java
@@ -1869,14 +1869,13 @@ public class World implements WorldSource {
         }
 
         updatingBlockEntities = true;
-        Iterator<BlockEntity> iterator = loadedBlockEntityList.iterator();
-        while (iterator.hasNext()) {
-            BlockEntity blockEntity = iterator.next();
+        for (int i = loadedBlockEntityList.size() - 1; i >= 0; i--) {
+            BlockEntity blockEntity = loadedBlockEntityList.get(i);
             if (!blockEntity.isInvalid() && isBlockLoaded(blockEntity.x, blockEntity.y, blockEntity.z)) {
                 blockEntity.tick();
             }
-            if (blockEntity.isInvalid()) {
-                iterator.remove();
+            if (blockEntity.isInvalid() && blockEntity == getBlockEntity(blockEntity.x, blockEntity.y, blockEntity.z)) {
+                loadedBlockEntityList.remove(i);
                 Chunk chunk = getChunkFromChunkCoords(Math.floorDiv(blockEntity.x, Chunk.CHUNK_SIZE_X), Math.floorDiv(blockEntity.z, Chunk.CHUNK_SIZE_Z));
                 if (chunk != null) {
                     chunk.removeBlockEntity(blockEntity.x & (Chunk.CHUNK_SIZE_X - 1), blockEntity.y, blockEntity.z & (Chunk.CHUNK_SIZE_Z - 1));
@@ -1884,35 +1883,11 @@ public class World implements WorldSource {
             }
         }
         updatingBlockEntities = false;
-        if(!queuedBlockEntityAdditions.isEmpty())
-        {
-            Iterator<BlockEntity> entityIterator = queuedBlockEntityAdditions.iterator();
-            while (entityIterator.hasNext()) {
-                BlockEntity blockEntity = entityIterator.next();
-                if (!blockEntity.isInvalid()) {
-                    if (!loadedBlockEntityList.contains(blockEntity)) {
-                        loadedBlockEntityList.add(blockEntity);
-                    }
-                    Chunk chunk1 = getChunkFromChunkCoords(Math.floorDiv(blockEntity.x, Chunk.CHUNK_SIZE_X), Math.floorDiv(blockEntity.z, Chunk.CHUNK_SIZE_Z));
-                    if (chunk1 != null) {
-                        chunk1.setBlockEntity(blockEntity.x & (Chunk.CHUNK_SIZE_X - 1), blockEntity.y, blockEntity.z & (Chunk.CHUNK_SIZE_Z - 1), blockEntity);
-                    }
-                    markBlockNeedsUpdate(blockEntity.x, blockEntity.y, blockEntity.z);
-                }
-            }
-            queuedBlockEntityAdditions.clear();
-        }
     }
 
     public void addAllBlockEntities(Collection<BlockEntity> blockEntities)
     {
-        if(updatingBlockEntities)
-        {
-            queuedBlockEntityAdditions.addAll(blockEntities);
-        } else
-        {
-            loadedBlockEntityList.addAll(blockEntities);
-        }
+        loadedBlockEntityList.addAll(blockEntities);
     }
 
     public void updateEntity(Entity entity)
@@ -2290,20 +2265,11 @@ public class World implements WorldSource {
     {
         if(!tileentity.isInvalid())
         {
-            if(updatingBlockEntities)
-            {
-                tileentity.x = i;
-                tileentity.y = j;
-                tileentity.z = k;
-                queuedBlockEntityAdditions.add(tileentity);
-            } else
+            loadedBlockEntityList.add(tileentity);
+            Chunk chunk = getChunkFromChunkCoords(Math.floorDiv(i, Chunk.CHUNK_SIZE_X), Math.floorDiv(k, Chunk.CHUNK_SIZE_Z));
+            if(chunk != null)
             {
-                loadedBlockEntityList.add(tileentity);
-                Chunk chunk = getChunkFromChunkCoords(Math.floorDiv(i, Chunk.CHUNK_SIZE_X), Math.floorDiv(k, Chunk.CHUNK_SIZE_Z));
-                if(chunk != null)
-                {
-                    chunk.setBlockEntity(i & (Chunk.CHUNK_SIZE_X - 1), j, k & (Chunk.CHUNK_SIZE_Z - 1), tileentity);
-                }
+                chunk.setBlockEntity(i & (Chunk.CHUNK_SIZE_X - 1), j, k & (Chunk.CHUNK_SIZE_Z - 1), tileentity);
             }
         }
     }
@@ -2329,6 +2295,11 @@ public class World implements WorldSource {
         }
     }
 
+    public void replaceBlockTileEntity(int i, int j, int k, BlockEntity tileentity) {
+        removeBlockTileEntity(i, j, k);
+        setBlockTileEntity(i, j, k, tileentity);
+    }
+
     @Override
     public boolean isBlockOpaqueCube(int x, int y, int z)
     {
diff --git a/src/main/java/net/minecraft/core/world/chunk/Chunk.java b/src/main/java/net/minecraft/core/world/chunk/Chunk.java
index e6b4d617d..4a8272092 100644
--- a/src/main/java/net/minecraft/core/world/chunk/Chunk.java
+++ b/src/main/java/net/minecraft/core/world/chunk/Chunk.java
@@ -521,6 +521,7 @@ public class Chunk
         if (getBlockID(x, y, z) == 0 || !(Block.blocksList[getBlockID(x, y, z)] instanceof EntityBlock))
         {
             LOGGER.warn("Attempted to place a tile entity where there was no entity tile!");
+            Thread.dumpStack();
         }
         else
         {
diff --git a/src/main/java/net/minecraft/datagen/RecipesGenerator.java b/src/main/java/net/minecraft/datagen/RecipesGenerator.java
new file mode 100644
index 000000000..c5cbd2fc2
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/RecipesGenerator.java
@@ -0,0 +1,113 @@
+package net.minecraft.datagen;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import com.google.gson.stream.JsonReader;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.item.Items;
+import net.minecraft.datagen.recipeBuilders.RecipeBuilder;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RecipesGenerator {
+    private static final boolean DEBUG = false;
+    public static final String CORE_NAMESPACE = "minecraft";
+    public static void main(String[] args) {
+        Blocks.init();
+        Items.init();
+        new Registries();
+
+        List<String> remainingEntries;
+
+        WorkbenchGenerator.generate();
+        if (DEBUG) {
+            remainingEntries = getMissingIds(Registries.RECIPES.WORKBENCH, new File("src/common/resources/recipes/workbench.json"));
+            if (remainingEntries.isEmpty()) {
+                System.out.println("Workbench contains all reference entries!");
+            } else {
+                remainingEntries.sort(String::compareTo);
+                System.out.println("Workbench is missing " + remainingEntries.size() + " entries!");
+                for (String s : remainingEntries) {
+                    System.out.println(s);
+                }
+            }
+        }
+        RecipeBuilder.exportRecipes(new File("generated/recipes/workbench.json"), Registries.RECIPES.WORKBENCH);
+
+        if (DEBUG) System.out.println();
+
+        SmeltingGenerator.generate();
+        if (DEBUG) {
+            remainingEntries = getMissingIds(Registries.RECIPES.FURNACE, new File("src/common/resources/recipes/furnace.json"));
+            if (remainingEntries.isEmpty()) {
+                System.out.println("Furnace contains all reference entries!");
+            } else {
+                remainingEntries.sort(String::compareTo);
+                System.out.println("Furnace is missing " + remainingEntries.size() + " entries!");
+                for (String s : remainingEntries) {
+                    System.out.println(s);
+                }
+            }
+        }
+        RecipeBuilder.exportRecipes(new File("generated/recipes/furnace.json"), Registries.RECIPES.FURNACE);
+
+        if (DEBUG) System.out.println();
+
+        if (DEBUG) {
+            remainingEntries = getMissingIds(Registries.RECIPES.BLAST_FURNACE, new File("src/common/resources/recipes/blast_furnace.json"));
+            if (remainingEntries.isEmpty()) {
+                System.out.println("Blast furnace contains all reference entries!");
+            } else {
+                remainingEntries.sort(String::compareTo);
+                System.out.println("Blast furnace is missing " + remainingEntries.size() + " entries!");
+                for (String s : remainingEntries) {
+                    System.out.println(s);
+                }
+            }
+        }
+        RecipeBuilder.exportRecipes(new File("generated/recipes/blast_furnace.json"), Registries.RECIPES.BLAST_FURNACE);
+
+        if (DEBUG) System.out.println();
+
+        TrommelGenerator.generate();
+        if (DEBUG) {
+            remainingEntries = getMissingIds(Registries.RECIPES.TROMMEL, new File("src/common/resources/recipes/trommel.json"));
+            if (remainingEntries.isEmpty()) {
+                System.out.println("Trommel contains all reference entries!");
+            } else {
+                remainingEntries.sort(String::compareTo);
+                System.out.println("Trommel is missing " + remainingEntries.size() + " entries!");
+                for (String s : remainingEntries) {
+                    System.out.println(s);
+                }
+            }
+        }
+        RecipeBuilder.exportRecipes(new File("generated/recipes/trommel.json"), Registries.RECIPES.TROMMEL);
+    }
+
+    public static List<String> getMissingIds(RecipeGroup recipeGroup, File referenceFile) {
+        assert referenceFile != null;
+        assert referenceFile.isFile();
+        assert referenceFile.exists();
+        try {
+            JsonArray entries = JsonParser.parseReader(new JsonReader(new FileReader(referenceFile))).getAsJsonArray();
+            List<String> entryNames = new ArrayList<>();
+            for (JsonElement e : entries) {
+                entryNames.add(e.getAsJsonObject().get("name").getAsString().replaceFirst("minecraft:" + recipeGroup.getParent().getKey(recipeGroup) + "/", ""));
+            }
+            for (Object recipe : recipeGroup) {
+                entryNames.remove(recipeGroup.getKey(recipe));
+            }
+            return entryNames;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/datagen/SmeltingGenerator.java b/src/main/java/net/minecraft/datagen/SmeltingGenerator.java
new file mode 100644
index 000000000..e3c361dfd
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/SmeltingGenerator.java
@@ -0,0 +1,75 @@
+package net.minecraft.datagen;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.datagen.recipeBuilders.RecipeBuilder;
+
+import static net.minecraft.datagen.RecipesGenerator.CORE_NAMESPACE;
+
+public class SmeltingGenerator {
+    public static void generate() {
+        sharedRecipe("block_sugarcane_to_block_sugarcane_baked", Blocks.BLOCK_SUGARCANE.getDefaultStack(), Blocks.BLOCK_SUGARCANE_BAKED.getDefaultStack());
+        sharedRecipe("cactus_to_cactus_green", Blocks.CACTUS.getDefaultStack(), new ItemStack(Items.DYE, 1, DyeColor.GREEN.itemMeta));
+        sharedRecipe("clay_to_brick_clay", Items.CLAY.getDefaultStack(), Items.BRICK_CLAY.getDefaultStack());
+        sharedRecipe("mud_to_baked_mud", Blocks.MUD.getDefaultStack(), Blocks.MUD_BAKED.getDefaultStack());
+        sharedRecipe("logs_to_charcoal", "minecraft:logs", new ItemStack(Items.COAL, 1, 1));
+        sharedRecipe("sand_to_glass", Blocks.SAND.getDefaultStack(), Blocks.GLASS.getDefaultStack());
+        sharedRecipe("sponge_wet_to_sponge_dry", Blocks.SPONGE_WET.getDefaultStack(), Blocks.SPONGE_DRY.getDefaultStack());
+
+        sharedRecipe("coal_ores_to_coal", "minecraft:coal_ores", Items.COAL.getDefaultStack());
+        sharedRecipe("diamond_ores_to_diamond", "minecraft:diamond_ores", Items.DIAMOND.getDefaultStack());
+        sharedRecipe("gold_ores_to_gold_ingot", "minecraft:gold_ores", Items.INGOT_GOLD.getDefaultStack());
+        sharedRecipe("iron_ores_to_iron_ingot", "minecraft:iron_ores", Items.INGOT_IRON.getDefaultStack());
+        sharedRecipe("lapis_ores_to_lapis_lazuli", "minecraft:lapis_ores", new ItemStack(Items.DYE, 1, DyeColor.BLUE.itemMeta));
+        sharedRecipe("redstone_ores_to_redstone_dust", "minecraft:redstone_ores", Items.DUST_REDSTONE.getDefaultStack());
+        sharedRecipe("nethercoal_ores_to_nethercoal", "minecraft:nethercoal_ores", Items.NETHERCOAL.getDefaultStack());
+
+        sharedRecipe("raw_iron_to_iron_ingot", Items.ORE_RAW_IRON.getDefaultStack(), Items.INGOT_IRON.getDefaultStack());
+        sharedRecipe("raw_gold_to_gold_ingot", Items.ORE_RAW_GOLD.getDefaultStack(), Items.INGOT_GOLD.getDefaultStack());
+
+        furnaceRecipe("fish_raw_to_fish_cooked", Items.FOOD_FISH_RAW.getDefaultStack(), Items.FOOD_FISH_COOKED.getDefaultStack());
+        furnaceRecipe("porkchop_raw_to_porkchop_cooked", Items.FOOD_PORKCHOP_RAW.getDefaultStack(), Items.FOOD_PORKCHOP_COOKED.getDefaultStack());
+
+        furnaceRecipe("cobble_stone_to_stone", Blocks.COBBLE_STONE.getDefaultStack(), Blocks.STONE.getDefaultStack());
+        furnaceRecipe("cobble_basalt_to_basalt", Blocks.COBBLE_BASALT.getDefaultStack(), Blocks.BASALT.getDefaultStack());
+        furnaceRecipe("cobble_granite_to_granite", Blocks.COBBLE_GRANITE.getDefaultStack(), Blocks.GRANITE.getDefaultStack());
+        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());
+
+        blastRecipe("cobble_basalt_to_olivine", Blocks.COBBLE_BASALT.getDefaultStack(), Items.OLIVINE.getDefaultStack());
+        blastRecipe("cobble_granite_to_quartz", Blocks.COBBLE_GRANITE.getDefaultStack(), Items.QUARTZ.getDefaultStack());
+        blastRecipe("cobble_limestone_to_marble", Blocks.COBBLE_LIMESTONE.getDefaultStack(), Blocks.MARBLE.getDefaultStack());
+        blastRecipe("cobble_permafrost_to_permafrost", Blocks.COBBLE_PERMAFROST.getDefaultStack(), Blocks.PERMAFROST.getDefaultStack());
+        blastRecipe("cobble_stone_to_slate", Blocks.COBBLE_STONE.getDefaultStack(), Blocks.SLATE.getDefaultStack());
+        blastRecipe("iron_ingot_to_crude_steel", Items.INGOT_IRON.getDefaultStack(), Items.INGOT_STEEL_CRUDE.getDefaultStack());
+    }
+
+    private static void furnaceRecipe(String id, ItemStack input, ItemStack output) {
+        RecipeBuilder.Furnace(CORE_NAMESPACE).setInput(input).create(id, output);
+    }
+
+    private static void furnaceRecipe(String id, String inputGroup, ItemStack output) {
+        RecipeBuilder.Furnace(CORE_NAMESPACE).setInput(inputGroup).create(id, output);
+    }
+
+    private static void blastRecipe(String id, ItemStack input, ItemStack output) {
+        RecipeBuilder.BlastFurnace(CORE_NAMESPACE).setInput(input).create(id, output);
+    }
+
+    private static void blastRecipe(String id, String inputGroup, ItemStack output) {
+        RecipeBuilder.BlastFurnace(CORE_NAMESPACE).setInput(inputGroup).create(id, output);
+    }
+
+    private static void sharedRecipe(String id, ItemStack input, ItemStack output) {
+        furnaceRecipe(id, input, output);
+        blastRecipe(id, input, output);
+    }
+
+    private static void sharedRecipe(String id, String inputGroup, ItemStack output) {
+        furnaceRecipe(id, inputGroup, output);
+        blastRecipe(id, inputGroup, output);
+    }
+}
diff --git a/src/main/java/net/minecraft/datagen/TrommelGenerator.java b/src/main/java/net/minecraft/datagen/TrommelGenerator.java
new file mode 100644
index 000000000..c2602e718
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/TrommelGenerator.java
@@ -0,0 +1,78 @@
+package net.minecraft.datagen;
+
+import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.datagen.recipeBuilders.RecipeBuilder;
+
+import static net.minecraft.datagen.RecipesGenerator.CORE_NAMESPACE;
+
+public class TrommelGenerator {
+    public static void generate() {
+        RecipeBuilder.Trommel(CORE_NAMESPACE)
+            .setInput(Blocks.BLOCK_CLAY)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.CLAY), 4, 8), 30)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.AMMO_PEBBLE), 1, 3), 20)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.SULPHUR), 1), 10)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.ORE_RAW_GOLD), 1), 1)
+            .create("clay");
+
+        RecipeBuilder.Trommel(CORE_NAMESPACE)
+            .setInput("minecraft:trommel_dirt")
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.AMMO_PEBBLE), 1, 3), 50)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.CLAY), 1, 5), 20)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.FLINT), 1, 3), 10)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.SULPHUR), 1), 2)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.ORE_RAW_IRON), 1), 0.5)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.OLIVINE), 1), 0.25)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.QUARTZ), 1), 0.25)
+            .create("dirt");
+
+        RecipeBuilder.Trommel(CORE_NAMESPACE)
+            .setInput(Blocks.GRAVEL)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.FLINT), 1, 2), 25)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.OLIVINE), 1, 3), 30)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.AMMO_PEBBLE), 1, 6), 25)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.ORE_RAW_IRON), 1, 2), 10)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.DYE,1, DyeColor.BLUE.itemMeta), 2, 6), 5)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.SULPHUR), 1), 5)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.QUARTZ), 1), 0.5)
+            .create("gravel");
+
+        RecipeBuilder.Trommel(CORE_NAMESPACE)
+            .setInput(Blocks.DIRT_SCORCHED_RICH)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.ORE_RAW_GOLD), 1), 10)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.ORE_RAW_IRON), 1, 2), 15)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.QUARTZ), 1, 4), 25)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.OLIVINE), 1, 4), 25)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.DYE,1, DyeColor.BLUE.itemMeta), 2, 4), 20)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.CLAY), 4, 8), 10)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.AMMO_PEBBLE), 1, 5), 5)
+            .create("rich_dirt");
+
+        RecipeBuilder.Trommel(CORE_NAMESPACE)
+            .setInput(Blocks.SAND)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.QUARTZ), 1, 3), 50)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.CLAY), 4, 8), 30)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.AMMO_PEBBLE), 1, 5), 25)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.BONE), 1, 3), 10)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.FLINT), 1, 3), 10)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.SULPHUR), 1), 5)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.OLIVINE), 1), 5)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.ORE_RAW_GOLD), 1), 1)
+            .create("sand");
+
+        RecipeBuilder.Trommel(CORE_NAMESPACE)
+            .setInput(Blocks.SOULSAND)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.FLINT), 1, 3), 20)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.BONE), 1, 6), 10)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.ORE_RAW_GOLD), 1), 2)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.ORE_RAW_IRON), 1), 1)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.DUST_GLOWSTONE), 1, 6), 5)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.QUARTZ), 1, 3), 5)
+            .addEntry(new WeightedRandomLootObject(new ItemStack(Items.NETHERCOAL), 1), 0.5)
+            .create("soul_sand");
+    }
+}
diff --git a/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java b/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
new file mode 100644
index 000000000..9b14a591e
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
@@ -0,0 +1,1286 @@
+package net.minecraft.datagen;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingWithTool;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryRepairable;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryScrap;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryUndyeing;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.datagen.recipeBuilders.RecipeBuilder;
+import net.minecraft.datagen.recipeBuilders.RecipeBuilderShaped;
+
+import static net.minecraft.datagen.RecipesGenerator.CORE_NAMESPACE;
+
+class WorkbenchGenerator {
+    public static void generate() {
+        generatePickaxes();
+        generateAxes();
+        generateShovels();
+        generateHoes();
+        generateSwords();
+        generateMiscTools();
+
+        generateHelmets();
+        generateChestPlates();
+        generateLeggings();
+        generateBoots();
+
+        generateBlockCompression();
+        generateBlockDecompression();
+
+        generateBricks();
+        generateSlabs();
+        generateStairs();
+
+        generateDoors();
+        generateTrapDoors();
+        generateFences();
+        generateFenceGates();
+        generateChests();
+        generatePolishedStones();
+
+        generateLogToPlanks();
+        generateDyes();
+        generateDyedWools();
+        generateDyedPlanks();
+
+        generateInformationals();
+        generateRedstoneComponents();
+
+        generateFoods();
+
+        generateScrapRecipes();
+        generateRepairableRecipes();
+        generateToolRecipes();
+
+        generateUndyeingRecipes();
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+                .setShape(
+                    "CCW",
+                    "PPP")
+                .addInput('C', Items.CLOTH)
+                .addInput('W', "minecraft:wools")
+                .addInput('P', "minecraft:planks")
+                .create("bed", Items.BED.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "###",
+                "X X")
+            .addInput('#', Items.CLOTH)
+            .addInput('X', "minecraft:planks")
+            .create("seat", Items.SEAT.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+                .setShape(
+                    "###",
+                    "X X",
+                    "XXX")
+                .addInput('#', Items.LEATHER)
+                .addInput('X', Items.WHEAT)
+                .create("basket", Items.BASKET.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#",
+                "#",
+                "#")
+            .addInput('#', Items.PAPER)
+            .create("book_vertical", Items.BOOK.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape("###")
+            .addInput('#', Items.PAPER)
+            .create("book_horizontal", Items.BOOK.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "###",
+                "XXX",
+                "###")
+            .addInput('#', "minecraft:planks")
+            .addInput('X', Items.BOOK)
+            .create("bookshelf", Blocks.BOOKSHELF_PLANKS_OAK.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X X",
+                "X#X")
+            .addInput('X', Items.INGOT_IRON)
+            .addInput('#', Blocks.COBBLE_NETHERRACK)
+            .create("brazier", Blocks.BRAZIER_INACTIVE.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "###",
+                "#X#",
+                "###")
+            .addInput('#', Items.INGOT_IRON)
+            .addInput('X', Items.NETHERCOAL)
+            .create("blast_furnace", Blocks.FURNACE_BLAST_IDLE.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "###",
+                "# #",
+                "###")
+            .addInput('#', "minecraft:cobblestones")
+            .create("furnace", Blocks.FURNACE_STONE_IDLE.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "###",
+                "#B#",
+                "#R#")
+            .addInput('#', "minecraft:cobblestones")
+            .addInput('B', Items.TOOL_BOW)
+            .addInput('R', Items.DUST_REDSTONE)
+            .create("dispenser", Blocks.DISPENSER_COBBLE_STONE.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "###",
+                "#D#",
+                "###")
+            .addInput('#', "minecraft:planks")
+            .addInput('D', Items.DIAMOND)
+            .create("jukebox", Blocks.JUKEBOX.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "XXX",
+                "XXX")
+            .addInput('X', Items.STRING)
+            .create("cobweb", Blocks.COBWEB.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "X")
+            .addInput('X', "minecraft:planks")
+            .create("stick", new ItemStack(Items.STICK, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape("###")
+            .addInput('#', Items.SUGARCANE)
+            .create("paper", new ItemStack(Items.PAPER, 6));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "XWX",
+                "XXX")
+            .addInput('X', Items.STICK)
+            .addInput('W', "minecraft:wools")
+            .create("painting", Items.PAINTING.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "X X",
+                "XXX")
+            .addInput('X', Items.INGOT_IRON)
+            .create("mesh", new ItemStack(Blocks.MESH, 8));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "X X",
+                "XXX")
+            .addInput('X', Items.INGOT_GOLD)
+            .create("mesh_gold", new ItemStack(Blocks.MESH_GOLD, 8));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "CCC",
+                "CMC",
+                "LLL")
+            .addInput('C', "minecraft:cobblestones")
+            .addInput('M', Blocks.MESH)
+            .addInput('L', "minecraft:logs")
+            .create("trommel", Blocks.TROMMEL_IDLE.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X X",
+                "XXX",
+                "X X")
+            .addInput('X', Items.STICK)
+            .create("ladder", new ItemStack(Blocks.LADDER_OAK, 2));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "XXX",
+                " # ")
+            .addInput('X', "minecraft:planks")
+            .addInput('#', Items.STICK)
+            .create("sign", new ItemStack(Items.SIGN, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "# #",
+                " # ")
+            .addInput('#', Blocks.GLASS)
+            .create("jar", new ItemStack(Items.JAR, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#XX",
+                "#XX",
+                "#  ")
+            .addInput('#', Items.STICK)
+            .addInput('X', Items.CLOTH)
+            .create("flag", Items.FLAG.getDefaultStack());
+
+        RecipeBuilderShaped shape22 = new RecipeBuilderShaped(CORE_NAMESPACE)
+            .setShape(
+                "##",
+                "##");
+
+        shape22.addInput('#', Items.DUST_GLOWSTONE).create("glowstone", Blocks.GLOWSTONE.getDefaultStack());
+        shape22.addInput('#', Items.CLAY).create("clay_block", Blocks.BLOCK_CLAY.getDefaultStack());
+        shape22.addInput('#', Items.AMMO_SNOWBALL).create("snow_block", Blocks.BLOCK_SNOW.getDefaultStack());
+        shape22.addInput('#', Items.STRING).create("string_to_wool", Blocks.WOOL.getDefaultStack());
+        shape22.addInput('#', Items.AMMO_PEBBLE).create("pebbles_to_cobblestone", Blocks.COBBLE_STONE.getDefaultStack());
+        shape22.addInput('#', Blocks.SAND).create("sandstone", new ItemStack(Blocks.SANDSTONE, 2));
+        shape22.addInput('#', "minecraft:planks").create("workbench", Blocks.WORKBENCH.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#X",
+                "X#")
+            .addInput('#', Items.AMMO_PEBBLE)
+            .addInput('X', Items.COAL)
+            .create("pebbles_to_basalt", new ItemStack(Blocks.COBBLE_BASALT, 2));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#X",
+                "X#")
+            .addInput('#', Items.AMMO_PEBBLE)
+            .addInput('X', Items.QUARTZ)
+            .create("pebbles_to_granite", new ItemStack(Blocks.COBBLE_GRANITE, 2));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#X",
+                "X#")
+            .addInput('#', Items.AMMO_PEBBLE)
+            .addInput('X', Blocks.SAND)
+            .create("pebbles_to_limestone", new ItemStack(Blocks.COBBLE_LIMESTONE, 2));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#X",
+                "X#")
+            .addInput('#', Blocks.PERMAFROST)
+            .addInput('X', Blocks.ICE)
+            .create("perma_ice", new ItemStack(Blocks.PERMAICE, 2));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "FPF",
+                "PFP",
+                "FPF")
+            .addInput('F', Items.FLINT)
+            .addInput('P', Items.AMMO_PEBBLE)
+            .create("gravel_from_flint_and_pebbles", Blocks.GRAVEL.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#",
+                "#")
+            .addInput('#', Items.STRING)
+            .create("rope", new ItemStack(Items.ROPE, 2));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#X",
+                "X#")
+            .addInput('#', Blocks.GLASS)
+            .addInput('X', Items.INGOT_STEEL)
+            .create("steel_glass", new ItemStack(Blocks.GLASS_STEEL, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#X",
+                "X#")
+            .addInput('#', Blocks.GLASS)
+            .addInput('X', Items.OLIVINE)
+            .create("tinted_glass", new ItemStack(Blocks.GLASS_TINTED, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#X",
+                "X#")
+            .addInput('#', Items.PAPER)
+            .addInput('X', "minecraft:planks")
+            .create("paper_wall", new ItemStack(Blocks.PAPER_WALL, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "#")
+            .addInput('#', Items.STICK)
+            .addInput('X', Items.COAL)
+            .create("torch_coal", new ItemStack(Blocks.TORCH_COAL, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "#")
+            .addInput('#', Items.STICK)
+            .addInput('X', Items.COAL, 1)
+            .create("torch_charcoal", new ItemStack(Blocks.TORCH_COAL, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "#")
+            .addInput('#', Items.STICK)
+            .addInput('X', Items.NETHERCOAL)
+            .create("torch_nethercoal", new ItemStack(Blocks.TORCH_COAL, 8));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "#")
+            .addInput('X', Blocks.PUMPKIN_CARVED_IDLE)
+            .addInput('#', Blocks.TORCH_COAL)
+            .create("carved_pumpkin_to_jack_o_lantern", Blocks.PUMPKIN_CARVED_ACTIVE.getDefaultStack());
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(Blocks.SPONGE_DRY)
+            .addInput(Items.BUCKET_WATER)
+            .create("sponge_to_wet_sponge", Blocks.SPONGE_WET.getDefaultStack());
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(Blocks.PUMPKIN)
+            .create("pumpkin_to_pumpkin_seeds", new ItemStack(Items.SEEDS_PUMPKIN, 4));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(Blocks.SLATE)
+            .create("slate_to_slate_layers", new ItemStack(Blocks.LAYER_SLATE, 8));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(Blocks.LEAVES_OAK)
+            .create("oak_leaves_to_leaf_pile", new ItemStack(Blocks.LAYER_LEAVES_OAK, 8));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "##")
+            .addInput('#', Items.AMMO_SNOWBALL)
+            .create("snowballs_to_snow_layer", new ItemStack(Blocks.LAYER_SNOW, 2));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "Y",
+                "Z")
+            .addInput('X', Items.FEATHER_CHICKEN)
+            .addInput('Y', Items.INGOT_IRON)
+            .addInput('Z', Items.STICK)
+            .create("paintbrush", new ItemStack(Items.PAINTBRUSH, 1, Items.PAINTBRUSH.getMaxDamage())); // Create brush with 0 durability
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "###")
+            .addInput('#', Items.INGOT_STEEL_CRUDE)
+            .create("crude_steel_to_steel_ingot", Items.INGOT_STEEL.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#",
+                "#")
+            .addInput('#', Blocks.MARBLE)
+            .create("marble_pillar", new ItemStack(Blocks.PILLAR_MARBLE, 2));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "PI",
+                "S ")
+            .addInput('P', Items.PAPER)
+            .addInput('I', new ItemStack(Items.DYE, 1, DyeColor.BLACK.itemMeta))
+            .addInput('S', Items.STRING)
+            .create("blank_label", Items.LABEL.getDefaultStack());
+    }
+    private static void generatePickaxes() {
+        RecipeBuilderShaped pickaxeTemplate = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                " # ",
+                " # ")
+            .addInput('#', Items.STICK);
+
+        pickaxeTemplate.addInput('X', "minecraft:planks").create("wooden_pickaxe", Items.TOOL_PICKAXE_WOOD.getDefaultStack());
+        pickaxeTemplate.addInput('X', "minecraft:cobblestones").create("stone_pickaxe", Items.TOOL_PICKAXE_STONE.getDefaultStack());
+        pickaxeTemplate.addInput('X', Items.INGOT_IRON).create("iron_pickaxe", Items.TOOL_PICKAXE_IRON.getDefaultStack());
+        pickaxeTemplate.addInput('X', Items.INGOT_GOLD).create("golden_pickaxe", Items.TOOL_PICKAXE_GOLD.getDefaultStack());
+        pickaxeTemplate.addInput('X', Items.DIAMOND).create("diamond_pickaxe", Items.TOOL_PICKAXE_DIAMOND.getDefaultStack());
+        pickaxeTemplate.addInput('X', Items.INGOT_STEEL).create("steel_pickaxe", Items.TOOL_PICKAXE_STEEL.getDefaultStack());
+    }
+
+    private static void generateAxes() {
+        RecipeBuilderShaped axeTemplate = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XX",
+                "X#",
+                " #")
+            .addInput('#', Items.STICK);
+
+        axeTemplate.addInput('X', "minecraft:planks").create("wooden_axe", Items.TOOL_AXE_WOOD.getDefaultStack());
+        axeTemplate.addInput('X', "minecraft:cobblestones").create("stone_axe", Items.TOOL_AXE_STONE.getDefaultStack());
+        axeTemplate.addInput('X', Items.INGOT_IRON).create("iron_axe", Items.TOOL_AXE_IRON.getDefaultStack());
+        axeTemplate.addInput('X', Items.INGOT_GOLD).create("golden_axe", Items.TOOL_AXE_GOLD.getDefaultStack());
+        axeTemplate.addInput('X', Items.DIAMOND).create("diamond_axe", Items.TOOL_AXE_DIAMOND.getDefaultStack());
+        axeTemplate.addInput('X', Items.INGOT_STEEL).create("steel_axe", Items.TOOL_AXE_STEEL.getDefaultStack());
+    }
+
+    private static void generateShovels() {
+        RecipeBuilderShaped shovelTemplate = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "#",
+                "#")
+            .addInput('#', Items.STICK);
+
+        shovelTemplate.addInput('X', "minecraft:planks").create("wooden_shovel", Items.TOOL_SHOVEL_WOOD.getDefaultStack());
+        shovelTemplate.addInput('X', "minecraft:cobblestones").create("stone_shovel", Items.TOOL_SHOVEL_STONE.getDefaultStack());
+        shovelTemplate.addInput('X', Items.INGOT_IRON).create("iron_shovel", Items.TOOL_SHOVEL_IRON.getDefaultStack());
+        shovelTemplate.addInput('X', Items.INGOT_GOLD).create("golden_shovel", Items.TOOL_SHOVEL_GOLD.getDefaultStack());
+        shovelTemplate.addInput('X', Items.DIAMOND).create("diamond_shovel", Items.TOOL_SHOVEL_DIAMOND.getDefaultStack());
+        shovelTemplate.addInput('X', Items.INGOT_STEEL).create("steel_shovel", Items.TOOL_SHOVEL_STEEL.getDefaultStack());
+    }
+
+    private static void generateHoes() {
+        RecipeBuilderShaped hoeTemplate = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XX",
+                " #",
+                " #")
+            .addInput('#', Items.STICK);
+
+        hoeTemplate.addInput('X', "minecraft:planks").create("wooden_hoe", Items.TOOL_HOE_WOOD.getDefaultStack());
+        hoeTemplate.addInput('X', "minecraft:cobblestones").create("stone_hoe", Items.TOOL_HOE_STONE.getDefaultStack());
+        hoeTemplate.addInput('X', Items.INGOT_IRON).create("iron_hoe", Items.TOOL_HOE_IRON.getDefaultStack());
+        hoeTemplate.addInput('X', Items.INGOT_GOLD).create("golden_hoe", Items.TOOL_HOE_GOLD.getDefaultStack());
+        hoeTemplate.addInput('X', Items.DIAMOND).create("diamond_hoe", Items.TOOL_HOE_DIAMOND.getDefaultStack());
+        hoeTemplate.addInput('X', Items.INGOT_STEEL).create("steel_hoe", Items.TOOL_HOE_STEEL.getDefaultStack());
+    }
+
+    private static void generateSwords() {
+        RecipeBuilderShaped sword = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "X",
+                "#")
+            .addInput('#', Items.STICK);
+
+        sword.addInput('X', "minecraft:planks").create("wooden_sword", Items.TOOL_SWORD_WOOD.getDefaultStack());
+        sword.addInput('X', "minecraft:cobblestones").create("stone_sword", Items.TOOL_SWORD_STONE.getDefaultStack());
+        sword.addInput('X', Items.INGOT_IRON).create("iron_sword", Items.TOOL_SWORD_IRON.getDefaultStack());
+        sword.addInput('X', Items.INGOT_GOLD).create("golden_sword", Items.TOOL_SWORD_GOLD.getDefaultStack());
+        sword.addInput('X', Items.DIAMOND).create("diamond_sword", Items.TOOL_SWORD_DIAMOND.getDefaultStack());
+        sword.addInput('X', Items.INGOT_STEEL).create("steel_sword", Items.TOOL_SWORD_STEEL.getDefaultStack());
+    }
+
+    private static void generateMiscTools() {
+        RecipeBuilderShaped shears = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                " X",
+                "X ");
+
+        shears.addInput('X', Items.INGOT_IRON).create("shears", Items.TOOL_SHEARS.getDefaultStack());
+        shears.addInput('X', Items.INGOT_STEEL).create("steel_shears", Items.TOOL_SHEARS_STEEL.getDefaultStack());
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Items.INGOT_IRON).addInput(Items.FLINT).create("fire_striker", Items.TOOL_FIRESTRIKER_IRON.getDefaultStack());
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Items.INGOT_STEEL).addInput(Items.FLINT).create("steel_fire_striker", Items.TOOL_FIRESTRIKER_STEEL.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "# #",
+                " # ")
+            .addInput('#', Items.INGOT_IRON)
+            .create("bucket", Items.BUCKET.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "# #",
+                "###")
+            .addInput('#', "minecraft:planks")
+            .create("boat", Items.BOAT.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "# #",
+                "###")
+            .addInput('#', Items.INGOT_IRON)
+            .create("minecart", Items.MINECART.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "A",
+                "B")
+            .addInput('A', "minecraft:chests")
+            .addInput('B', Items.MINECART)
+            .create("minecart_with_chest", Items.MINECART_CHEST.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "A",
+                "B")
+            .addInput('A', Blocks.FURNACE_STONE_IDLE)
+            .addInput('B', Items.MINECART)
+            .create("minecart_with_furnace", Items.MINECART_FURNACE.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                " #X",
+                "# X",
+                " #X")
+            .addInput('#', Items.STICK)
+            .addInput('X', Items.STRING)
+            .create("bow", Items.TOOL_BOW.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#OO",
+                "#XX",
+                " XX")
+            .addInput('#', Items.STRING)
+            .addInput('X', Items.LEATHER)
+            .addInput('O', Items.CLOTH)
+            .create("quiver", Items.ARMOR_QUIVER.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "T",
+                "I",
+                "V")
+            .addInput('T', Items.FLINT)
+            .addInput('I', Items.STICK)
+            .addInput('V', Items.FEATHER_CHICKEN)
+            .create("arrow", new ItemStack(Items.AMMO_ARROW, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                " X ",
+                "X#X",
+                " X ")
+            .addInput('X', Items.AMMO_ARROW)
+            .addInput('#', Items.INGOT_GOLD)
+            .create("golden_arrow", new ItemStack(Items.AMMO_ARROW_GOLD, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "  #",
+                " #S",
+                "# S")
+            .addInput('#', Items.STICK)
+            .addInput('S', Items.STRING)
+            .create("fishing_rod", Items.TOOL_FISHINGROD.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X  ",
+                "#X ",
+                " #O")
+            .addInput('X', "minecraft:logs")
+            .addInput('#', Items.INGOT_STEEL)
+            .addInput('O', Items.TOOL_BOW)
+            .create("hand_cannon", Items.HANDCANNON_UNLOADED.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                " S ",
+                "#X#",
+                " # ")
+            .addInput('S', Items.STRING)
+            .addInput('#', Items.INGOT_IRON)
+            .addInput('X', Items.SULPHUR)
+            .create("explosive_charge", new ItemStack(Items.AMMO_CHARGE_EXPLOSIVE, 4));
+    }
+
+    private static void generateHelmets() {
+        RecipeBuilderShaped helmet = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "X X"
+            );
+
+        helmet.addInput('X', Items.LEATHER).create("leather_helmet", Items.ARMOR_HELMET_LEATHER.getDefaultStack());
+        helmet.addInput('X', Items.INGOT_IRON).create("iron_helmet", Items.ARMOR_HELMET_IRON.getDefaultStack());
+        helmet.addInput('X', Items.INGOT_GOLD).create("golden_helmet", Items.ARMOR_HELMET_GOLD.getDefaultStack());
+        helmet.addInput('X', Items.DIAMOND).create("diamond_helmet", Items.ARMOR_HELMET_DIAMOND.getDefaultStack());
+        helmet.addInput('X', Items.INGOT_STEEL).create("steel_helmet", Items.ARMOR_HELMET_STEEL.getDefaultStack());
+    }
+
+    private static void generateChestPlates() {
+        RecipeBuilderShaped chestplate = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X X",
+                "XXX",
+                "XXX"
+            );
+
+        chestplate.addInput('X', Items.LEATHER).create("leather_chestplate", Items.ARMOR_CHESTPLATE_LEATHER.getDefaultStack());
+        chestplate.addInput('X', Items.INGOT_IRON).create("iron_chestplate", Items.ARMOR_CHESTPLATE_IRON.getDefaultStack());
+        chestplate.addInput('X', Items.INGOT_GOLD).create("golden_chestplate", Items.ARMOR_CHESTPLATE_GOLD.getDefaultStack());
+        chestplate.addInput('X', Items.DIAMOND).create("diamond_chestplate", Items.ARMOR_CHESTPLATE_DIAMOND.getDefaultStack());
+        chestplate.addInput('X', Items.INGOT_STEEL).create("steel_chestplate", Items.ARMOR_CHESTPLATE_STEEL.getDefaultStack());
+    }
+
+    private static void generateLeggings() {
+        RecipeBuilderShaped leggings = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "X X",
+                "X X"
+            );
+
+        leggings.addInput('X', Items.LEATHER).create("leather_leggings", Items.ARMOR_LEGGINGS_LEATHER.getDefaultStack());
+        leggings.addInput('X', Items.INGOT_IRON).create("iron_leggings", Items.ARMOR_LEGGINGS_IRON.getDefaultStack());
+        leggings.addInput('X', Items.INGOT_GOLD).create("golden_leggings", Items.ARMOR_LEGGINGS_GOLD.getDefaultStack());
+        leggings.addInput('X', Items.DIAMOND).create("diamond_leggings", Items.ARMOR_LEGGINGS_DIAMOND.getDefaultStack());
+        leggings.addInput('X', Items.INGOT_STEEL).create("steel_leggings", Items.ARMOR_LEGGINGS_STEEL.getDefaultStack());
+    }
+
+    private static void generateBoots() {
+        RecipeBuilderShaped boots = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X X",
+                "X X"
+            );
+
+        boots.addInput('X', Items.LEATHER).create("leather_boots", Items.ARMOR_BOOTS_LEATHER.getDefaultStack());
+        boots.addInput('X', Items.INGOT_IRON).create("iron_boots", Items.ARMOR_BOOTS_IRON.getDefaultStack());
+        boots.addInput('X', Items.INGOT_GOLD).create("golden_boots", Items.ARMOR_BOOTS_GOLD.getDefaultStack());
+        boots.addInput('X', Items.DIAMOND).create("diamond_boots", Items.ARMOR_BOOTS_DIAMOND.getDefaultStack());
+        boots.addInput('X', Items.INGOT_STEEL).create("steel_boots", Items.ARMOR_BOOTS_STEEL.getDefaultStack());
+    }
+
+    private static void generateBlockCompression() {
+        RecipeBuilderShaped block = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "XXX",
+                "XXX"
+            );
+
+        RecipeBuilderShaped blockFuel = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "X X",
+                "XXX"
+            );
+
+        block.addInput('X', Items.INGOT_GOLD).create("block_of_gold", Blocks.BLOCK_GOLD.getDefaultStack());
+        block.addInput('X', Items.INGOT_IRON).create("block_of_iron", Blocks.BLOCK_IRON.getDefaultStack());
+        block.addInput('X', Items.INGOT_STEEL).create("block_of_steel", Blocks.BLOCK_STEEL.getDefaultStack());
+        block.addInput('X', Items.DYE, DyeColor.BLUE.itemMeta).create("block_of_lapis_lazuli", Blocks.BLOCK_LAPIS.getDefaultStack());
+        block.addInput('X', Items.DUST_REDSTONE).create("block_of_redstone", Blocks.BLOCK_REDSTONE.getDefaultStack());
+        block.addInput('X', Items.DIAMOND).create("block_of_diamond", Blocks.BLOCK_DIAMOND.getDefaultStack());
+        block.addInput('X', Items.QUARTZ).create("block_of_quartz", Blocks.BLOCK_QUARTZ.getDefaultStack());
+        block.addInput('X', Items.SUGARCANE).create("block_of_sugarcane", Blocks.BLOCK_SUGARCANE.getDefaultStack());
+
+        blockFuel.addInput('X', Items.COAL, 0).create("block_of_coal", Blocks.BLOCK_COAL.getDefaultStack());
+        blockFuel.addInput('X', Items.COAL, 1).create("block_of_charcoal", Blocks.BLOCK_CHARCOAL.getDefaultStack());
+        blockFuel.addInput('X', Items.NETHERCOAL).create("block_of_nethercoal", Blocks.BLOCK_NETHER_COAL.getDefaultStack());
+        blockFuel.addInput('X', Items.OLIVINE).create("block_of_olivine", Blocks.BLOCK_OLIVINE.getDefaultStack());
+    }
+
+    private static void generateBlockDecompression() {
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_GOLD).create("block_of_gold_to_gold_ingot", new ItemStack(Items.INGOT_GOLD, 9));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_IRON).create("block_of_iron_to_iron_ingot", new ItemStack(Items.INGOT_IRON, 9));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_STEEL).create("block_of_steel_to_steel_ingot", new ItemStack(Items.INGOT_STEEL, 9));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_LAPIS).create("block_of_lapis_lazuli_to_lapis_lazuli", new ItemStack(Items.DYE, 9, DyeColor.BLUE.itemMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_REDSTONE).create("block_of_redstone_to_redstone", new ItemStack(Items.DUST_REDSTONE, 9));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_DIAMOND).create("block_of_diamond_to_diamond", new ItemStack(Items.DIAMOND, 9));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_QUARTZ).create("block_of_quartz_to_quartz", new ItemStack(Items.QUARTZ, 9));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_COAL).create("block_of_coal_to_coal", new ItemStack(Items.COAL, 8, 0));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_CHARCOAL).create("block_of_charcoal_to_charcoal", new ItemStack(Items.COAL, 8, 1));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_NETHER_COAL).create("block_of_nethercoal_to_nethercoal", new ItemStack(Items.NETHERCOAL, 8));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.BLOCK_OLIVINE).create("block_of_olivine_to_olivine", new ItemStack(Items.OLIVINE, 8));
+    }
+
+    private static void generateBricks() {
+        RecipeBuilderShaped bricks = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XX",
+                "XX"
+            );
+
+        final int stackSize = 4;
+
+        bricks.addInput('X', Items.BRICK_CLAY).create("clay_bricks", new ItemStack(Blocks.BRICK_CLAY, stackSize));
+        bricks.addInput('X', Items.INGOT_GOLD).create("golden_bricks", new ItemStack(Blocks.BRICK_GOLD, stackSize));
+        bricks.addInput('X', Items.INGOT_IRON).create("iron_bricks", new ItemStack(Blocks.BRICK_IRON, stackSize));
+        bricks.addInput('X', Items.DYE, DyeColor.BLUE.itemMeta).create("lapis_lazuli_bricks", new ItemStack(Blocks.BRICK_LAPIS, stackSize));
+        bricks.addInput('X', Blocks.SANDSTONE).create("sandstone_bricks", new ItemStack(Blocks.BRICK_SANDSTONE, stackSize));
+        bricks.addInput('X', Blocks.STONE).create("stone_bricks", new ItemStack(Blocks.BRICK_STONE, stackSize));
+        bricks.addInput('X', Blocks.BASALT).create("basalt_bricks", new ItemStack(Blocks.BRICK_BASALT, stackSize));
+        bricks.addInput('X', Blocks.GRANITE).create("granite_bricks", new ItemStack(Blocks.BRICK_GRANITE, stackSize));
+        bricks.addInput('X', Blocks.LIMESTONE).create("limestone_bricks", new ItemStack(Blocks.BRICK_LIMESTONE, stackSize));
+        bricks.addInput('X', Blocks.MARBLE).create("marble_bricks", new ItemStack(Blocks.BRICK_MARBLE, stackSize));
+        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.STONE_POLISHED).create("polished_stone_bricks", new ItemStack(Blocks.BRICK_STONE_POLISHED, stackSize));
+    }
+
+    private static void generateSlabs() {
+        RecipeBuilderShaped slabs = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX"
+            );
+
+        final int stackSize = 6;
+
+        for (DyeColor color : DyeColor.values()) {
+            slabs.addInput('X', Blocks.PLANKS_OAK_PAINTED, color.blockMeta).create(color.colorID + "_wooden_slab", new ItemStack(Blocks.SLAB_PLANKS_PAINTED, stackSize, color.blockMeta << 4));
+        }
+        slabs.addInput('X', Blocks.PLANKS_OAK).create("wooden_slab", new ItemStack(Blocks.SLAB_PLANKS_OAK, stackSize));
+        slabs.addInput('X', Blocks.SANDSTONE).create("sandstone_slab", new ItemStack(Blocks.SLAB_SANDSTONE, stackSize));
+
+        slabs.addInput('X', Blocks.COBBLE_STONE).create("cobbled_stone_slab", new ItemStack(Blocks.SLAB_COBBLE_STONE, stackSize));
+        slabs.addInput('X', Blocks.COBBLE_BASALT).create("cobbled_basalt_slab", new ItemStack(Blocks.SLAB_COBBLE_BASALT, stackSize));
+        slabs.addInput('X', Blocks.COBBLE_GRANITE).create("cobbled_granite_slab", new ItemStack(Blocks.SLAB_COBBLE_GRANITE, stackSize));
+        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.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));
+        slabs.addInput('X', Blocks.BRICK_STONE_POLISHED).create("polished_stone_brick_slab", new ItemStack(Blocks.SLAB_BRICK_STONE_POLISHED, stackSize));
+        slabs.addInput('X', Blocks.BASALT_POLISHED).create("polished_basalt_slab", new ItemStack(Blocks.SLAB_BASALT_POLISHED, stackSize));
+        slabs.addInput('X', Blocks.GRANITE_POLISHED).create("polished_granite_slab", new ItemStack(Blocks.SLAB_GRANITE_POLISHED, stackSize));
+        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.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));
+        slabs.addInput('X', Blocks.BRICK_BASALT).create("basalt_brick_slab", new ItemStack(Blocks.SLAB_BRICK_BASALT, stackSize));
+        slabs.addInput('X', Blocks.BRICK_GRANITE).create("granite_brick_slab", new ItemStack(Blocks.SLAB_BRICK_GRANITE, stackSize));
+        slabs.addInput('X', Blocks.BRICK_LIMESTONE).create("limestone_brick_slab", new ItemStack(Blocks.SLAB_BRICK_LIMESTONE, stackSize));
+        slabs.addInput('X', Blocks.BRICK_SLATE).create("slate_brick_slab", new ItemStack(Blocks.SLAB_BRICK_SLATE, stackSize));
+        slabs.addInput('X', Blocks.BRICK_CLAY).create("clay_brick_slab", new ItemStack(Blocks.SLAB_BRICK_CLAY, stackSize));
+        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));
+    }
+
+    private static void generateStairs() {
+        RecipeBuilderShaped stairs = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X  ",
+                "XX ",
+                "XXX"
+            );
+
+        final int stackSize = 6;
+
+        for (DyeColor color : DyeColor.values()) {
+            stairs
+                .addInput('X', Blocks.PLANKS_OAK_PAINTED, color.blockMeta).create(color.colorID + "_wooden_stairs", new ItemStack(Blocks.STAIRS_PLANKS_PAINTED, stackSize, color.blockMeta << 4));
+        }
+
+        stairs.addInput('X', Blocks.PLANKS_OAK).create("wooden_stairs", new ItemStack(Blocks.STAIRS_PLANKS_OAK, stackSize));
+        stairs.addInput('X', Blocks.SANDSTONE).create("sandstone_stairs", new ItemStack(Blocks.STAIRS_SANDSTONE, stackSize));
+
+        stairs.addInput('X', Blocks.COBBLE_STONE).create("cobblestone_stairs", new ItemStack(Blocks.STAIRS_COBBLE_STONE, stackSize));
+        stairs.addInput('X', Blocks.COBBLE_BASALT).create("cobbled_basalt_stairs", new ItemStack(Blocks.STAIRS_COBBLE_BASALT, stackSize));
+        stairs.addInput('X', Blocks.COBBLE_GRANITE).create("cobbled_granite_stairs", new ItemStack(Blocks.STAIRS_COBBLE_GRANITE, stackSize));
+        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.BRICK_STONE_POLISHED).create("polished_stone_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_STONE_POLISHED, stackSize));
+
+        stairs.addInput('X', Blocks.BRICK_MARBLE).create("marble_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_MARBLE, stackSize));
+        stairs.addInput('X', Blocks.BRICK_STONE).create("stone_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_STONE, stackSize));
+        stairs.addInput('X', Blocks.BRICK_BASALT).create("basalt_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_BASALT, stackSize));
+        stairs.addInput('X', Blocks.BRICK_GRANITE).create("granite_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_GRANITE, stackSize));
+        stairs.addInput('X', Blocks.BRICK_LIMESTONE).create("limestone_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_LIMESTONE, stackSize));
+        stairs.addInput('X', Blocks.BRICK_SLATE).create("slate_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_SLATE, stackSize));
+        stairs.addInput('X', Blocks.BRICK_CLAY).create("clay_brick_stairs", new ItemStack(Blocks.STAIRS_BRICK_CLAY, stackSize));
+        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));
+    }
+
+    private static void generateDoors() {
+        RecipeBuilderShaped door = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XX",
+                "XX",
+                "XX"
+            );
+        final int stackSize = 2;
+
+        for (DyeColor color : DyeColor.values()) {
+            door.addInput('X', Blocks.PLANKS_OAK_PAINTED, color.blockMeta).create(color.colorID + "_wooden_door", new ItemStack(Items.DOOR_OAK_PAINTED, stackSize, color.itemMeta));
+        }
+        door.addInput('X', Blocks.PLANKS_OAK).create("wooden_door", new ItemStack(Items.DOOR_OAK, stackSize));
+        door.addInput('X', Blocks.GLASS).create("glass_door", new ItemStack(Items.DOOR_GLASS, stackSize));
+        door.addInput('X', Items.INGOT_IRON).create("iron_door", new ItemStack(Items.DOOR_IRON, stackSize));
+        door.addInput('X', Items.INGOT_STEEL).create("steel_door", new ItemStack(Items.DOOR_STEEL, stackSize));
+    }
+
+    private static void generateTrapDoors() {
+        RecipeBuilderShaped door = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "XXX"
+            );
+        final int stackSize = 6;
+
+        for (DyeColor color : DyeColor.values()) {
+            door.addInput('X', Blocks.PLANKS_OAK_PAINTED, color.blockMeta).create(color.colorID + "_wooden_trapdoor", new ItemStack(Blocks.TRAPDOOR_PLANKS_PAINTED, stackSize, color.blockMeta << 4));
+        }
+        door.addInput('X', Blocks.PLANKS_OAK).create("wooden_trapdoor", new ItemStack(Blocks.TRAPDOOR_PLANKS_OAK, stackSize));
+        door.addInput('X', Blocks.GLASS).create("glass_trapdoor", new ItemStack(Blocks.TRAPDOOR_GLASS, stackSize));
+        door.addInput('X', Items.INGOT_IRON).create("iron_trapdoor", new ItemStack(Blocks.TRAPDOOR_IRON, stackSize));
+        door.addInput('X', Items.INGOT_STEEL).create("steel_trapdoor", new ItemStack(Blocks.TRAPDOOR_STEEL, stackSize));
+    }
+
+    private static void generateFences() {
+        RecipeBuilderShaped fence = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X#X",
+                "X#X"
+            );
+
+        RecipeBuilderShaped woodenFence = fence.addInput('#', Items.STICK);
+
+        final int stackSize = 6;
+
+        for (DyeColor color : DyeColor.values()) {
+            woodenFence.addInput('X', Blocks.PLANKS_OAK_PAINTED, color.blockMeta).create(color.colorID + "_wooden_fence", new ItemStack(Blocks.FENCE_PLANKS_OAK_PAINTED, stackSize, color.blockMeta));
+        }
+        woodenFence.addInput('X', Blocks.PLANKS_OAK).create("wooden_fence", new ItemStack(Blocks.FENCE_PLANKS_OAK, stackSize));
+
+        fence.addInput('X', Items.STICK).addInput('#', Blocks.PAPER_WALL).create("paper_wall_fence", new ItemStack(Blocks.FENCE_PAPER_WALL, 4));
+        fence.addInput('X', Items.INGOT_IRON).addInput('#', Items.CHAINLINK).create("chainlink_fence", new ItemStack(Blocks.FENCE_CHAINLINK, 8));
+    }
+
+    private static void generateFenceGates() {
+        RecipeBuilderShaped woodenFenceGate = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#X#",
+                "#X#"
+            ).addInput('#', Items.STICK);
+
+        final int stackSize = 3;
+
+        for (DyeColor color : DyeColor.values()) {
+            woodenFenceGate.addInput('X', Blocks.PLANKS_OAK_PAINTED, color.blockMeta).create(color.colorID + "_wooden_fence_gate", new ItemStack(Blocks.FENCE_GATE_PLANKS_OAK_PAINTED, stackSize, color.blockMeta << 4));
+        }
+        woodenFenceGate.addInput('X', Blocks.PLANKS_OAK).create("wooden_fence_gate", new ItemStack(Blocks.FENCE_GATE_PLANKS_OAK, stackSize));
+    }
+
+    private static void generateChests() {
+        RecipeBuilderShaped chest = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "X X",
+                "XXX"
+            );
+
+        for (DyeColor color : DyeColor.values()) {
+            chest.addInput('X', Blocks.PLANKS_OAK_PAINTED, color.blockMeta).create(color.colorID + "_wooden_chest_from_planks", new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, color.blockMeta << 4));
+
+            RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput("minecraft:chests").addInput(Items.DYE, color.itemMeta).create(color.colorID + "_wooden_chest_from_chest", new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, color.blockMeta << 4));
+        }
+        chest.addInput('X', Blocks.PLANKS_OAK).create("wooden_chest", Blocks.CHEST_PLANKS_OAK.getDefaultStack());
+    }
+
+    private static void generateLogToPlanks() {
+        final int stackSize = 4;
+        final String format = "%s_log_to_%s_wooden_planks";
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.LOG_OAK).create("oak_log_to_wooden_planks", new ItemStack(Blocks.PLANKS_OAK, stackSize));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.LOG_BIRCH).create(String.format(format, "birch", "white"), new ItemStack(Blocks.PLANKS_OAK_PAINTED, stackSize, DyeColor.WHITE.blockMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.LOG_CHERRY).create(String.format(format, "cherry", "pink"), new ItemStack(Blocks.PLANKS_OAK_PAINTED, stackSize, DyeColor.PINK.blockMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.LOG_EUCALYPTUS).create(String.format(format, "eucalyptus", "orange"), new ItemStack(Blocks.PLANKS_OAK_PAINTED, stackSize, DyeColor.ORANGE.blockMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.LOG_OAK_MOSSY).create(String.format(format, "mossy_oak", "green"), new ItemStack(Blocks.PLANKS_OAK_PAINTED, stackSize, DyeColor.GREEN.blockMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.LOG_PALM).create(String.format(format, "palm", "yellow"), new ItemStack(Blocks.PLANKS_OAK_PAINTED, stackSize, DyeColor.YELLOW.blockMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.LOG_THORN).create(String.format(format, "thorn", "red"), new ItemStack(Blocks.PLANKS_OAK_PAINTED, stackSize, DyeColor.RED.blockMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.LOG_PINE).create(String.format(format, "pine", "brown"), new ItemStack(Blocks.PLANKS_OAK_PAINTED, stackSize, DyeColor.BROWN.blockMeta));
+    }
+
+    private static void generateDyedWools() {
+        for (DyeColor color : DyeColor.values()) {
+            RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput("minecraft:wools").addInput(Items.DYE, color.itemMeta).create(color.colorID + "_wool", new ItemStack(Blocks.WOOL, 1, color.blockMeta));
+        }
+    }
+
+    private static void generateDyedPlanks() {
+        RecipeBuilderShaped planks = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "XDX",
+                "XXX"
+            ).addInput('X', "minecraft:planks");
+        for (DyeColor color : DyeColor.values()) {
+            planks.addInput('D', Items.DYE, color.itemMeta).create(color.colorID + "_wooden_planks", new ItemStack(Blocks.PLANKS_OAK_PAINTED, 8, color.blockMeta));
+        }
+    }
+
+    private static void generatePolishedStones() {
+        RecipeBuilderShaped shape = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#",
+                "#");
+        final String format = "%1$s_to_polished_%1$s";
+        final int stackSize = 2;
+
+        shape.addInput('#', Blocks.STONE).create(String.format(format, "stone"), new ItemStack(Blocks.STONE_POLISHED, stackSize));
+        shape.addInput('#', Blocks.BASALT).create(String.format(format, "basalt"), new ItemStack(Blocks.BASALT_POLISHED, stackSize));
+        shape.addInput('#', Blocks.LIMESTONE).create(String.format(format, "limestone"), new ItemStack(Blocks.LIMESTONE_POLISHED, stackSize));
+        shape.addInput('#', Blocks.GRANITE).create(String.format(format, "granite"), new ItemStack(Blocks.GRANITE_POLISHED, stackSize));
+        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));
+    }
+
+    private static void generateInformationals() {
+        RecipeBuilderShaped info = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                " X ",
+                "X#X",
+                " X "
+            ).addInput('#', Items.DUST_REDSTONE);
+
+        info.addInput('X', "minecraft:planks").create("rotary_calendar", Items.TOOL_CALENDAR.getDefaultStack());
+        info.addInput('X', Items.INGOT_IRON).create("compass", Items.TOOL_COMPASS.getDefaultStack());
+        info.addInput('X', Items.INGOT_GOLD).create("clock", Items.TOOL_CLOCK.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "###",
+                "###",
+                "###")
+            .addInput('#', Items.PAPER)
+            .create("map", Items.MAP.getDefaultStack());
+
+    }
+
+    private static void generateFoods() {
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "# #",
+                " # ")
+            .addInput('#', "minecraft:planks")
+            .create("bowl", Items.BOWL.getDefaultStack());
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Items.BOWL).addInput(Blocks.MUSHROOM_BROWN).addInput(Blocks.MUSHROOM_RED).create("mushroom_stew", Items.FOOD_STEW_MUSHROOM.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape("XXX")
+            .addInput('X', Items.WHEAT)
+            .create("bread", Items.FOOD_BREAD.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape("X#X")
+            .addInput('X', Items.WHEAT)
+            .addInput('#', new ItemStack(Items.DYE, 1, DyeColor.BROWN.itemMeta))
+            .create("cookie", new ItemStack(Items.FOOD_COOKIE, 16));
+
+        RecipeBuilderShaped cake = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "AAA",
+                "BEB",
+                "CCC")
+            .setConsumeContainer(false);
+
+        cake.addInput('A', Items.BUCKET_MILK)
+            .addInput('B', Items.DUST_SUGAR)
+            .addInput('E', Items.EGG_CHICKEN)
+            .addInput('C', Items.WHEAT)
+            .create("cake", Items.FOOD_CAKE.getDefaultStack());
+
+        cake.addInput('A', Items.BUCKET_MILK)
+            .addInput('B', Items.DUST_SUGAR)
+            .addInput('E', Blocks.PUMPKIN)
+            .addInput('C', Items.WHEAT)
+            .create("pumpkin_pie", Items.FOOD_PUMPKIN_PIE.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "X#X",
+                "XXX")
+            .addInput('X', Blocks.BLOCK_GOLD)
+            .addInput('#', Items.FOOD_APPLE)
+            .create("golden_apple", Items.FOOD_APPLE_GOLD.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                " Y ",
+                "#O#",
+                " X ")
+            .addInput('Y', Items.FOOD_CHERRY)
+            .addInput('O', new ItemStack(Items.DYE, 1, DyeColor.BROWN.itemMeta))
+            .addInput('#', Items.AMMO_SNOWBALL)
+            .addInput('X', Items.BUCKET)
+            .setConsumeContainer(true)
+            .create("ice_cream_bucket", Items.BUCKET_ICECREAM.getDefaultStack());
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Items.SUGARCANE).create("sugar_cane_to_sugar", new ItemStack(Items.DUST_SUGAR, 3));
+    }
+
+    private static void generateDyes() {
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Items.BONE).create("bone_to_dye", new ItemStack(Items.DYE, 3, DyeColor.WHITE.itemMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.RED.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.WHITE.itemMeta))
+            .create("red_dye_white_dye_to_pink_dye", new ItemStack(Items.DYE, 2, DyeColor.PINK.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.RED.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.YELLOW.itemMeta))
+            .create("red_dye_yellow_dye_to_orange_dye", new ItemStack(Items.DYE, 2, DyeColor.ORANGE.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.GREEN.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.WHITE.itemMeta))
+            .create("green_dye_white_dye_to_lime_dye", new ItemStack(Items.DYE, 2, DyeColor.LIME.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.BLACK.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.WHITE.itemMeta))
+            .create("black_dye_white_dye_to_gray_dye", new ItemStack(Items.DYE, 2, DyeColor.GRAY.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.GRAY.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.WHITE.itemMeta))
+            .create("gray_dye_white_dye_to_light_gray_dye", new ItemStack(Items.DYE, 2, DyeColor.SILVER.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.GRAY.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.GRAY.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.BLACK.itemMeta))
+            .create("black_dye_gray_dye_gray_dye_to_light_gray_dye", new ItemStack(Items.DYE, 3, DyeColor.SILVER.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.BLUE.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.WHITE.itemMeta))
+            .create("blue_dye_white_dye_to_light_blue_dye", new ItemStack(Items.DYE, 2, DyeColor.LIGHT_BLUE.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.BLUE.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.GREEN.itemMeta))
+            .create("blue_dye_green_dye_to_cyan_dye", new ItemStack(Items.DYE, 2, DyeColor.CYAN.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.BLUE.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.RED.itemMeta))
+            .create("blue_dye_red_dye_to_purple_dye", new ItemStack(Items.DYE, 2, DyeColor.PURPLE.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.PURPLE.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.PINK.itemMeta))
+            .create("purple_dye_pink_dye_to_magenta_dye", new ItemStack(Items.DYE, 2, DyeColor.MAGENTA.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.BLUE.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.RED.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.PINK.itemMeta))
+            .create("blue_dye_red_dye_pink_dye_to_magenta_dye", new ItemStack(Items.DYE, 3, DyeColor.MAGENTA.itemMeta));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.BLUE.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.RED.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.RED.itemMeta))
+            .addInput(new ItemStack(Items.DYE, 1, DyeColor.WHITE.itemMeta))
+            .create("blue_dye_red_dye_red_dye_white_dye_to_magenta_dye", new ItemStack(Items.DYE, 4, DyeColor.MAGENTA.itemMeta));
+
+
+        final int stackSize = 2;
+        final String formatFlower = "flower_%s_to_dye";
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.FLOWER_RED).create(String.format(formatFlower, "red"), new ItemStack(Items.DYE, stackSize, DyeColor.RED.itemMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.FLOWER_YELLOW).create(String.format(formatFlower, "yellow"), new ItemStack(Items.DYE, stackSize, DyeColor.YELLOW.itemMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.FLOWER_ORANGE).create(String.format(formatFlower, "orange"), new ItemStack(Items.DYE, stackSize, DyeColor.ORANGE.itemMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.FLOWER_PINK).create(String.format(formatFlower, "pink"), new ItemStack(Items.DYE, stackSize, DyeColor.PINK.itemMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.FLOWER_PURPLE).create(String.format(formatFlower, "purple"), new ItemStack(Items.DYE, stackSize, DyeColor.PURPLE.itemMeta));
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput(Blocks.FLOWER_LIGHT_BLUE).create(String.format(formatFlower, "lightblue"), new ItemStack(Items.DYE, stackSize, DyeColor.LIGHT_BLUE.itemMeta));
+    }
+
+    private static void generateRedstoneComponents() {
+        RecipeBuilderShaped plate = RecipeBuilder.Shaped(CORE_NAMESPACE).setShape("##");
+
+        plate.addInput('#', Blocks.STONE).create("stone_pressure_plate", Blocks.PRESSURE_PLATE_STONE.getDefaultStack());
+        plate.addInput('#', "minecraft:planks").create("wooden_pressure_plate", Blocks.PRESSURE_PLATE_PLANKS_OAK.getDefaultStack());
+        plate.addInput('#', "minecraft:cobblestones").create("cobblestone_pressure_plate", Blocks.PRESSURE_PLATE_COBBLE_STONE.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "XRX",
+                "XXX")
+            .addInput('X', "minecraft:planks")
+            .addInput('R', Items.DUST_REDSTONE)
+            .create("note_block", Blocks.NOTEBLOCK.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "#I#",
+                "#R#")
+            .addInput('X', "minecraft:planks")
+            .addInput('#', "minecraft:cobblestones")
+            .addInput('I', Items.INGOT_IRON)
+            .addInput('R', Items.DUST_REDSTONE)
+            .create("piston", new ItemStack(Blocks.PISTON_BASE));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "S",
+                "P")
+            .addInput('S', Items.SLIMEBALL)
+            .addInput('P', Blocks.PISTON_BASE)
+            .create("sticky_piston", Blocks.PISTON_BASE_STICKY.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X#X",
+                "#X#",
+                "X#X")
+            .addInput('X', Items.SULPHUR)
+            .addInput('#', Blocks.SAND)
+            .create("tnt", new ItemStack(Blocks.TNT));
+
+        RecipeBuilder.Shapeless(CORE_NAMESPACE).addInput("minecraft:stones").create("stone_button", new ItemStack(Blocks.BUTTON_STONE, 4));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "S",
+                "C")
+            .addInput('S', Items.STICK)
+            .addInput('C', "minecraft:cobblestones")
+            .create("cobblestone_lever", new ItemStack(Blocks.LEVER_COBBLE_STONE, 2));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "###",
+                "#O#",
+                "#X#")
+            .addInput('#', Blocks.GLASS)
+            .addInput('O', Items.QUARTZ)
+            .addInput('X', Items.DUST_REDSTONE)
+            .create("lamp", new ItemStack(Blocks.LAMP_IDLE, 4));
+
+        for (DyeColor color : DyeColor.values()) {
+            RecipeBuilder.Shapeless(CORE_NAMESPACE)
+                .addInput("minecraft:lamps")
+                .addInput(new ItemStack(Items.DYE, 1, color.itemMeta))
+                .create(color.colorID + "_lamp_convert", new ItemStack(Blocks.LAMP_IDLE, 1, color.blockMeta));
+        }
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "#")
+            .addInput('X', Items.DUST_REDSTONE)
+            .addInput('#', Items.STICK)
+            .create("redstone_torch", new ItemStack(Blocks.TORCH_REDSTONE_ACTIVE, 1));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#X#",
+                "III")
+            .addInput('#', Items.STICK)
+            .addInput('X', Items.DUST_REDSTONE)
+            .addInput('I', "minecraft:stones")
+            .create("redstone_repeater", new ItemStack(Items.REPEATER, 1));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X",
+                "#")
+            .addInput('X', Blocks.PUMPKIN_CARVED_IDLE)
+            .addInput('#', Blocks.TORCH_REDSTONE_ACTIVE)
+            .create("carved_pumpkin_to_redstone_jack_o_lantern", Blocks.PUMPKIN_REDSTONE.getDefaultStack());
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X X",
+                "X#X",
+                "X X")
+            .addInput('#', Items.STICK)
+            .addInput('X', Items.INGOT_IRON)
+            .create("rail", new ItemStack(Blocks.RAIL, 16));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X X",
+                "X#X",
+                "XRX")
+            .addInput('#', Items.STICK)
+            .addInput('X', Items.INGOT_GOLD)
+            .addInput('R', Items.DUST_REDSTONE)
+            .create("powered_rail", new ItemStack(Blocks.RAIL_POWERED, 8));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "X X",
+                "X#X",
+                "XRX")
+            .addInput('#', Blocks.PRESSURE_PLATE_STONE)
+            .addInput('X', Items.INGOT_IRON)
+            .addInput('R', Items.DUST_REDSTONE)
+            .create("detector_rail", new ItemStack(Blocks.RAIL_DETECTOR, 8));
+
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                " # ",
+                "#X#",
+                "YYY")
+            .addInput('#', Items.INGOT_IRON)
+            .addInput('X', Items.DUST_REDSTONE)
+            .addInput('Y', "minecraft:cobblestones")
+            .create("spikes", new ItemStack(Blocks.SPIKES, 4));
+    }
+
+    private static void generateScrapRecipes() {
+        Registries.RECIPES.WORKBENCH.register("scrap_chainmail_boots",        new RecipeEntryScrap(Items.ARMOR_BOOTS_CHAINMAIL,       Items.CHAINLINK, 4));
+        Registries.RECIPES.WORKBENCH.register("scrap_chainmail_leggings",     new RecipeEntryScrap(Items.ARMOR_LEGGINGS_CHAINMAIL,    Items.CHAINLINK, 4));
+        Registries.RECIPES.WORKBENCH.register("scrap_chainmail_chestplate",   new RecipeEntryScrap(Items.ARMOR_CHESTPLATE_CHAINMAIL,  Items.CHAINLINK, 4));
+        Registries.RECIPES.WORKBENCH.register("scrap_chainmail_helmet",       new RecipeEntryScrap(Items.ARMOR_HELMET_CHAINMAIL,      Items.CHAINLINK, 4));
+    }
+
+    private static void generateRepairableRecipes() {
+         Registries.RECIPES.WORKBENCH.register("repair_chainmail_boots",       new RecipeEntryRepairable(Items.ARMOR_BOOTS_CHAINMAIL.getDefaultStack(),        new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
+         Registries.RECIPES.WORKBENCH.register("repair_chainmail_leggings",    new RecipeEntryRepairable(Items.ARMOR_LEGGINGS_CHAINMAIL.getDefaultStack(),     new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
+         Registries.RECIPES.WORKBENCH.register("repair_chainmail_chestplate",  new RecipeEntryRepairable(Items.ARMOR_CHESTPLATE_CHAINMAIL.getDefaultStack(),   new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
+         Registries.RECIPES.WORKBENCH.register("repair_chainmail_helmet",      new RecipeEntryRepairable(Items.ARMOR_HELMET_CHAINMAIL.getDefaultStack(),       new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
+    }
+
+    private static void generateToolRecipes() {
+        Registries.RECIPES.WORKBENCH.register("carve_pumpkin_sword",     new RecipeEntryCraftingWithTool(new RecipeSymbol(Blocks.PUMPKIN.getDefaultStack()), new RecipeSymbol("minecraft:tool_swords"),     new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
+    }
+
+    private static void generateUndyeingRecipes() {
+        final String format = "%s_undyeing";
+        final int stackSize = 8;
+
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:planks"), new ItemStack(Blocks.PLANKS_OAK, stackSize)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "stairs_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:stairs_planks"), new ItemStack(Blocks.STAIRS_PLANKS_OAK, stackSize)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "slabs_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:slabs_planks"), new ItemStack(Blocks.SLAB_PLANKS_OAK, stackSize)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "fences_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:fences_planks"), new ItemStack(Blocks.FENCE_PLANKS_OAK, stackSize)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "fence_gates_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:fence_gates_planks"), new ItemStack(Blocks.FENCE_GATE_PLANKS_OAK, stackSize)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "trapdoor_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:trapdoor_planks"), new ItemStack(Blocks.TRAPDOOR_PLANKS_OAK, stackSize)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "lamps"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:lamps"), new ItemStack(Blocks.LAMP_IDLE, stackSize)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "wools"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:wools"), new ItemStack(Blocks.WOOL, stackSize)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "chests"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:chests"), new ItemStack(Blocks.CHEST_PLANKS_OAK, stackSize)));
+    }
+}
diff --git a/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilder.java b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilder.java
new file mode 100644
index 000000000..c1f6d643c
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilder.java
@@ -0,0 +1,231 @@
+package net.minecraft.datagen.recipeBuilders;
+
+import com.b100.utils.FileUtils;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.TypeAdapter;
+import com.google.gson.reflect.TypeToken;
+import net.minecraft.core.WeightedRandomBag;
+import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.HasJsonAdapter;
+import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeNamespace;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.adapter.ItemStackJsonAdapter;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeJsonAdapter;
+import net.minecraft.core.data.registry.recipe.adapter.RecipeSymbolJsonAdapter;
+import net.minecraft.core.data.registry.recipe.adapter.WeightedRandomBagJsonAdapter;
+import net.minecraft.core.data.registry.recipe.adapter.WeightedRandomLootObjectJsonAdapter;
+import net.minecraft.core.item.IItemConvertible;
+import net.minecraft.core.item.ItemStack;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public final class RecipeBuilder {
+
+    /**
+     * @param modID modId for namespace (or 'minecraft' for vanilla namespace)
+     * @return Returns existing recipeNamespace if it already exists, or creates one and returns it if it does not exist.
+     */
+    @NotNull
+    public static RecipeNamespace getRecipeNamespace(String modID){
+        if (Registries.RECIPES.getItem(modID) != null){
+            return Registries.RECIPES.getItem(modID);
+        }
+        RecipeNamespace modSpace = new RecipeNamespace();
+        Registries.RECIPES.register(modID, modSpace);
+        return Objects.requireNonNull(modSpace);
+    }
+
+    /**
+     * @param modID modId for namespace (or 'minecraft' for vanilla namespace)
+     * @param key recipeGroup key
+     * @param symbol {@link RecipeSymbol} which represents the workstation
+     * @return {@link RecipeGroup} Returns existing RecipeGroup if it already exists, or creates one and returns it if it does not exist.
+     */
+    @NotNull
+    public static RecipeGroup<?> getRecipeGroup(String modID, String key, RecipeSymbol symbol){
+        return getRecipeGroup(getRecipeNamespace(modID), key, symbol);
+    }
+    /**
+     * @param namespace {@link RecipeNamespace} which contains the {@link RecipeGroup}
+     * @param key recipeGroup key
+     * @param symbol {@link RecipeSymbol} which represents the workstation
+     * @return {@link RecipeGroup} Returns existing RecipeGroup if it already exists, or creates one and returns it if it does not exist.
+     */
+    @NotNull
+    public static RecipeGroup<?> getRecipeGroup(RecipeNamespace namespace, String key, RecipeSymbol symbol){
+        if (namespace.getItem(key) != null){
+            return namespace.getItem(key);
+        }
+        RecipeGroup<?> group = new RecipeGroup<>(symbol);
+        namespace.register(key, group);
+        return Objects.requireNonNull(group);
+    }
+
+    /**
+     * Gets or creates a specified ItemGroup. <br></br>
+     *
+     * Example code:
+     * <pre>{@code
+     *     RecipeBuilder.getItemGroup("minecraft", "logs")
+     * }</pre>
+     *
+     * @param modID Mod that owns the ItemGroup (or 'minecraft' for vanilla groups)
+     * @param key Group key
+     * @return Returns the existing ItemGroup if it exists, or create one and return that if it doesn't yet exist.
+     */
+    @NotNull
+    public static List<ItemStack> getItemGroup(String modID, String key){
+        List<ItemStack> group = Registries.ITEM_GROUPS.getItem(String.format("%s:%s", modID, key));
+        if (group == null){
+            group = new ArrayList<>();
+            Registries.ITEM_GROUPS.register(String.format("%s:%s", modID, key), group);
+        }
+        return group;
+    }
+
+    /**
+     * Adds specified items to an ItemGroup. If the group does not exist before the method is called then it will be created. <br></br>
+     *
+     * Example code:
+     * <pre>{@code
+     *     RecipeBuilder.addItemsToGroup("minecraft", "cobblestones",
+     *          Block.cobbleStone,
+     *          Block.cobbleBasalt,
+     *          Block.cobbleLimestone,
+     *          Block.cobbleGranite,
+     *          Block.cobblePermafrost)
+     * }</pre>
+     *
+     * @param modID Mod that owns the ItemGroup (or 'minecraft' for vanilla groups)
+     * @param key Group key
+     * @param items List of only {@link IItemConvertible} (which includes Blocks/Items) and {@link ItemStack}
+     */
+    @SuppressWarnings("unused")
+    public static void addItemsToGroup(String modID, String key, Object ... items ){
+        List<ItemStack> group = getItemGroup(modID, key);
+        for (Object o : items){
+            if (o instanceof IItemConvertible){
+                group.add(((IItemConvertible) o).getDefaultStack());
+                continue;
+            }
+            if (o instanceof ItemStack){
+                group.add((ItemStack) o);
+                continue;
+            }
+            throw new IllegalArgumentException(String.format("Object '%s' has invalid class '%s'! Only classes that extend 'IItemConvertible' or 'ItemStack' are allowed!", o.toString(), o.getClass().getSimpleName()));
+        }
+    }
+
+    /**
+     * Returns a new {@link RecipeBuilderShaped} <br>
+     * Used for creating new shaped workbench recipes.
+     */
+    @SuppressWarnings("unused")
+    public static RecipeBuilderShaped Shaped(String modID){
+        return new RecipeBuilderShaped(modID);
+    }
+
+    /**
+     * Returns a new {@link RecipeBuilderShaped} with its shape set <br>
+     * Used for creating new shaped workbench recipes.
+     */
+    @SuppressWarnings("unused")
+    public static RecipeBuilderShaped Shaped(String modID, String... shape){
+        return new RecipeBuilderShaped(modID, shape);
+    }
+
+    /**
+     * Returns a new {@link RecipeBuilderShapeless} <br>
+     * Used for creating new shapeless workbench recipes
+     */
+    @SuppressWarnings("unused")
+    public static RecipeBuilderShapeless Shapeless(String modID){
+        return new RecipeBuilderShapeless(modID);
+    }
+
+    /**
+     * Returns a new {@link RecipeBuilderFurnace} <br>
+     * Used for creating new furnace recipes.
+     */
+    @SuppressWarnings("unused")
+    public static RecipeBuilderFurnace Furnace(String modID){
+        return new RecipeBuilderFurnace(modID);
+    }
+
+    /**
+     * Returns a new {@link RecipeBuilderBlastFurnace} <br>
+     * Used for creating new blast furnace recipes.
+     */
+    @SuppressWarnings("unused")
+    public static RecipeBuilderBlastFurnace BlastFurnace(String modID){
+        return new RecipeBuilderBlastFurnace(modID);
+    }
+
+    /**
+     * Returns a new {@link RecipeBuilderTrommel} <br>
+     * Used for creating new trommel recipes.
+     */
+    @SuppressWarnings("unused")
+    public static RecipeBuilderTrommel Trommel(String modID){
+        return new RecipeBuilderTrommel(modID);
+    }
+
+    public static boolean isExporting = false;
+
+    /**
+     * Serializes all loaded recipes to json and dumps the output to ".minecraft-bta/recipeDump/recipes.json"
+     */
+    @SuppressWarnings("unchecked")
+    public static void exportRecipes(File output, RecipeGroup<? extends RecipeEntryBase<?, ?, ?>> recipeGroup){
+        isExporting = true;
+        List<? extends RecipeEntryBase<?, ?, ?>> recipesRaw = recipeGroup.getAllRecipes();
+        List<RecipeEntryBase<?, ?, ?>> recipes = new ArrayList<>();
+        GsonBuilder builder = new GsonBuilder();
+        builder.setPrettyPrinting();
+        ArrayList<RecipeJsonAdapter<?>> usedAdapters = new ArrayList<>();
+        for (RecipeEntryBase<?, ?, ?> recipe: recipesRaw) {
+            if (recipe instanceof HasJsonAdapter) {
+                recipes.add(recipe);
+
+                HasJsonAdapter hasJsonAdapter = (HasJsonAdapter) recipe;
+                RecipeJsonAdapter<?> recipeJsonAdapter = hasJsonAdapter.getAdapter();
+                if (usedAdapters.contains(recipeJsonAdapter)) continue;
+                builder.registerTypeAdapter(recipe.getClass(), recipeJsonAdapter);
+                usedAdapters.add(recipeJsonAdapter);
+            }
+        }
+        builder.registerTypeAdapter(ItemStack.class, new ItemStackJsonAdapter());
+        builder.registerTypeAdapter(RecipeSymbol.class, new RecipeSymbolJsonAdapter());
+        builder.registerTypeAdapter(new TypeToken<WeightedRandomBag<WeightedRandomLootObject>>(){}.getType(), new WeightedRandomBagJsonAdapter());
+        builder.registerTypeAdapter(WeightedRandomLootObject.class, new WeightedRandomLootObjectJsonAdapter());
+        Gson gson = builder.create();
+        JsonArray jsonArray = new JsonArray();
+        for (RecipeEntryBase<?, ?, ?> recipeEntryBase : recipes) {
+            TypeAdapter<RecipeEntryBase<?, ?, ?>> typeAdapter = (TypeAdapter<RecipeEntryBase<?, ?, ?>>) gson.getAdapter(recipeEntryBase.getClass());
+            JsonElement json = typeAdapter.toJsonTree(recipeEntryBase);
+            jsonArray.add(json);
+        }
+        if (output.exists()) {
+            output.delete();
+        }
+        File file = FileUtils.createNewFile(output);
+        try (FileWriter fileWriter = new FileWriter(file)){
+            gson.toJson(jsonArray, fileWriter);
+        } catch (IOException iOException) {
+            throw new RuntimeException(iOException);
+        }
+        isExporting = false;
+    }
+}
diff --git a/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderBase.java b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderBase.java
new file mode 100644
index 000000000..af11697fd
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderBase.java
@@ -0,0 +1,33 @@
+package net.minecraft.datagen.recipeBuilders;
+
+import net.minecraft.core.item.ItemStack;
+
+import java.util.Objects;
+
+public abstract class RecipeBuilderBase implements Cloneable {
+    protected String modID;
+    public RecipeBuilderBase(String modID){
+        this.modID = Objects.requireNonNull(modID, "ModID must not be null!");
+    }
+    @SuppressWarnings({"unchecked", "unused"})
+    public <T> T clone(T object){
+        return (T) clone();
+    }
+    @Override
+    public RecipeBuilderBase clone() {
+        try {
+            // none of the fields are mutated so this should be fine
+            return (RecipeBuilderBase) super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new AssertionError();
+        }
+    }
+
+    /**
+     * Creates a new recipe from the provided builder arguments.
+     * @param recipeID Recipe identifier to assign to the created recipe
+     * @param outputStack Result of crafting the specified recipe
+     */
+    @SuppressWarnings({"unused"})
+    protected abstract void create( String recipeID, ItemStack outputStack);
+}
diff --git a/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderBlastFurnace.java b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderBlastFurnace.java
new file mode 100644
index 000000000..1c2682c01
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderBlastFurnace.java
@@ -0,0 +1,25 @@
+package net.minecraft.datagen.recipeBuilders;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryBlastFurnace;
+import net.minecraft.core.item.ItemStack;
+
+public class RecipeBuilderBlastFurnace extends RecipeBuilderFurnace{
+    /**
+     * Used for creating new blast furnace recipes.
+     * @param modID Namespace to create recipe under
+     */
+    public RecipeBuilderBlastFurnace(String modID) {
+        super(modID);
+    }
+    @Override
+    @SuppressWarnings({"unchecked", "unused"})
+    public void create(String recipeID, ItemStack outputStack) {
+        RecipeGroup< RecipeEntryBlastFurnace> group = ((RecipeGroup< RecipeEntryBlastFurnace>) RecipeBuilder.getRecipeGroup(modID, "blast_furnace", new RecipeSymbol(Blocks.FURNACE_BLAST_ACTIVE.getDefaultStack())));
+        if (group.getItem(recipeID) != null) throw new IllegalArgumentException("RecipeID '" + recipeID + "' already exists!");
+        group.register(recipeID, new RecipeEntryBlastFurnace(input, outputStack));
+    }
+}
diff --git a/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderFurnace.java b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderFurnace.java
new file mode 100644
index 000000000..7082f6145
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderFurnace.java
@@ -0,0 +1,83 @@
+package net.minecraft.datagen.recipeBuilders;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryFurnace;
+import net.minecraft.core.item.IItemConvertible;
+import net.minecraft.core.item.ItemStack;
+
+import java.util.Objects;
+
+public class RecipeBuilderFurnace extends RecipeBuilderBase{
+    protected RecipeSymbol input;
+    /**
+     * Used for creating new furnace recipes.
+     * @param modID Namespace to create recipe under
+     */
+    public RecipeBuilderFurnace(String modID) {
+        super(modID);
+    }
+
+    /**
+     * Furnace recipes can only have one input
+     * @param input Input item
+     * @return Copy of {@link RecipeBuilderFurnace}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderFurnace setInput(IItemConvertible input){
+        return setInput(input, 0);
+    }
+
+    /**
+     * Furnace recipes can only have one input
+     * @param input Input item
+     * @param meta Item's required metadata
+     * @return Copy of {@link RecipeBuilderFurnace}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderFurnace setInput(IItemConvertible input, int meta){
+        return setInput(new ItemStack(input, 1, meta));
+    }
+
+    /**
+     * Furnace recipes can only have one input
+     * @param input Input {@link ItemStack}
+     * @return Copy of {@link RecipeBuilderFurnace}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderFurnace setInput(ItemStack input){
+        return setInput(new RecipeSymbol(input));
+    }
+
+    /**
+     * Furnace recipes can only have one input
+     * @param itemGroup Input item group
+     * @return Copy of {@link RecipeBuilderFurnace}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderFurnace setInput(String itemGroup){
+        return setInput(new RecipeSymbol(itemGroup));
+    }
+
+    /**
+     * Furnace recipes can only have one input
+     * @param input {@link RecipeSymbol} Input symbol
+     * @return Copy of {@link RecipeBuilderFurnace}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderFurnace setInput(RecipeSymbol input){
+        RecipeBuilderFurnace builder = this.clone(this);
+        builder.input = Objects.requireNonNull(input, "Input symbol must not be null!");
+        return builder;
+    }
+
+    @Override
+    @SuppressWarnings({"unchecked"})
+    public void create(String recipeID, ItemStack outputStack) {
+        Objects.requireNonNull(input, "Input symbol must not be null!");
+        RecipeGroup<RecipeEntryFurnace> group = ((RecipeGroup<RecipeEntryFurnace>) RecipeBuilder.getRecipeGroup(modID, "furnace", new RecipeSymbol(Blocks.FURNACE_STONE_ACTIVE.getDefaultStack())));
+        if (group.getItem(recipeID) != null) throw new IllegalArgumentException("RecipeID '" + recipeID + "' already exists!");
+        group.register(recipeID, new RecipeEntryFurnace(input, outputStack));
+    }
+}
diff --git a/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderShaped.java b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderShaped.java
new file mode 100644
index 000000000..9765b4c1b
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderShaped.java
@@ -0,0 +1,221 @@
+package net.minecraft.datagen.recipeBuilders;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCrafting;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped;
+import net.minecraft.core.item.IItemConvertible;
+import net.minecraft.core.item.ItemStack;
+
+import java.util.Arrays;
+import java.util.HashMap;
+
+import static net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped.DEFAULT_ALLOW_MIRROR;
+import static net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped.DEFAULT_CONSUME_CONTAINER;
+
+public class RecipeBuilderShaped extends RecipeBuilderBase{
+    protected String[] shape;
+    protected int width;
+    protected int height;
+    protected boolean consumeContainer = DEFAULT_CONSUME_CONTAINER;
+    protected boolean allowMirrored = DEFAULT_ALLOW_MIRROR;
+    protected final HashMap<Character, RecipeSymbol> symbolShapedMap = new HashMap<>();
+    /**
+     * Used for creating new shaped workbench recipes.
+     * @param modID Namespace to create recipe under
+     */
+    public RecipeBuilderShaped(String modID){
+        super(modID);
+    }
+    /**
+     * Used for creating new shaped workbench recipes.
+     * @param modID Namespace to create recipe under
+     * @param shape Recipe shape in symbol representation
+     */
+    public RecipeBuilderShaped(String modID, String... shape) {
+        super(modID);
+        setShapeLocal(shape);
+    }
+
+    /**
+     * Sets the shape of the recipe
+     * Example code:
+     * <pre>{@code
+     *     RecipeBuilderShaped("minecraft")
+     *       .setShape(
+     *          "PPP",
+     *          "P P",
+     *          "PPP")
+     *       .addInput('P', Block.planksOak)
+     *       .create("chest_planks_oak", Block.chestPlanksOak.getDefaultStack());
+     * }</pre>
+     * @param shapeTemplate Recipe shape in symbol representation
+     * @return Copy of {@link RecipeBuilderShaped}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShaped setShape(String... shapeTemplate){
+        RecipeBuilderShaped builder = this.clone(this);
+        builder.setShapeLocal(shapeTemplate);
+        return builder;
+    }
+    protected void setShapeLocal(String... shape){
+        if (shape == null){
+            throw new IllegalArgumentException("Shape Template cannot be set to null!");
+        }
+        if (shape.length == 0){
+            throw new IllegalArgumentException("Shape Template cannot have a size of 0!");
+        }
+        if (shape.length > 3){
+            throw new IllegalArgumentException("Shape Template height cannot exceed 3!\n" + Arrays.toString(shape));
+        }
+        if (shape[0].length() > 3){
+            throw new IllegalArgumentException("Shape Template width cannot exceed 3!\n" + Arrays.toString(shape));
+        }
+        this.height = shape.length;
+        this.width = shape[0].length();
+
+        // Gets the max width
+        for (int y = 0; y < this.height; y++) {
+            this.width = Math.max(this.width, shape[y].length());
+        }
+
+        // Ensures that the recipe shape is always square
+        String[] internalShape = new String[height];
+        for (int y = 0; y < internalShape.length; y++) {
+            StringBuilder builder = new StringBuilder();
+            String row = shape[y];
+            for (int x = 0; x < width; x++) {
+                if (x >= row.length()){
+                    builder.append(" ");
+                } else {
+                    builder.append(row.charAt(x));
+                }
+            }
+            internalShape[y] = builder.toString();
+        }
+
+        this.shape = internalShape;
+    }
+
+    /**
+     * Specifies whether the recipe should consume container items.
+     * <pre>{@code
+     *     RecipeBuilderShaped("minecraft")
+     *       .setShape(
+     *          "BBB",
+     *          "SES",
+     *          "WWW")
+     *       .addInput('B', Item.bucketMilk)
+     *       .addInput('S', Item.dustSugar)
+     *       .addInput('E', Item.eggChicken)
+     *       .addInput('W', Item.wheat)
+     *       .setConsumeContainer(false) // Recipe will return empty buckets when crafted
+     *       .create("cake", Item.cake.getDefaultStack());
+     * }</pre>
+     * @param consumeContainer Should consume ContainerItem
+     * @return Copy of {@link RecipeBuilderShaped}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShaped setConsumeContainer(boolean consumeContainer){
+        RecipeBuilderShaped builder = this.clone(this);
+        builder.consumeContainer = consumeContainer;
+        return builder;
+    }
+
+    public RecipeBuilderShaped setAllowMirrored(boolean allowMirrored) {
+        RecipeBuilderShaped builder = this.clone(this);
+        builder.allowMirrored = allowMirrored;
+        return builder;
+    }
+
+    /**
+     * Assigns an item to an item symbol defined in the shape (see {@link #setShape(String...)})
+     * @param templateSymbol Item symbol character
+     * @param stack Stack to assign
+     * @return Copy of {@link RecipeBuilderShaped}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShaped addInput(char templateSymbol, IItemConvertible stack){
+        return addInput(templateSymbol, stack, 0);
+    }
+
+    /**
+     * Assigns an item to an item symbol defined in the shape (see {@link #setShape(String...)})
+     * @param templateSymbol Item symbol character
+     * @param stack Stack to assign
+     * @return Copy of {@link RecipeBuilderShaped}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShaped addInput(char templateSymbol, IItemConvertible stack, int meta){
+        ItemStack _stack = stack.getDefaultStack();
+        _stack.setMetadata(meta);
+        return addInput(templateSymbol, _stack);
+    }
+
+    /**
+     * Assigns an item to an item symbol defined in the shape (see {@link #setShape(String...)})
+     * @param templateSymbol Item symbol character
+     * @param stack Stack to assign
+     * @return Copy of {@link RecipeBuilderShaped}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShaped addInput(char templateSymbol, ItemStack stack){
+        return addInput(templateSymbol, new RecipeSymbol(stack));
+    }
+
+    /**
+     * Assigns an itemGroup to an item symbol defined in the shape (see {@link #setShape(String...)})
+     * @param templateSymbol Item symbol character
+     * @param itemGroup ItemGroup key to assign
+     * @return Copy of {@link RecipeBuilderShaped}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShaped addInput(char templateSymbol, String itemGroup) {
+        return addInput(templateSymbol, new RecipeSymbol(itemGroup));
+    }
+
+    /**
+     * Assigns an item to an item symbol defined in the shape (see {@link #setShape(String...)})
+     * @param templateSymbol Item symbol character
+     * @param symbol {@link RecipeSymbol} to assign
+     * @return Copy of {@link RecipeBuilderShaped}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShaped addInput(char templateSymbol, RecipeSymbol symbol){
+        if (templateSymbol == ' ') throw new IllegalArgumentException("Cannot assign item to protected symbol ' ' pick a different symbol for your recipe input");
+        RecipeBuilderShaped builder = this.clone(this);
+        symbolShapedMap.put(templateSymbol, symbol);
+        return builder;
+    }
+
+    @SuppressWarnings({"unchecked", "unused"})
+    public void create(String recipeID, ItemStack outputStack) {
+        if (shape == null) throw new RuntimeException("Shaped recipe: " + recipeID + " attempted to build without a assigned shape!!");
+        RecipeSymbol[] recipe = new RecipeSymbol[height * width];
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                Character cha = null;
+                if (shape[y].length() > x) {
+                    cha = shape[y].charAt(x);
+                }
+                RecipeSymbol tempplate = symbolShapedMap.get(cha);
+                if (tempplate == null){
+                    recipe[x + y * width] = null;
+                } else {
+                    if(tempplate.getItemGroup() == null){
+                        RecipeSymbol s =  new RecipeSymbol(cha == null ? ' ' : cha, tempplate.getStack());
+                        recipe[x + y * width] = s;
+                    } else {
+                        recipe[x + y * width] = new RecipeSymbol(cha == null ? ' ' : cha, tempplate.getStack(), tempplate.getItemGroup());
+                    }
+
+                }
+
+            }
+        }
+        RecipeGroup<RecipeEntryCrafting<?, ?>> group = ((RecipeGroup<RecipeEntryCrafting<?, ?>>) RecipeBuilder.getRecipeGroup(modID, "workbench", new RecipeSymbol(Blocks.WORKBENCH.getDefaultStack())));
+        if (group.getItem(recipeID) != null) throw new IllegalArgumentException("RecipeID '" + recipeID + "' already exists!");
+        group.register(recipeID, new RecipeEntryCraftingShaped(width, height, recipe, outputStack, consumeContainer, allowMirrored));
+    }
+}
diff --git a/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderShapeless.java b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderShapeless.java
new file mode 100644
index 000000000..c9c644c2f
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderShapeless.java
@@ -0,0 +1,80 @@
+package net.minecraft.datagen.recipeBuilders;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCrafting;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShapeless;
+import net.minecraft.core.item.IItemConvertible;
+import net.minecraft.core.item.ItemStack;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RecipeBuilderShapeless extends RecipeBuilderBase{
+    private final List<RecipeSymbol> symbolShapelessList = new ArrayList<>();
+    /**
+     * Used for creating new shapeless workbench recipes.
+     * @param modID Namespace to create recipe under
+     */
+    public RecipeBuilderShapeless(String modID) {
+        super(modID);
+    }
+
+    /**
+     * @param stack Item to add to recipe's item list
+     * @return Copy of {@link RecipeBuilderShapeless}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShapeless addInput(IItemConvertible stack){
+        return addInput(stack, 0);
+    }
+
+    /**
+     * @param stack Item to add to recipe's item list
+     * @param meta Required meta of the item
+     * @return Copy of {@link RecipeBuilderShapeless}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShapeless addInput(IItemConvertible stack, int meta){
+        ItemStack _stack = stack.getDefaultStack();
+        _stack.setMetadata(meta);
+        return addInput(_stack);
+    }
+
+    /**
+     * @param itemGroup ItemGroup to add to recipe's item list
+     * @return Copy of {@link RecipeBuilderShapeless}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShapeless addInput(String itemGroup){
+        return addInput(new RecipeSymbol(itemGroup));
+    }
+
+    /**
+     * @param stack Item to add to recipe's item list
+     * @return Copy of {@link RecipeBuilderShapeless}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShapeless addInput(ItemStack stack){
+        return addInput(new RecipeSymbol(stack));
+    }
+
+    /**
+     * @param symbol {@link RecipeSymbol} to add to recipe's item list
+     * @return Copy of {@link RecipeBuilderShapeless}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderShapeless addInput(RecipeSymbol symbol){
+        RecipeBuilderShapeless builder = this.clone(this);
+        symbolShapelessList.add(symbol);
+        return builder;
+    }
+    @Override
+    @SuppressWarnings({"unused", "unchecked"})
+    public void create(String recipeID, ItemStack outputStack) {
+        RecipeGroup<RecipeEntryCrafting<?, ?>> group = ((RecipeGroup<RecipeEntryCrafting<?, ?>>) RecipeBuilder.getRecipeGroup(modID, "workbench", new RecipeSymbol(Blocks.WORKBENCH.getDefaultStack())));
+        if (group.getItem(recipeID) != null) throw new IllegalArgumentException("RecipeID '" + recipeID + "' already exists!");
+        group.register(recipeID, new RecipeEntryCraftingShapeless(symbolShapelessList, outputStack));
+    }
+}
diff --git a/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderTrommel.java b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderTrommel.java
new file mode 100644
index 000000000..c0dffa1f1
--- /dev/null
+++ b/src/main/java/net/minecraft/datagen/recipeBuilders/RecipeBuilderTrommel.java
@@ -0,0 +1,119 @@
+package net.minecraft.datagen.recipeBuilders;
+
+import net.minecraft.core.WeightedRandomBag;
+import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.recipe.RecipeGroup;
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryTrommel;
+import net.minecraft.core.item.IItemConvertible;
+import net.minecraft.core.item.ItemStack;
+
+import java.util.Objects;
+
+public class RecipeBuilderTrommel extends RecipeBuilderBase{
+    protected RecipeSymbol input;
+    protected WeightedRandomBag<WeightedRandomLootObject> bag = new WeightedRandomBag<>();
+    /**
+     * Used for creating new trommel recipes.
+     * @param modID Namespace to create recipe under
+     */
+    public RecipeBuilderTrommel(String modID) {
+        super(modID);
+    }
+
+    /**
+     * Trommel recipes can only have one input
+     * @param item Input item
+     * @return Copy of {@link RecipeBuilderTrommel}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderTrommel setInput(IItemConvertible item){
+        return setInput(item, 0);
+    }
+
+    /**
+     * Trommel recipes can only have one input
+     * @param item Input item
+     * @param meta Required metadata of input item
+     * @return Copy of {@link RecipeBuilderTrommel}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderTrommel setInput(IItemConvertible item, int meta){
+        return setInput(new ItemStack(item, 1, meta));
+    }
+
+    /**
+     * Trommel recipes can only have one input
+     * @param input Input {@link ItemStack}
+     * @return Copy of {@link RecipeBuilderTrommel}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderTrommel setInput(ItemStack input){
+        return setInput(new RecipeSymbol(input));
+    }
+
+    /**
+     * Trommel recipes can only have one input
+     * @param itemGroup Input itemGroup
+     * @return Copy of {@link RecipeBuilderTrommel}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderTrommel setInput(String itemGroup){
+        return setInput(new RecipeSymbol(itemGroup));
+    }
+
+    /**
+     * Trommel recipes can only have one input
+     * @param input Input {@link RecipeSymbol}
+     * @return Copy of {@link RecipeBuilderTrommel}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderTrommel setInput(RecipeSymbol input){
+        RecipeBuilderTrommel builder = this.clone(this);
+        builder.input = Objects.requireNonNull(input, "Input symbol must not be null!");
+        return builder;
+    }
+
+    /**
+     * Adds a potential output entry for the recipe
+     * <pre>{@code
+     *     RecipeBuilderTrommel("minecraft")
+     *          .setInput("minecraft:dirt")
+     *          .addEntry(new WeightedRandomLootObject(Item.ammoPebble.getDefaultStack(), 1, 3), 60.24)
+     *          .addEntry(new WeightedRandomLootObject(Item.clay.getDefaultStack()), 24.1)
+     *          .addEntry(new WeightedRandomLootObject(Item.flint.getDefaultStack()), 12.05)
+     *          .addEntry(new WeightedRandomLootObject(Item.sulphur.getDefaultStack()), 2.41)
+     *          .addEntry(new WeightedRandomLootObject(Item.oreRawIron.getDefaultStack()), 0.6)
+     *          .addEntry(new WeightedRandomLootObject(Item.olivine.getDefaultStack()), 0.3)
+     *          .addEntry(new WeightedRandomLootObject(Item.quartz.getDefaultStack()), 0.3)
+     *          .create("dirt");
+     * }</pre>
+     * @param lootObject {@link WeightedRandomLootObject} provides possible outs
+     * @param weight Comparative probability that this loot object will be selected, higher weights means more likely
+     * @return Copy of {@link RecipeBuilderTrommel}
+     */
+    @SuppressWarnings({"unused"})
+    public RecipeBuilderTrommel addEntry(WeightedRandomLootObject lootObject, double weight){
+        RecipeBuilderTrommel builder = this.clone(this);
+        builder.bag.addEntry(lootObject, weight);
+        return builder;
+    }
+
+    /**
+     * Creates a new recipe from the provided builder arguments.
+     * @param recipeID Recipe identifier to assign to the created recipe
+     */
+    @SuppressWarnings({"unused", "unchecked"})
+    public void create(String recipeID) {
+        Objects.requireNonNull(input, "Input symbol must not be null!");
+        Objects.requireNonNull(bag, "Weighted Bag must not be null!");
+        RecipeGroup<RecipeEntryTrommel> group = ((RecipeGroup<RecipeEntryTrommel>) RecipeBuilder.getRecipeGroup(modID, "trommel", new RecipeSymbol(Blocks.TROMMEL_ACTIVE.getDefaultStack())));
+        if (group.getItem(recipeID) != null) throw new IllegalArgumentException("RecipeID '" + recipeID + "' already exists!");
+        group.register(recipeID, new RecipeEntryTrommel(input, bag));
+    }
+    @Override
+    protected void create(String recipeID, ItemStack outputStack) {
+        // Standard create method doesn't apply to this class
+    }
+}
