--- a/net/minecraft/world/level/redstone/NeighborUpdater.java
+++ b/net/minecraft/world/level/redstone/NeighborUpdater.java
@@ -42,8 +_,29 @@
     }
 
     static void executeUpdate(Level level, BlockState state, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
+        // Paper start - Add source block to BlockPhysicsEvent
+        executeUpdate(level, state, pos, neighborBlock, orientation, movedByPiston, pos);
+    }
+
+    static void executeUpdate(Level level, BlockState state, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston, BlockPos sourcePos) {
+        // Paper end - Add source block to BlockPhysicsEvent
         try {
+            // CraftBukkit start
+            org.bukkit.craftbukkit.CraftWorld cworld = level.getWorld();
+            if (cworld != null) {
+                org.bukkit.event.block.BlockPhysicsEvent event = new org.bukkit.event.block.BlockPhysicsEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), org.bukkit.craftbukkit.block.CraftBlock.at(level, sourcePos)); // Paper - Add source block to BlockPhysicsEvent
+                level.getCraftServer().getPluginManager().callEvent(event);
+
+                if (event.isCancelled()) {
+                    return;
+                }
+            }
+            // CraftBukkit end
             state.handleNeighborChanged(level, pos, neighborBlock, orientation, movedByPiston);
+            // Spigot start
+        } catch (StackOverflowError ex) {
+            level.lastPhysicsProblem = new BlockPos(pos);
+            // Spigot end
         } catch (Throwable var9) {
             CrashReport crashReport = CrashReport.forThrowable(var9, "Exception while updating neighbours");
             CrashReportCategory crashReportCategory = crashReport.addCategory("Block being updated");
