--- a/net/minecraft/block/FlowingFluidBlock.java
+++ b/net/minecraft/block/FlowingFluidBlock.java
@@ -31,10 +31,11 @@
 
 public class FlowingFluidBlock extends Block implements IBucketPickupHandler {
    public static final IntegerProperty field_176367_b = BlockStateProperties.field_208132_ag;
-   protected final FlowingFluid field_204517_c;
+   private final FlowingFluid field_204517_c;
    private final List<FluidState> field_212565_c;
    public static final VoxelShape field_235510_c_ = Block.func_208617_a(0.0D, 0.0D, 0.0D, 16.0D, 8.0D, 16.0D);
 
+   @Deprecated  // Forge: Use the constructor that takes a supplier
    public FlowingFluidBlock(FlowingFluid p_i49014_1_, AbstractBlock.Properties p_i49014_2_) {
       super(p_i49014_2_);
       this.field_204517_c = p_i49014_1_;
@@ -47,8 +48,21 @@
 
       this.field_212565_c.add(p_i49014_1_.func_207207_a(8, true));
       this.func_180632_j(this.field_176227_L.func_177621_b().func_206870_a(field_176367_b, Integer.valueOf(0)));
+      fluidStateCacheInitialized = true;
+      supplier = p_i49014_1_.delegate;
    }
 
+   /**
+    * @param supplier A fluid supplier such as {@link net.minecraftforge.fml.RegistryObject<Fluid>}
+    */
+   public FlowingFluidBlock(java.util.function.Supplier<? extends FlowingFluid> supplier, AbstractBlock.Properties p_i48368_1_) {
+      super(p_i48368_1_);
+      this.field_204517_c = null;
+      this.field_212565_c = Lists.newArrayList();
+      this.func_180632_j(this.field_176227_L.func_177621_b().func_206870_a(field_176367_b, Integer.valueOf(0)));
+      this.supplier = supplier;
+   }
+
    public VoxelShape func_220071_b(BlockState p_220071_1_, IBlockReader p_220071_2_, BlockPos p_220071_3_, ISelectionContext p_220071_4_) {
       return p_220071_4_.func_216378_a(field_235510_c_, p_220071_3_, true) && p_220071_1_.func_177229_b(field_176367_b) == 0 && p_220071_4_.func_230426_a_(p_220071_2_.func_204610_c(p_220071_3_.func_177984_a()), this.field_204517_c) ? field_235510_c_ : VoxelShapes.func_197880_a();
    }
@@ -71,6 +85,7 @@
 
    public FluidState func_204507_t(BlockState p_204507_1_) {
       int i = p_204507_1_.func_177229_b(field_176367_b);
+      if (!fluidStateCacheInitialized) initFluidStateCache();
       return this.field_212565_c.get(Math.min(i, 8));
    }
 
@@ -122,13 +137,13 @@
                BlockPos blockpos = p_204515_2_.func_177972_a(direction);
                if (p_204515_1_.func_204610_c(blockpos).func_206884_a(FluidTags.field_206959_a)) {
                   Block block = p_204515_1_.func_204610_c(p_204515_2_).func_206889_d() ? Blocks.field_150343_Z : Blocks.field_150347_e;
-                  p_204515_1_.func_175656_a(p_204515_2_, block.func_176223_P());
+                  p_204515_1_.func_175656_a(p_204515_2_, net.minecraftforge.event.ForgeEventFactory.fireFluidPlaceBlockEvent(p_204515_1_, p_204515_2_, p_204515_2_, block.func_176223_P()));
                   this.func_180688_d(p_204515_1_, p_204515_2_);
                   return false;
                }
 
                if (flag && p_204515_1_.func_180495_p(blockpos).func_203425_a(Blocks.field_205164_gk)) {
-                  p_204515_1_.func_175656_a(p_204515_2_, Blocks.field_235337_cO_.func_176223_P());
+                  p_204515_1_.func_175656_a(p_204515_2_, net.minecraftforge.event.ForgeEventFactory.fireFluidPlaceBlockEvent(p_204515_1_, p_204515_2_, p_204515_2_, Blocks.field_235337_cO_.func_176223_P()));
                   this.func_180688_d(p_204515_1_, p_204515_2_);
                   return false;
                }
@@ -166,4 +181,23 @@
       }
 
    }
+
+   // Forge start
+   private final java.util.function.Supplier<? extends Fluid> supplier;
+   public FlowingFluid getFluid() {
+      return (FlowingFluid)supplier.get();
+   }
+
+   private boolean fluidStateCacheInitialized = false;
+   protected synchronized void initFluidStateCache() {
+      if (fluidStateCacheInitialized == false) {
+         this.field_212565_c.add(getFluid().func_207204_a(false));
+
+         for (int i = 1; i < 8; ++i)
+            this.field_212565_c.add(getFluid().func_207207_a(8 - i, false));
+
+         this.field_212565_c.add(getFluid().func_207207_a(8, true));
+         fluidStateCacheInitialized = true;
+      }
+   }
 }
