--- a/net/minecraft/server/BlockSponge.java
+++ b/net/minecraft/server/BlockSponge.java
@@ -2,6 +2,12 @@
 
 import com.google.common.collect.Lists;
 import java.util.Queue;
+// CraftBukkit start
+import java.util.List;
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.util.BlockStateListPopulator;
+import org.bukkit.event.block.SpongeAbsorbEvent;
+// CraftBukkit end
 
 public class BlockSponge extends Block {
 
@@ -35,6 +41,7 @@
 
         queue.add(new Tuple<>(blockposition, 0));
         int i = 0;
+        BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator
 
         while (!queue.isEmpty()) {
             Tuple<BlockPosition, Integer> tuple = (Tuple) queue.poll();
@@ -46,27 +53,31 @@
             for (int l = 0; l < k; ++l) {
                 EnumDirection enumdirection = aenumdirection[l];
                 BlockPosition blockposition2 = blockposition1.shift(enumdirection);
-                IBlockData iblockdata = world.getType(blockposition2);
-                Fluid fluid = world.getFluid(blockposition2);
+                // CraftBukkit start
+                IBlockData iblockdata = blockList.getType(blockposition2);
+                Fluid fluid = blockList.getFluid(blockposition2);
+                // CraftBukkit end
                 Material material = iblockdata.getMaterial();
 
                 if (fluid.a(TagsFluid.WATER)) {
-                    if (iblockdata.getBlock() instanceof IFluidSource && ((IFluidSource) iblockdata.getBlock()).removeFluid(world, blockposition2, iblockdata) != FluidTypes.EMPTY) {
+                    if (iblockdata.getBlock() instanceof IFluidSource && ((IFluidSource) iblockdata.getBlock()).removeFluid(blockList, blockposition2, iblockdata) != FluidTypes.EMPTY) { // CraftBukkit
                         ++i;
                         if (j < 6) {
                             queue.add(new Tuple<>(blockposition2, j + 1));
                         }
                     } else if (iblockdata.getBlock() instanceof BlockFluids) {
-                        world.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3);
+                        blockList.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3); // CraftBukkit
                         ++i;
                         if (j < 6) {
                             queue.add(new Tuple<>(blockposition2, j + 1));
                         }
                     } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
-                        TileEntity tileentity = iblockdata.getBlock().isTileEntity() ? world.getTileEntity(blockposition2) : null;
+                        // CraftBukkit start
+                        // TileEntity tileentity = iblockdata.getBlock().isTileEntity() ? world.getTileEntity(blockposition2) : null;
 
-                        a(iblockdata, world, blockposition2, tileentity);
-                        world.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3);
+                        // a(iblockdata, world, blockposition2, tileentity);
+                        blockList.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3);
+                        // CraftBukkit end
                         ++i;
                         if (j < 6) {
                             queue.add(new Tuple<>(blockposition2, j + 1));
@@ -79,6 +90,39 @@
                 break;
             }
         }
+        // CraftBukkit start
+        List<CraftBlockState> blocks = blockList.getList(); // Is a clone
+        if (!blocks.isEmpty()) {
+            final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
+
+            SpongeAbsorbEvent event = new SpongeAbsorbEvent(bblock, (List<org.bukkit.block.BlockState>) (List) blocks);
+            world.getServer().getPluginManager().callEvent(event);
+
+            if (event.isCancelled()) {
+                return false;
+            }
+
+            for (CraftBlockState block : blocks) {
+                BlockPosition blockposition2 = block.getPosition();
+                IBlockData iblockdata = world.getType(blockposition2);
+                Fluid fluid = world.getFluid(blockposition2);
+                Material material = iblockdata.getMaterial();
+
+                if (fluid.a(TagsFluid.WATER)) {
+                    if (iblockdata.getBlock() instanceof IFluidSource && ((IFluidSource) iblockdata.getBlock()).removeFluid(blockList, blockposition2, iblockdata) != FluidTypes.EMPTY) {
+                        // NOP
+                    } else if (iblockdata.getBlock() instanceof BlockFluids) {
+                        // NOP
+                    } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
+                        TileEntity tileentity = iblockdata.getBlock().isTileEntity() ? world.getTileEntity(blockposition2) : null;
+
+                        a(iblockdata, world, blockposition2, tileentity);
+                    }
+                }
+                world.setTypeAndData(blockposition2, block.getHandle(), block.getFlag());
+            }
+        }
+        // CraftBukkit end
 
         return i > 0;
     }