diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/FrogspawnBlock.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/FrogspawnBlock.java.patch
index a6ded0d4cf..c5fefd2f6b 100644
--- a/paper-server/patches/sources/net/minecraft/world/level/block/FrogspawnBlock.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/level/block/FrogspawnBlock.java.patch
@@ -8,7 +8,19 @@
          if (entity.getType().equals(EntityType.FALLING_BLOCK)) {
              this.destroyBlock(world, pos);
          }
-@@ -121,7 +122,7 @@
+@@ -101,6 +102,11 @@
+     }
+ 
+     private void hatchFrogspawn(ServerLevel world, BlockPos pos, RandomSource random) {
++        // Paper start - Call BlockFadeEvent
++        if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world, pos, Blocks.AIR.defaultBlockState()).isCancelled()) {
++            return;
++        }
++        // Paper end - Call BlockFadeEvent
+         this.destroyBlock(world, pos);
+         world.playSound(null, pos, SoundEvents.FROGSPAWN_HATCH, SoundSource.BLOCKS, 1.0F, 1.0F);
+         this.spawnTadpoles(world, pos, random);
+@@ -121,7 +127,7 @@
                  int k = random.nextInt(1, 361);
                  tadpole.moveTo(d, (double)pos.getY() - 0.5, e, (float)k, 0.0F);
                  tadpole.setPersistenceRequired();
diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/ScaffoldingBlock.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/ScaffoldingBlock.java.patch
index 9736b3492c..d5960ee388 100644
--- a/paper-server/patches/sources/net/minecraft/world/level/block/ScaffoldingBlock.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/level/block/ScaffoldingBlock.java.patch
@@ -5,7 +5,7 @@
          BlockState iblockdata1 = (BlockState) ((BlockState) state.setValue(ScaffoldingBlock.DISTANCE, i)).setValue(ScaffoldingBlock.BOTTOM, this.isBottom(world, pos, i));
  
 -        if ((Integer) iblockdata1.getValue(ScaffoldingBlock.DISTANCE) == 7) {
-+        if ((Integer) iblockdata1.getValue(ScaffoldingBlock.DISTANCE) == 7 && !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world, pos, Blocks.AIR.defaultBlockState()).isCancelled()) { // CraftBukkit - BlockFadeEvent
++        if ((Integer) iblockdata1.getValue(ScaffoldingBlock.DISTANCE) == 7 && !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world, pos, iblockdata1.getFluidState().createLegacyBlock()).isCancelled()) { // CraftBukkit - BlockFadeEvent // Paper - fix wrong block state
              if ((Integer) state.getValue(ScaffoldingBlock.DISTANCE) == 7) {
                  FallingBlockEntity.fall(world, pos, iblockdata1);
              } else {
diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/SnifferEggBlock.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/SnifferEggBlock.java.patch
index 5d27c22c8f..3413faf95f 100644
--- a/paper-server/patches/sources/net/minecraft/world/level/block/SnifferEggBlock.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/level/block/SnifferEggBlock.java.patch
@@ -1,6 +1,33 @@
 --- a/net/minecraft/world/level/block/SnifferEggBlock.java
 +++ b/net/minecraft/world/level/block/SnifferEggBlock.java
-@@ -74,7 +74,7 @@
+@@ -61,12 +61,26 @@
+         return this.getHatchLevel(state) == 2;
+     }
+ 
++    // Paper start - Call BlockFadeEvent
++    private void rescheduleTick(ServerLevel world, BlockPos pos) {
++        int baseDelay = hatchBoost(world, pos) ? BOOSTED_HATCH_TIME_TICKS : REGULAR_HATCH_TIME_TICKS;
++        world.scheduleTick(pos, this, (baseDelay / 3) + world.random.nextInt(RANDOM_HATCH_OFFSET_TICKS));
++        // reschedule to avoid being stuck here and behave like the other calls (see #onPlace)
++    }
++    // Paper end - Call BlockFadeEvent
++
+     @Override
+     public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) {
+         if (!this.isReadyToHatch(state)) {
+             world.playSound(null, pos, SoundEvents.SNIFFER_EGG_CRACK, SoundSource.BLOCKS, 0.7F, 0.9F + random.nextFloat() * 0.2F);
+             world.setBlock(pos, state.setValue(HATCH, Integer.valueOf(this.getHatchLevel(state) + 1)), 2);
+         } else {
++            // Paper start - Call BlockFadeEvent
++            if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world, pos, state.getFluidState().createLegacyBlock()).isCancelled()) {
++                this.rescheduleTick(world, pos);
++                return;
++            }
++            // Paper end - Call BlockFadeEvent
+             world.playSound(null, pos, SoundEvents.SNIFFER_EGG_HATCH, SoundSource.BLOCKS, 0.7F, 0.9F + random.nextFloat() * 0.2F);
+             world.destroyBlock(pos, false);
+             Sniffer sniffer = EntityType.SNIFFER.create(world, EntitySpawnReason.BREEDING);
+@@ -74,7 +88,7 @@
                  Vec3 vec3 = pos.getCenter();
                  sniffer.setBaby(true);
                  sniffer.moveTo(vec3.x(), vec3.y(), vec3.z(), Mth.wrapDegrees(world.random.nextFloat() * 360.0F), 0.0F);