--- a/net/minecraft/world/inventory/BrewingStandMenu.java
+++ b/net/minecraft/world/inventory/BrewingStandMenu.java
@@ -33,29 +_,50 @@
     private final Container brewingStand;
     public final ContainerData brewingStandData;
     private final Slot ingredientSlot;
+    // CraftBukkit start
+    private @javax.annotation.Nullable org.bukkit.craftbukkit.inventory.view.CraftBrewingStandView view = null;
+    private final Inventory inventory;
+    // CraftBukkit end
 
     public BrewingStandMenu(int containerId, Inventory playerInventory) {
-        this(containerId, playerInventory, new SimpleContainer(5), new SimpleContainerData(2));
+        this(containerId, playerInventory, new SimpleContainer(5), new io.papermc.paper.inventory.BrewingSimpleContainerData()); // Paper - Add totalBrewTime
     }
 
     public BrewingStandMenu(int containerId, Inventory playerInventory, Container brewingStandContainer, ContainerData brewingStandData) {
         super(MenuType.BREWING_STAND, containerId);
+        this.inventory = playerInventory; // CraftBukkit
         checkContainerSize(brewingStandContainer, 5);
-        checkContainerDataCount(brewingStandData, 2);
+        checkContainerDataCount(brewingStandData, 3); // Paper - Add recipeBrewTime
         this.brewingStand = brewingStandContainer;
         this.brewingStandData = brewingStandData;
         PotionBrewing potionBrewing = playerInventory.player.level().potionBrewing();
-        this.addSlot(new BrewingStandMenu.PotionSlot(brewingStandContainer, 0, 56, 51));
-        this.addSlot(new BrewingStandMenu.PotionSlot(brewingStandContainer, 1, 79, 58));
-        this.addSlot(new BrewingStandMenu.PotionSlot(brewingStandContainer, 2, 102, 51));
+        // Paper start - custom potion mixes
+        this.addSlot(new BrewingStandMenu.PotionSlot(brewingStandContainer, 0, 56, 51, potionBrewing));
+        this.addSlot(new BrewingStandMenu.PotionSlot(brewingStandContainer, 1, 79, 58, potionBrewing));
+        this.addSlot(new BrewingStandMenu.PotionSlot(brewingStandContainer, 2, 102, 51, potionBrewing));
+        // Paper end - custom potion mixes
         this.ingredientSlot = this.addSlot(new BrewingStandMenu.IngredientsSlot(potionBrewing, brewingStandContainer, 3, 79, 17));
         this.addSlot(new BrewingStandMenu.FuelSlot(brewingStandContainer, 4, 17, 17));
-        this.addDataSlots(brewingStandData);
+        // Paper start - Add recipeBrewTime
+        this.addDataSlots(new SimpleContainerData(2) {
+            @Override
+            public int get(final int index) {
+                if (index == 0) return 400 * brewingStandData.get(index) / brewingStandData.get(2);
+                return brewingStandData.get(index);
+            }
+
+            @Override
+            public void set(final int index, final int value) {
+                brewingStandData.set(index, value);
+            }
+        });
+        // Paper end - Add recipeBrewTime
         this.addStandardInventorySlots(playerInventory, 8, 84);
     }
 
     @Override
     public boolean stillValid(Player player) {
+        if (!this.checkReachable) return true; // CraftBukkit
         return this.brewingStand.stillValid(player);
     }
 
@@ -75,7 +_,7 @@
                     if (!this.moveItemStackTo(item, 3, 4, false)) {
                         return ItemStack.EMPTY;
                     }
-                } else if (BrewingStandMenu.PotionSlot.mayPlaceItem(itemStack)) {
+                } else if (BrewingStandMenu.PotionSlot.mayPlaceItem(itemStack, this.inventory.player.level().potionBrewing())) { // Paper - custom potion mixes
                     if (!this.moveItemStackTo(item, 0, 3, false)) {
                         return ItemStack.EMPTY;
                     }
@@ -157,13 +_,15 @@
     }
 
     static class PotionSlot extends Slot {
-        public PotionSlot(Container container, int slot, int x, int y) {
+        private final PotionBrewing potionBrewing; // Paper - custom potion mixes
+        public PotionSlot(Container container, int slot, int x, int y, PotionBrewing potionBrewing) { // Paper - custom potion mixes
             super(container, slot, x, y);
+            this.potionBrewing = potionBrewing; // Paper - custom potion mixes
         }
 
         @Override
         public boolean mayPlace(ItemStack stack) {
-            return mayPlaceItem(stack);
+            return mayPlaceItem(stack, this.potionBrewing); // Paper - custom potion mixes
         }
 
         @Override
@@ -181,8 +_,8 @@
             super.onTake(player, stack);
         }
 
-        public static boolean mayPlaceItem(ItemStack stack) {
-            return stack.is(Items.POTION) || stack.is(Items.SPLASH_POTION) || stack.is(Items.LINGERING_POTION) || stack.is(Items.GLASS_BOTTLE);
+        public static boolean mayPlaceItem(ItemStack stack, PotionBrewing potionBrewing) { // Paper - custom potion mixes
+            return stack.is(Items.POTION) || stack.is(Items.SPLASH_POTION) || stack.is(Items.LINGERING_POTION) || stack.is(Items.GLASS_BOTTLE) || potionBrewing.isCustomInput(stack); // Paper - Custom Potion Mixes
         }
 
         @Override
@@ -190,4 +_,16 @@
             return BrewingStandMenu.EMPTY_SLOT_POTION;
         }
     }
+    // CraftBukkit start
+    @Override
+    public org.bukkit.craftbukkit.inventory.view.CraftBrewingStandView getBukkitView() {
+        if (this.view != null) {
+            return this.view;
+        }
+
+        org.bukkit.craftbukkit.inventory.CraftInventoryBrewer inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryBrewer(this.brewingStand);
+        this.view = new org.bukkit.craftbukkit.inventory.view.CraftBrewingStandView(this.inventory.player.getBukkitEntity(), inventory, this);
+        return this.view;
+    }
+    // CraftBukkit end
 }
