--- a/net/minecraft/world/inventory/ContainerWorkbench.java
+++ b/net/minecraft/world/inventory/ContainerWorkbench.java
@@ -16,6 +16,11 @@
 import net.minecraft.world.item.crafting.Recipes;
 import net.minecraft.world.level.block.Blocks;
 
+// CraftBukkit start
+import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting;
+import org.bukkit.craftbukkit.inventory.CraftInventoryView;
+// CraftBukkit end
+
 public class ContainerWorkbench extends AbstractCraftingMenu {
 
     private static final int CRAFTING_GRID_WIDTH = 3;
@@ -31,13 +36,16 @@
     public final ContainerAccess access;
     private final EntityHuman player;
     private boolean placingRecipe;
+    // CraftBukkit start
+    private CraftInventoryView bukkitEntity = null;
+    // CraftBukkit end
 
     public ContainerWorkbench(int i, PlayerInventory playerinventory) {
         this(i, playerinventory, ContainerAccess.NULL);
     }
 
     public ContainerWorkbench(int i, PlayerInventory playerinventory, ContainerAccess containeraccess) {
-        super(Containers.CRAFTING, i, 3, 3);
+        super(Containers.CRAFTING, i, 3, 3, playerinventory); // CraftBukkit - pass player
         this.access = containeraccess;
         this.player = playerinventory.player;
         this.addResultSlot(this.player, 124, 35);
@@ -50,6 +58,7 @@
         EntityPlayer entityplayer = (EntityPlayer) entityhuman;
         ItemStack itemstack = ItemStack.EMPTY;
         Optional<RecipeHolder<RecipeCrafting>> optional = worldserver.getServer().getRecipeManager().getRecipeFor(Recipes.CRAFTING, craftinginput, worldserver, recipeholder);
+        inventorycrafting.setCurrentRecipe(optional.orElse(null)); // CraftBukkit
 
         if (optional.isPresent()) {
             RecipeHolder<RecipeCrafting> recipeholder1 = (RecipeHolder) optional.get();
@@ -63,6 +72,7 @@
                 }
             }
         }
+        itemstack = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, inventorycraftresult, itemstack, container.getBukkitView(), optional); // CraftBukkit
 
         inventorycraftresult.setItem(0, itemstack);
         container.setRemoteSlot(0, itemstack);
@@ -103,6 +113,7 @@
 
     @Override
     public boolean stillValid(EntityHuman entityhuman) {
+        if (!this.checkReachable) return true; // CraftBukkit
         return stillValid(this.access, entityhuman, Blocks.CRAFTING_TABLE);
     }
 
@@ -181,4 +192,17 @@
     protected EntityHuman owner() {
         return this.player;
     }
+
+    // CraftBukkit start
+    @Override
+    public CraftInventoryView getBukkitView() {
+        if (bukkitEntity != null) {
+            return bukkitEntity;
+        }
+
+        CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftSlots, this.resultSlots);
+        bukkitEntity = new CraftInventoryView(this.player.getBukkitEntity(), inventory, this);
+        return bukkitEntity;
+    }
+    // CraftBukkit end
 }
