--- a/net/minecraft/world/level/block/LiquidBlock.java
+++ b/net/minecraft/world/level/block/LiquidBlock.java
@@ -135,9 +_,28 @@
     @Override
     protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
         if (this.shouldSpreadLiquid(level, pos, state)) {
-            level.scheduleTick(pos, state.getFluidState().getType(), this.fluid.getTickDelay(level));
-        }
-    }
+            level.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(level, pos)); // Paper - Configurable speed for water flowing over lava
+        }
+    }
+    // Paper start - Configurable speed for water flowing over lava
+    public int getFlowSpeed(Level level, BlockPos pos) {
+        if (net.minecraft.core.registries.BuiltInRegistries.FLUID.wrapAsHolder(this.fluid).is(FluidTags.WATER)) {
+            if (
+                isLava(level, pos.north(1)) ||
+                isLava(level, pos.south(1)) ||
+                isLava(level, pos.west(1)) ||
+                isLava(level, pos.east(1))
+            ) {
+                return level.paperConfig().environment.waterOverLavaFlowSpeed;
+            }
+        }
+        return this.fluid.getTickDelay(level);
+    }
+    private static boolean isLava(Level level, BlockPos pos) {
+        final FluidState fluidState = level.getFluidIfLoaded(pos);
+        return fluidState != null && fluidState.is(FluidTags.LAVA);
+    }
+    // Paper end - Configurable speed for water flowing over lava
 
     @Override
     protected BlockState updateShape(
@@ -160,7 +_,7 @@
     @Override
     protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
         if (this.shouldSpreadLiquid(level, pos, state)) {
-            level.scheduleTick(pos, state.getFluidState().getType(), this.fluid.getTickDelay(level));
+            level.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(level, pos)); // Paper - Configurable speed for water flowing over lava
         }
     }
 
@@ -172,14 +_,20 @@
                 BlockPos blockPos = pos.relative(direction.getOpposite());
                 if (level.getFluidState(blockPos).is(FluidTags.WATER)) {
                     Block block = level.getFluidState(pos).isSource() ? Blocks.OBSIDIAN : Blocks.COBBLESTONE;
-                    level.setBlockAndUpdate(pos, block.defaultBlockState());
-                    this.fizz(level, pos);
+                    // CraftBukkit start
+                    if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, block.defaultBlockState())) {
+                        this.fizz(level, pos);
+                    }
+                    // CraftBukkit end
                     return false;
                 }
 
                 if (isSoulSoil && level.getBlockState(blockPos).is(Blocks.BLUE_ICE)) {
-                    level.setBlockAndUpdate(pos, Blocks.BASALT.defaultBlockState());
-                    this.fizz(level, pos);
+                    // CraftBukkit start
+                    if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, Blocks.BASALT.defaultBlockState())) {
+                        this.fizz(level, pos);
+                    }
+                    // CraftBukkit end
                     return false;
                 }
             }
