--- a/net/minecraft/world/level/block/SpongeBlock.java
+++ b/net/minecraft/world/level/block/SpongeBlock.java
@@ -13,7 +13,15 @@
 import net.minecraft.world.level.material.FluidState;
 import net.minecraft.world.level.material.Material;
 
+// CraftBukkit start
+import java.util.List;
+import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlockState;
+import org.bukkit.craftbukkit.v1_19_R1.util.BlockStateListPopulator;
+import org.bukkit.event.block.SpongeAbsorbEvent;
+// CraftBukkit end
+
 public class SpongeBlock extends Block {
+
     public static final int MAX_DEPTH = 6;
     public static final int MAX_COUNT = 64;
 
@@ -44,38 +52,49 @@
 
     private boolean removeWaterBreadthFirstSearch(Level world, BlockPos pos) {
         Queue<Tuple<BlockPos, Integer>> queue = Lists.newLinkedList();
+
         queue.add(new Tuple<>(pos, 0));
         int i = 0;
+        BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator
 
-        while(!queue.isEmpty()) {
-            Tuple<BlockPos, Integer> tuple = queue.poll();
-            BlockPos blockPos = tuple.getA();
-            int j = tuple.getB();
+        while (!queue.isEmpty()) {
+            Tuple<BlockPos, Integer> tuple = (Tuple) queue.poll();
+            BlockPos blockposition1 = (BlockPos) tuple.getA();
+            int j = (Integer) tuple.getB();
+            Direction[] aenumdirection = Direction.values();
+            int k = aenumdirection.length;
 
-            for(Direction direction : Direction.values()) {
-                BlockPos blockPos2 = blockPos.relative(direction);
-                BlockState blockState = world.getBlockState(blockPos2);
-                FluidState fluidState = world.getFluidState(blockPos2);
-                Material material = blockState.getMaterial();
-                if (fluidState.is(FluidTags.WATER)) {
-                    if (blockState.getBlock() instanceof BucketPickup && !((BucketPickup)blockState.getBlock()).pickupBlock(world, blockPos2, blockState).isEmpty()) {
+            for (int l = 0; l < k; ++l) {
+                Direction enumdirection = aenumdirection[l];
+                BlockPos blockposition2 = blockposition1.relative(enumdirection);
+                // CraftBukkit start
+                BlockState iblockdata = blockList.getBlockState(blockposition2);
+                FluidState fluid = blockList.getFluidState(blockposition2);
+                // CraftBukkit end
+                Material material = iblockdata.getMaterial();
+
+                if (fluid.is(FluidTags.WATER)) {
+                    if (iblockdata.getBlock() instanceof BucketPickup && !((BucketPickup) iblockdata.getBlock()).pickupBlock(blockList, blockposition2, iblockdata).isEmpty()) { // CraftBukkit
                         ++i;
                         if (j < 6) {
-                            queue.add(new Tuple<>(blockPos2, j + 1));
+                            queue.add(new Tuple<>(blockposition2, j + 1));
                         }
-                    } else if (blockState.getBlock() instanceof LiquidBlock) {
-                        world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3);
+                    } else if (iblockdata.getBlock() instanceof LiquidBlock) {
+                        blockList.setBlock(blockposition2, Blocks.AIR.defaultBlockState(), 3); // CraftBukkit
                         ++i;
                         if (j < 6) {
-                            queue.add(new Tuple<>(blockPos2, j + 1));
+                            queue.add(new Tuple<>(blockposition2, j + 1));
                         }
                     } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
-                        BlockEntity blockEntity = blockState.hasBlockEntity() ? world.getBlockEntity(blockPos2) : null;
-                        dropResources(blockState, world, blockPos2, blockEntity);
-                        world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3);
+                        // CraftBukkit start
+                        // TileEntity tileentity = iblockdata.hasBlockEntity() ? world.getBlockEntity(blockposition2) : null;
+
+                        // dropResources(iblockdata, world, blockposition2, tileentity);
+                        blockList.setBlock(blockposition2, Blocks.AIR.defaultBlockState(), 3);
+                        // CraftBukkit end
                         ++i;
                         if (j < 6) {
-                            queue.add(new Tuple<>(blockPos2, j + 1));
+                            queue.add(new Tuple<>(blockposition2, j + 1));
                         }
                     }
                 }
@@ -85,6 +104,42 @@
                 break;
             }
         }
+        // CraftBukkit start
+        List<CraftBlockState> blocks = blockList.getList(); // Is a clone
+        if (!blocks.isEmpty()) {
+            final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+
+            SpongeAbsorbEvent event = new SpongeAbsorbEvent(bblock, (List<org.bukkit.block.BlockState>) (List) blocks);
+            world.getCraftServer().getPluginManager().callEvent(event);
+
+            if (event.isCancelled()) {
+                return false;
+            }
+
+            for (CraftBlockState block : blocks) {
+                BlockPos blockposition2 = block.getPosition();
+                BlockState iblockdata = world.getBlockState(blockposition2);
+                FluidState fluid = world.getFluidState(blockposition2);
+                Material material = iblockdata.getMaterial();
+
+                if (fluid.is(FluidTags.WATER)) {
+                    if (iblockdata.getBlock() instanceof BucketPickup && !((BucketPickup) iblockdata.getBlock()).pickupBlock(blockList, blockposition2, iblockdata).isEmpty()) {
+                        // NOP
+                    } else if (iblockdata.getBlock() instanceof LiquidBlock) {
+                        // NOP
+                    } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
+                        BlockEntity tileentity = iblockdata.hasBlockEntity() ? world.getBlockEntity(blockposition2) : null;
+                        // Paper start
+                        if (block.getHandle().getMaterial() == Material.AIR) {
+                            dropResources(iblockdata, world, blockposition2, tileentity);
+                        }
+                        // Paper end
+                    }
+                }
+                world.setBlock(blockposition2, block.getHandle(), block.getFlag());
+            }
+        }
+        // CraftBukkit end
 
         return i > 0;
     }
