diff --git a/patches/server/Add-option-to-disable-block-updates.patch b/patches/server/Add-option-to-disable-block-updates.patch
index 0becb40a95..df8940b794 100644
--- a/patches/server/Add-option-to-disable-block-updates.patch
+++ b/patches/server/Add-option-to-disable-block-updates.patch
@@ -4,6 +4,74 @@ Date: Sun, 18 Jun 2023 17:45:33 +0200
 Subject: [PATCH] Add option to disable block updates
 
 
+diff --git a/src/main/java/net/minecraft/world/level/block/ChorusPlantBlock.java b/src/main/java/net/minecraft/world/level/block/ChorusPlantBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/ChorusPlantBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/ChorusPlantBlock.java
+@@ -0,0 +0,0 @@ public class ChorusPlantBlock extends PipeBlock {
+ 
+     @Override
+     public BlockState getStateForPlacement(BlockPlaceContext ctx) {
++        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableChorusPlantUpdates) return this.defaultBlockState(); // Paper - add option to disable block updates
+         return this.getStateForPlacement(ctx.getLevel(), ctx.getClickedPos());
+     }
+ 
+@@ -0,0 +0,0 @@ public class ChorusPlantBlock extends PipeBlock {
+ 
+     @Override
+     public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) {
++        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableChorusPlantUpdates) return state; // Paper - add option to disable block updates
+         if (!state.canSurvive(world, pos)) {
+             world.scheduleTick(pos, this, 1);
+             return super.updateShape(state, direction, neighborState, world, pos, neighborPos);
+@@ -0,0 +0,0 @@ public class ChorusPlantBlock extends PipeBlock {
+ 
+     @Override
+     public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) {
++        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableChorusPlantUpdates) return; // Paper - add option to disable block updates
+         if (!state.canSurvive(world, pos)) {
+             world.destroyBlock(pos, true);
+         }
+@@ -0,0 +0,0 @@ public class ChorusPlantBlock extends PipeBlock {
+ 
+     @Override
+     public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
++        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableChorusPlantUpdates) return true; // Paper - add option to disable block updates
+         BlockState blockState = world.getBlockState(pos.below());
+         boolean bl = !world.getBlockState(pos.above()).isAir() && !blockState.isAir();
+ 
+diff --git a/src/main/java/net/minecraft/world/level/block/HugeMushroomBlock.java b/src/main/java/net/minecraft/world/level/block/HugeMushroomBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/HugeMushroomBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/HugeMushroomBlock.java
+@@ -0,0 +0,0 @@ public class HugeMushroomBlock extends Block {
+ 
+     @Override
+     public BlockState getStateForPlacement(BlockPlaceContext ctx) {
++        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableMushroomBlockUpdates) return this.defaultBlockState(); // Paper - add option to disable block updates
+         BlockGetter blockGetter = ctx.getLevel();
+         BlockPos blockPos = ctx.getClickedPos();
+         return this.defaultBlockState().setValue(DOWN, Boolean.valueOf(!blockGetter.getBlockState(blockPos.below()).is(this))).setValue(UP, Boolean.valueOf(!blockGetter.getBlockState(blockPos.above()).is(this))).setValue(NORTH, Boolean.valueOf(!blockGetter.getBlockState(blockPos.north()).is(this))).setValue(EAST, Boolean.valueOf(!blockGetter.getBlockState(blockPos.east()).is(this))).setValue(SOUTH, Boolean.valueOf(!blockGetter.getBlockState(blockPos.south()).is(this))).setValue(WEST, Boolean.valueOf(!blockGetter.getBlockState(blockPos.west()).is(this)));
+@@ -0,0 +0,0 @@ public class HugeMushroomBlock extends Block {
+ 
+     @Override
+     public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) {
++        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableMushroomBlockUpdates) return state; // Paper - add option to disable block updates
+         return neighborState.is(this) ? state.setValue(PROPERTY_BY_DIRECTION.get(direction), Boolean.valueOf(false)) : super.updateShape(state, direction, neighborState, world, pos, neighborPos);
+     }
+ 
+     @Override
+     public BlockState rotate(BlockState state, Rotation rotation) {
++        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableMushroomBlockUpdates) return state; // Paper - add option to disable block updates
+         return state.setValue(PROPERTY_BY_DIRECTION.get(rotation.rotate(Direction.NORTH)), state.getValue(NORTH)).setValue(PROPERTY_BY_DIRECTION.get(rotation.rotate(Direction.SOUTH)), state.getValue(SOUTH)).setValue(PROPERTY_BY_DIRECTION.get(rotation.rotate(Direction.EAST)), state.getValue(EAST)).setValue(PROPERTY_BY_DIRECTION.get(rotation.rotate(Direction.WEST)), state.getValue(WEST)).setValue(PROPERTY_BY_DIRECTION.get(rotation.rotate(Direction.UP)), state.getValue(UP)).setValue(PROPERTY_BY_DIRECTION.get(rotation.rotate(Direction.DOWN)), state.getValue(DOWN));
+     }
+ 
+     @Override
+     public BlockState mirror(BlockState state, Mirror mirror) {
++        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableMushroomBlockUpdates) return state; // Paper - add option to disable block updates
+         return state.setValue(PROPERTY_BY_DIRECTION.get(mirror.mirror(Direction.NORTH)), state.getValue(NORTH)).setValue(PROPERTY_BY_DIRECTION.get(mirror.mirror(Direction.SOUTH)), state.getValue(SOUTH)).setValue(PROPERTY_BY_DIRECTION.get(mirror.mirror(Direction.EAST)), state.getValue(EAST)).setValue(PROPERTY_BY_DIRECTION.get(mirror.mirror(Direction.WEST)), state.getValue(WEST)).setValue(PROPERTY_BY_DIRECTION.get(mirror.mirror(Direction.UP)), state.getValue(UP)).setValue(PROPERTY_BY_DIRECTION.get(mirror.mirror(Direction.DOWN)), state.getValue(DOWN));
+     }
+ 
 diff --git a/src/main/java/net/minecraft/world/level/block/NoteBlock.java b/src/main/java/net/minecraft/world/level/block/NoteBlock.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/level/block/NoteBlock.java
diff --git a/patches/server/Paper-config-files.patch b/patches/server/Paper-config-files.patch
index 1259fa9620..5626c41077 100644
--- a/patches/server/Paper-config-files.patch
+++ b/patches/server/Paper-config-files.patch
@@ -733,6 +733,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    public class BlockUpdates extends ConfigurationPart {
 +        public boolean disableNoteblockUpdates = false;
 +        public boolean disableTripwireUpdates = false;
++        public boolean disableChorusPlantUpdates = false;
++        public boolean disableMushroomBlockUpdates = false;
 +    }
 +}
 diff --git a/src/main/java/io/papermc/paper/configuration/InnerClassFieldDiscoverer.java b/src/main/java/io/papermc/paper/configuration/InnerClassFieldDiscoverer.java
diff --git a/patches/server/Rewrite-chunk-system.patch b/patches/server/Rewrite-chunk-system.patch
index 7654046a77..57a19e8e5c 100644
--- a/patches/server/Rewrite-chunk-system.patch
+++ b/patches/server/Rewrite-chunk-system.patch
@@ -15690,30 +15690,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
 +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
 @@ -0,0 +0,0 @@ public class GlobalConfiguration extends ConfigurationPart {
-         public int incomingPacketThreshold = 300;
-     }
- 
--    public ChunkLoading chunkLoading;
--
--    public class ChunkLoading extends ConfigurationPart {
--        public int minLoadRadius = 2;
--        public int maxConcurrentSends = 2;
--        public boolean autoconfigSendDistance = true;
--        public double targetPlayerChunkSendRate = 100.0;
--        public double globalMaxChunkSendRate = -1.0;
--        public boolean enableFrustumPriority = false;
--        public double globalMaxChunkLoadRate = -1.0;
--        public double playerMaxConcurrentLoads = 20.0;
--        public double globalMaxConcurrentLoads = 500.0;
--        public double playerMaxChunkLoadRate = -1.0;
--    }
--
-     public UnsupportedSettings unsupportedSettings;
- 
-     public class UnsupportedSettings extends ConfigurationPart {
-@@ -0,0 +0,0 @@ public class GlobalConfiguration extends ConfigurationPart {
-         public boolean disableNoteblockUpdates = false;
-         public boolean disableTripwireUpdates = false;
+     public static GlobalConfiguration get() {
+         return instance;
      }
 +
 +    public ChunkLoadingBasic chunkLoadingBasic;
@@ -15754,7 +15732,31 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        )
 +        public int playerMaxConcurrentChunkGenerates = 0;
 +    }
- }
+     static void set(GlobalConfiguration instance) {
+         GlobalConfiguration.instance = instance;
+     }
+@@ -0,0 +0,0 @@ public class GlobalConfiguration extends ConfigurationPart {
+         public int incomingPacketThreshold = 300;
+     }
+ 
+-    public ChunkLoading chunkLoading;
+-
+-    public class ChunkLoading extends ConfigurationPart {
+-        public int minLoadRadius = 2;
+-        public int maxConcurrentSends = 2;
+-        public boolean autoconfigSendDistance = true;
+-        public double targetPlayerChunkSendRate = 100.0;
+-        public double globalMaxChunkSendRate = -1.0;
+-        public boolean enableFrustumPriority = false;
+-        public double globalMaxChunkLoadRate = -1.0;
+-        public double playerMaxConcurrentLoads = 20.0;
+-        public double globalMaxConcurrentLoads = 500.0;
+-        public double playerMaxChunkLoadRate = -1.0;
+-    }
+-
+     public UnsupportedSettings unsupportedSettings;
+ 
+     public class UnsupportedSettings extends ConfigurationPart {
 diff --git a/src/main/java/io/papermc/paper/threadedregions/TickRegions.java b/src/main/java/io/papermc/paper/threadedregions/TickRegions.java
 new file mode 100644
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000