--- ../src-base/minecraft/net/minecraft/item/ItemBucket.java
+++ ../src-work/minecraft/net/minecraft/item/ItemBucket.java
@@ -12,6 +12,13 @@
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.event.entity.player.FillBucketEvent;
 
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.event.player.PlayerBucketEmptyEvent;
+import org.bukkit.event.player.PlayerBucketFillEvent;
+// CraftBukkit end
+
 public class ItemBucket extends Item
 {
     private Block isFull;
@@ -83,23 +90,52 @@
 
                     if (material == Material.water && l == 0)
                     {
+                        // CraftBukkit start
+                        PlayerBucketFillEvent cbEvent = CraftEventFactory.callPlayerBucketFillEvent(p_77659_3_, i, j, k, -1, p_77659_1_, Items.water_bucket);
+
+                        if (cbEvent.isCancelled())
+                        {
+                            return p_77659_1_;
+                        }
+
+                        // CraftBukkit end
                         p_77659_2_.setBlockToAir(i, j, k);
-                        return this.func_150910_a(p_77659_1_, p_77659_3_, Items.water_bucket);
+                        return this.func_150910_a(p_77659_1_, p_77659_3_, Items.water_bucket, cbEvent.getItemStack()); // CraftBukkit - added Event stack
                     }
 
                     if (material == Material.lava && l == 0)
                     {
+                        // CraftBukkit start
+                        PlayerBucketFillEvent cbEvent = CraftEventFactory.callPlayerBucketFillEvent(p_77659_3_, i, j, k, -1, p_77659_1_, Items.lava_bucket);
+
+                        if (cbEvent.isCancelled())
+                        {
+                            return p_77659_1_;
+                        }
+
+                        // CraftBukkit end
                         p_77659_2_.setBlockToAir(i, j, k);
-                        return this.func_150910_a(p_77659_1_, p_77659_3_, Items.lava_bucket);
+                        return this.func_150910_a(p_77659_1_, p_77659_3_, Items.lava_bucket, cbEvent.getItemStack()); // CraftBukkit - added Event stack
                     }
                 }
                 else
                 {
                     if (this.isFull == Blocks.air)
                     {
-                        return new ItemStack(Items.bucket);
+                        // CraftBukkit start
+                        PlayerBucketEmptyEvent cbEvent = CraftEventFactory.callPlayerBucketEmptyEvent(p_77659_3_, i, j, k, movingobjectposition.sideHit, p_77659_1_);
+
+                        if (cbEvent.isCancelled())
+                        {
+                            return p_77659_1_;
+                        }
+
+                        return CraftItemStack.asNMSCopy(cbEvent.getItemStack());
                     }
 
+                    int clickedX = i, clickedY = j, clickedZ = k;
+                    // CraftBukkit end
+
                     if (movingobjectposition.sideHit == 0)
                     {
                         --j;
@@ -135,9 +171,19 @@
                         return p_77659_1_;
                     }
 
+                    // CraftBukkit start
+                    PlayerBucketEmptyEvent cbEvent = CraftEventFactory.callPlayerBucketEmptyEvent(p_77659_3_, clickedX, clickedY, clickedZ, movingobjectposition.sideHit, p_77659_1_);
+
+                    if (cbEvent.isCancelled())
+                    {
+                        return p_77659_1_;
+                    }
+
+                    // CraftBukkit end
+
                     if (this.tryPlaceContainedLiquid(p_77659_2_, i, j, k) && !p_77659_3_.capabilities.isCreativeMode)
                     {
-                        return new ItemStack(Items.bucket);
+                        return CraftItemStack.asNMSCopy(cbEvent.getItemStack()); // CraftBukkit
                     }
                 }
             }
@@ -146,24 +192,32 @@
         }
     }
 
+    // Cauldron start - vanilla compatibility
     private ItemStack func_150910_a(ItemStack p_150910_1_, EntityPlayer p_150910_2_, Item p_150910_3_)
     {
-        if (p_150910_2_.capabilities.isCreativeMode)
+        return this.func_150910_a(p_150910_1_, p_150910_2_, p_150910_3_, null);
+    }
+    // Cauldron end
+
+    // CraftBukkit - added ob.ItemStack result - TODO: Is this... the right way to handle this?
+    private ItemStack func_150910_a(ItemStack itemstack, EntityPlayer entityplayer, Item item, org.bukkit.inventory.ItemStack result)
+    {
+        if (entityplayer.capabilities.isCreativeMode)
         {
-            return p_150910_1_;
+            return itemstack;
         }
-        else if (--p_150910_1_.stackSize <= 0)
+        else if (--itemstack.stackSize <= 0)
         {
-            return new ItemStack(p_150910_3_);
+            return CraftItemStack.asNMSCopy(result); // CraftBukkit
         }
         else
         {
-            if (!p_150910_2_.inventory.addItemStackToInventory(new ItemStack(p_150910_3_)))
+            if (!entityplayer.inventory.addItemStackToInventory(CraftItemStack.asNMSCopy(result)))   // CraftBukkit
             {
-                p_150910_2_.dropPlayerItemWithRandomChoice(new ItemStack(p_150910_3_, 1, 0), false);
+                entityplayer.dropPlayerItemWithRandomChoice(CraftItemStack.asNMSCopy(result), false); // CraftBukkit
             }
 
-            return p_150910_1_;
+            return itemstack;
         }
     }