--- a/net/minecraft/world/level/block/SpongeBlock.java
+++ b/net/minecraft/world/level/block/SpongeBlock.java
@@ -50,7 +_,8 @@
     }
 
     private boolean removeWaterBreadthFirstSearch(Level level, BlockPos pos) {
-        return BlockPos.breadthFirstTraversal(
+        org.bukkit.craftbukkit.util.BlockStateListPopulator blockList = new org.bukkit.craftbukkit.util.BlockStateListPopulator(level); // CraftBukkit - Use BlockStateListPopulator
+        BlockPos.breadthFirstTraversal(
                 pos,
                 6,
                 65,
@@ -63,16 +_,18 @@
                     if (blockPos.equals(pos)) {
                         return BlockPos.TraversalNodeStatus.ACCEPT;
                     } else {
-                        BlockState blockState = level.getBlockState(blockPos);
-                        FluidState fluidState = level.getFluidState(blockPos);
+                        // CraftBukkit start
+                        BlockState blockState = blockList.getBlockState(blockPos);
+                        FluidState fluidState = blockList.getFluidState(blockPos);
+                        // CraftBukkit end
                         if (!fluidState.is(FluidTags.WATER)) {
                             return BlockPos.TraversalNodeStatus.SKIP;
                         } else if (blockState.getBlock() instanceof BucketPickup bucketPickup
-                            && !bucketPickup.pickupBlock(null, level, blockPos, blockState).isEmpty()) {
+                            && !bucketPickup.pickupBlock(null, blockList, blockPos, blockState).isEmpty()) { // CraftBukkit
                             return BlockPos.TraversalNodeStatus.ACCEPT;
                         } else {
                             if (blockState.getBlock() instanceof LiquidBlock) {
-                                level.setBlock(blockPos, Blocks.AIR.defaultBlockState(), 3);
+                                blockList.setBlock(blockPos, Blocks.AIR.defaultBlockState(), 3); // CraftBukkit
                             } else {
                                 if (!blockState.is(Blocks.KELP)
                                     && !blockState.is(Blocks.KELP_PLANT)
@@ -81,16 +_,49 @@
                                     return BlockPos.TraversalNodeStatus.SKIP;
                                 }
 
-                                BlockEntity blockEntity = blockState.hasBlockEntity() ? level.getBlockEntity(blockPos) : null;
-                                dropResources(blockState, level, blockPos, blockEntity);
-                                level.setBlock(blockPos, Blocks.AIR.defaultBlockState(), 3);
+                                // CraftBukkit start
+                                // BlockEntity blockEntity = blockState.hasBlockEntity() ? level.getBlockEntity(blockPos) : null;
+                                // dropResources(blockState, level, blockPos, blockEntity);
+                                blockList.setBlock(blockPos, Blocks.AIR.defaultBlockState(), 3);
+                                // CraftBukkit end
                             }
 
                             return BlockPos.TraversalNodeStatus.ACCEPT;
                         }
                     }
                 }
-            )
-            > 1;
+            );
+        // CraftBukkit start
+        java.util.List<org.bukkit.craftbukkit.block.CraftBlockState> snapshots = blockList.getSnapshotBlocks(); // Is a clone
+        if (!snapshots.isEmpty()) {
+            final org.bukkit.block.Block sponge = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+
+            org.bukkit.event.block.SpongeAbsorbEvent event = new org.bukkit.event.block.SpongeAbsorbEvent(sponge, (java.util.List<org.bukkit.block.BlockState>) (java.util.List) snapshots);
+            if (!event.callEvent()) {
+                return false;
+            }
+
+            for (org.bukkit.craftbukkit.block.CraftBlockState snapshot : snapshots) {
+                BlockPos blockPos = snapshot.getPosition();
+                BlockState blockState = level.getBlockState(blockPos);
+                FluidState fluidState = level.getFluidState(blockPos);
+
+                if (!fluidState.is(FluidTags.WATER)) {
+                } else if (blockState.getBlock() instanceof BucketPickup bucketPickup && !bucketPickup.pickupBlock(null, level, blockPos, blockState).isEmpty()) {
+                } else if (blockState.getBlock() instanceof LiquidBlock) {
+                } else if (blockState.is(Blocks.KELP) || blockState.is(Blocks.KELP_PLANT) || blockState.is(Blocks.SEAGRASS) || blockState.is(Blocks.TALL_SEAGRASS)) {
+                    BlockEntity blockEntity = blockState.hasBlockEntity() ? level.getBlockEntity(blockPos) : null;
+
+                    if (snapshot.getHandle().isAir()) {
+                        dropResources(blockState, level, blockPos, blockEntity);
+                    }
+                }
+                snapshot.place(snapshot.getFlags());
+            }
+
+            return true;
+        }
+        return false;
+        // CraftBukkit end
     }
 }
