--- a/net/minecraft/item/BucketItem.java
+++ b/net/minecraft/item/BucketItem.java
@@ -32,14 +32,28 @@
 public class BucketItem extends Item {
    private final Fluid field_77876_a;
 
+   // Forge: Use the other constructor that takes a Supplier
+   @Deprecated
    public BucketItem(Fluid p_i49025_1_, Item.Properties p_i49025_2_) {
       super(p_i49025_2_);
       this.field_77876_a = p_i49025_1_;
+      this.fluidSupplier = p_i49025_1_.delegate;
    }
 
+   /**
+    * @param supplier A fluid supplier such as {@link net.minecraftforge.fml.RegistryObject<Fluid>}
+    */
+   public BucketItem(java.util.function.Supplier<? extends Fluid> supplier, Item.Properties builder) {
+      super(builder);
+      this.field_77876_a = null;
+      this.fluidSupplier = supplier;
+   }
+
    public ActionResult<ItemStack> func_77659_a(World p_77659_1_, PlayerEntity p_77659_2_, Hand p_77659_3_) {
       ItemStack itemstack = p_77659_2_.func_184586_b(p_77659_3_);
       RayTraceResult raytraceresult = func_219968_a(p_77659_1_, p_77659_2_, this.field_77876_a == Fluids.field_204541_a ? RayTraceContext.FluidMode.SOURCE_ONLY : RayTraceContext.FluidMode.NONE);
+      ActionResult<ItemStack> ret = net.minecraftforge.event.ForgeEventFactory.onBucketUse(p_77659_2_, p_77659_1_, itemstack, raytraceresult);
+      if (ret != null) return ret;
       if (raytraceresult.func_216346_c() == RayTraceResult.Type.MISS) {
          return ActionResult.func_226250_c_(itemstack);
       } else if (raytraceresult.func_216346_c() != RayTraceResult.Type.BLOCK) {
@@ -56,7 +70,10 @@
                   Fluid fluid = ((IBucketPickupHandler)blockstate1.func_177230_c()).func_204508_a(p_77659_1_, blockpos, blockstate1);
                   if (fluid != Fluids.field_204541_a) {
                      p_77659_2_.func_71029_a(Stats.field_75929_E.func_199076_b(this));
-                     p_77659_2_.func_184185_a(fluid.func_207185_a(FluidTags.field_206960_b) ? SoundEvents.field_187633_N : SoundEvents.field_187630_M, 1.0F, 1.0F);
+
+                     SoundEvent soundevent = this.field_77876_a.getAttributes().getEmptySound();
+                     if (soundevent == null) soundevent = fluid.func_207185_a(FluidTags.field_206960_b) ? SoundEvents.field_187633_N : SoundEvents.field_187630_M;
+                     p_77659_2_.func_184185_a(soundevent, 1.0F, 1.0F);
                      ItemStack itemstack1 = DrinkHelper.func_241445_a_(itemstack, p_77659_2_, new ItemStack(fluid.func_204524_b()));
                      if (!p_77659_1_.field_72995_K) {
                         CriteriaTriggers.field_204813_j.func_204817_a((ServerPlayerEntity)p_77659_2_, new ItemStack(fluid.func_204524_b()));
@@ -69,7 +86,7 @@
                return ActionResult.func_226251_d_(itemstack);
             } else {
                BlockState blockstate = p_77659_1_.func_180495_p(blockpos);
-               BlockPos blockpos2 = blockstate.func_177230_c() instanceof ILiquidContainer && this.field_77876_a == Fluids.field_204546_a ? blockpos : blockpos1;
+               BlockPos blockpos2 = canBlockContainFluid(p_77659_1_, blockpos, blockstate) ? blockpos : blockpos1;
                if (this.func_180616_a(p_77659_2_, p_77659_1_, blockpos2, blockraytraceresult)) {
                   this.func_203792_a(p_77659_1_, itemstack, blockpos2);
                   if (p_77659_2_ instanceof ServerPlayerEntity) {
@@ -117,7 +134,7 @@
             }
 
             return true;
-         } else if (block instanceof ILiquidContainer && this.field_77876_a == Fluids.field_204546_a) {
+         } else if (block instanceof ILiquidContainer && ((ILiquidContainer)block).func_204510_a(p_180616_2_,p_180616_3_,blockstate,field_77876_a)) {
             ((ILiquidContainer)block).func_204509_a(p_180616_2_, p_180616_3_, blockstate, ((FlowingFluid)this.field_77876_a).func_207204_a(false));
             this.func_203791_b(p_180616_1_, p_180616_2_, p_180616_3_);
             return true;
@@ -137,7 +154,24 @@
    }
 
    protected void func_203791_b(@Nullable PlayerEntity p_203791_1_, IWorld p_203791_2_, BlockPos p_203791_3_) {
-      SoundEvent soundevent = this.field_77876_a.func_207185_a(FluidTags.field_206960_b) ? SoundEvents.field_187627_L : SoundEvents.field_187624_K;
+      SoundEvent soundevent = this.field_77876_a.getAttributes().getEmptySound();
+      if(soundevent == null) soundevent = this.field_77876_a.func_207185_a(FluidTags.field_206960_b) ? SoundEvents.field_187627_L : SoundEvents.field_187624_K;
       p_203791_2_.func_184133_a(p_203791_1_, p_203791_3_, soundevent, SoundCategory.BLOCKS, 1.0F, 1.0F);
    }
+
+   @Override
+   public net.minecraftforge.common.capabilities.ICapabilityProvider initCapabilities(ItemStack stack, @Nullable net.minecraft.nbt.CompoundNBT nbt) {
+      if (this.getClass() == BucketItem.class)
+         return new net.minecraftforge.fluids.capability.wrappers.FluidBucketWrapper(stack);
+      else
+         return super.initCapabilities(stack, nbt);
+   }
+
+   private final java.util.function.Supplier<? extends Fluid> fluidSupplier;
+   public Fluid getFluid() { return fluidSupplier.get(); }
+
+   private boolean canBlockContainFluid(World worldIn, BlockPos posIn, BlockState blockstate)
+   {
+      return blockstate.func_177230_c() instanceof ILiquidContainer && ((ILiquidContainer)blockstate.func_177230_c()).func_204510_a(worldIn, posIn, blockstate, this.field_77876_a);
+   }
 }
