diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlockConfiguration.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlockConfiguration.java
index 6a51741..803e288 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlockConfiguration.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlockConfiguration.java
@@ -5,14 +5,12 @@ import org.jetbrains.annotations.NotNull;
 
 public record PixelBlockConfiguration(
         int pixelsPerBlock,
-        boolean liveUpdate,
         double hitboxOffset,
         boolean onlyBreakableByOwner,
         boolean onlyEditableByOwner
 ) {
     public static void setDefaults(FileConfiguration config) {
         config.addDefault(Keys.PixelsPerBlock.key, 16);
-        config.addDefault(Keys.LiveUpdate.key, true);
         config.addDefault(Keys.HitboxOffset.key, 0.005);
         config.addDefault(Keys.OnlyBreakableByOwners.key, false);
         config.addDefault(Keys.OnlyEditableByOwners.key, true);
@@ -21,7 +19,6 @@ public record PixelBlockConfiguration(
 
     public enum Keys {
         PixelsPerBlock("pixelsPerBlock"),
-        LiveUpdate("liveUpdate"),
         HitboxOffset("hitboxOffset"),
         OnlyBreakableByOwners("onlyBreakableByOwners"),
         OnlyEditableByOwners("onlyEditableByOwners");
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocksPlugin.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocksPlugin.java
index 7864a4a..bd335b4 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocksPlugin.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocksPlugin.java
@@ -32,7 +32,6 @@ public final class PixelBlocksPlugin extends JavaPlugin {
 
         PixelBlocksPlugin.configuration = new PixelBlockConfiguration(
                 config.getInt(PixelBlockConfiguration.Keys.PixelsPerBlock.getKey()),
-                config.getBoolean(PixelBlockConfiguration.Keys.LiveUpdate.getKey()),
                 config.getDouble(PixelBlockConfiguration.Keys.HitboxOffset.getKey()),
                 config.getBoolean(PixelBlockConfiguration.Keys.OnlyBreakableByOwners.getKey()),
                 config.getBoolean(PixelBlockConfiguration.Keys.OnlyEditableByOwners.getKey())
@@ -51,12 +50,16 @@ public final class PixelBlocksPlugin extends JavaPlugin {
                 new FallOutOfPixelBlockListener(),
                 new BreakPixelListener(),
                 new PlacePixelBlockListener(),
-                new PixelWorldInventoryListener(),
-                new PixelWorldExitListener(),
+                new PreventInventorysListener(),
+                new ExitPixelWorldListener(),
                 new CraftPixelBlockListener(),
-                new PixelWorldBehaviourListener(),
+                new PreventIllegalBlocksListener(),
                 new BreakPixelBlockListener(),
-                new PlacePixelListener()
+                new PlacePixelListener(),
+                new PreventHopperActionsListener(),
+                new PreventLiquidsFlowListener(),
+                new PreventPistonsListener(),
+                new PreventEntityPlacementListener()
         };
 
         for (Listener listener : listeners) {
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BreakPixelBlockListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BreakPixelBlockListener.java
index 31b3e0a..d9863cb 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BreakPixelBlockListener.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BreakPixelBlockListener.java
@@ -11,15 +11,11 @@ import org.bukkit.event.Listener;
 public class BreakPixelBlockListener implements Listener {
     @EventHandler
     static void destroyPixelBlock(PrePlayerAttackEntityEvent event) {
-        if(event.getAttacked() instanceof Interaction) {
-            Location blockLocation = event.getAttacked().getLocation().add(0, PixelBlocksPlugin.configuration.hitboxOffset(), 0).toBlockLocation();
-            blockLocation.setYaw(0);
-            blockLocation.setPitch(0);
+        if(!(event.getAttacked() instanceof Interaction)) return;
 
-            PixelBlock pixelBlock = PixelBlock.getPixelBlockFromPlacedLocation(blockLocation);
-
-            assert pixelBlock != null;
-            pixelBlock.destroy(event.getPlayer());
-        }
+        Location blockLocation = event.getAttacked().getLocation().add(0, PixelBlocksPlugin.configuration.hitboxOffset(), 0).toBlockLocation();
+        PixelBlock pixelBlock = PixelBlock.getPixelBlockFromPlacedLocation(blockLocation);
+        if(pixelBlock == null) return;
+        pixelBlock.destroy(event.getPlayer());
     }
 }
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BreakPixelListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BreakPixelListener.java
index 1f33625..be48781 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BreakPixelListener.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BreakPixelListener.java
@@ -1,27 +1,17 @@
 package eu.mhsl.minecraft.pixelblocks.listeners;
 
-import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock;
-import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlockWorld;
-import org.bukkit.Location;
-import org.bukkit.World;
+import eu.mhsl.minecraft.pixelblocks.utils.EventCanceling;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.block.BlockBreakEvent;
 
-import java.util.Objects;
-
 public class BreakPixelListener implements Listener {
     @EventHandler
     static void onBlockBreak(BlockBreakEvent event) {
-        World world = event.getBlock().getWorld();
-        if(!PixelBlockWorld.isPixelWorld(world)) return;
-
-        PixelBlock pixelBlock = PixelBlock.getPixelBlockFromBlockWorld(world);
-        Objects.requireNonNull(pixelBlock);
-
-        PixelBlockWorld pixelBlockWorld = pixelBlock.getPixelWorld();
-
-        Location blockLocation = event.getBlock().getLocation();
-        if(!pixelBlockWorld.allowPlacements(blockLocation)) event.setCancelled(true);
+        EventCanceling.shouldCancelInPixelBlock(
+            event,
+            event.getBlock().getWorld(),
+            pixelBlock -> !pixelBlock.getPixelWorld().allowPlacements(event.getBlock().getLocation())
+        );
     }
 }
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/CommonEventHandlers.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/CommonEventHandlers.java
deleted file mode 100644
index 6f7f094..0000000
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/CommonEventHandlers.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package eu.mhsl.minecraft.pixelblocks.listeners;
-
-import org.bukkit.Bukkit;
-import org.bukkit.World;
-import org.bukkit.event.Cancellable;
-
-import java.util.List;
-
-import static eu.mhsl.minecraft.pixelblocks.PixelBlocksPlugin.plugin;
-
-public class CommonEventHandlers {
-    public static boolean isInPixelWorld(World world) {
-        List<World> standardWorlds = Bukkit.getWorlds().stream()
-                .filter(w -> !w.getName().startsWith(plugin.getDataFolder().getPath()))
-                .toList();
-
-        return !standardWorlds.contains(world);
-    }
-
-    public static void cancelIfInPixelWorld(Cancellable event, World world) {
-        if(isInPixelWorld(world)) {
-            event.setCancelled(true);
-        }
-    }
-}
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/EnterPixelBlockListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/EnterPixelBlockListener.java
index 4da1b36..13f3c32 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/EnterPixelBlockListener.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/EnterPixelBlockListener.java
@@ -11,20 +11,15 @@ import org.bukkit.event.player.PlayerInteractEntityEvent;
 public class EnterPixelBlockListener implements Listener {
     @EventHandler
     static void enterPixelBlock(PlayerInteractEntityEvent event) {
-        if(event.getRightClicked() instanceof Interaction) {
-            Location interactionLocation = event
+        if(!(event.getRightClicked() instanceof Interaction)) return;
+
+        Location interactionLocation = event
                 .getRightClicked()
                 .getLocation()
                 .add(0, PixelBlocksPlugin.configuration.hitboxOffset(), 0)
                 .toBlockLocation();
-
-            interactionLocation.setYaw(0);
-            interactionLocation.setPitch(0);
-
-            PixelBlock pixelBlock = PixelBlock.getPixelBlockFromPlacedLocation(interactionLocation);
-
-            assert pixelBlock != null;
-            pixelBlock.enterBlock(event.getPlayer());
-        }
+        PixelBlock pixelBlock = PixelBlock.getPixelBlockFromPlacedLocation(interactionLocation);
+        if(pixelBlock == null) return;
+        pixelBlock.enterBlock(event.getPlayer());
     }
 }
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PixelWorldExitListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/ExitPixelWorldListener.java
similarity index 95%
rename from src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PixelWorldExitListener.java
rename to src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/ExitPixelWorldListener.java
index 142cd3c..904af61 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PixelWorldExitListener.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/ExitPixelWorldListener.java
@@ -10,7 +10,7 @@ import org.bukkit.event.player.PlayerPortalEvent;
 
 import java.util.Objects;
 
-public class PixelWorldExitListener implements Listener {
+public class ExitPixelWorldListener implements Listener {
     @EventHandler
     static void onPlayerChangeWorld(PlayerChangedWorldEvent event) {
         World changingFrom = event.getFrom();
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PixelWorldBehaviourListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PixelWorldBehaviourListener.java
deleted file mode 100644
index 04b3b5d..0000000
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PixelWorldBehaviourListener.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package eu.mhsl.minecraft.pixelblocks.listeners;
-
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.block.BlockExplodeEvent;
-import org.bukkit.event.entity.CreatureSpawnEvent;
-import org.bukkit.event.entity.EntityDamageEvent;
-import org.bukkit.event.entity.EntityExplodeEvent;
-import org.bukkit.event.player.PlayerDropItemEvent;
-import org.bukkit.event.player.PlayerPortalEvent;
-
-public class PixelWorldBehaviourListener implements Listener {
-    @EventHandler
-    static void onBlockExplode(BlockExplodeEvent event) {
-        CommonEventHandlers.cancelIfInPixelWorld(event, event.getBlock().getWorld());
-    }
-
-    @EventHandler
-    static void onCreatureSpawn(CreatureSpawnEvent event) {
-        CommonEventHandlers.cancelIfInPixelWorld(event, event.getLocation().getWorld());
-    }
-
-    @EventHandler
-    static void onEntityDamage(EntityDamageEvent event) {
-        CommonEventHandlers.cancelIfInPixelWorld(event, event.getEntity().getWorld());
-    }
-
-    @EventHandler
-    static void onEntityExplode(EntityExplodeEvent event) {
-        CommonEventHandlers.cancelIfInPixelWorld(event, event.getLocation().getWorld());
-    }
-
-    @EventHandler
-    static void onPlayerDropItem(PlayerDropItemEvent event) {
-        CommonEventHandlers.cancelIfInPixelWorld(event, event.getItemDrop().getWorld());
-    }
-
-    @EventHandler
-    static void onPlayerPortal(PlayerPortalEvent event) {
-        CommonEventHandlers.cancelIfInPixelWorld(event, event.getFrom().getWorld());
-    }
-}
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PixelWorldInventoryListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PixelWorldInventoryListener.java
deleted file mode 100644
index 3dd8429..0000000
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PixelWorldInventoryListener.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package eu.mhsl.minecraft.pixelblocks.listeners;
-
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.*;
-import org.bukkit.inventory.CraftingInventory;
-import org.bukkit.inventory.PlayerInventory;
-
-public class PixelWorldInventoryListener implements Listener {
-    @EventHandler
-    static void onInventoryOpen(InventoryOpenEvent event) {
-        if(CommonEventHandlers.isInPixelWorld(event.getPlayer().getWorld())) {
-            if(!(event.getInventory() instanceof PlayerInventory) && !(event.getInventory() instanceof CraftingInventory)) {
-                event.setCancelled(true);
-            }
-        }
-    }
-
-    @EventHandler
-    static void onInventoryDrag(InventoryDragEvent event) {
-        if(CommonEventHandlers.isInPixelWorld(event.getWhoClicked().getWorld())) {
-            if(!(event.getInventory() instanceof PlayerInventory) && !(event.getInventory() instanceof CraftingInventory)) {
-                event.setCancelled(true);
-            }
-        }
-    }
-
-    @EventHandler
-    static void onInventoryClick(InventoryClickEvent event) {
-        if(CommonEventHandlers.isInPixelWorld(event.getWhoClicked().getWorld())) {
-            if(!(event.getInventory() instanceof PlayerInventory) && !(event.getInventory() instanceof CraftingInventory)) {
-                event.setCancelled(true);
-            }
-        }
-    }
-
-    @EventHandler
-    static void onInventoryInteract(InventoryInteractEvent event) {
-        if(CommonEventHandlers.isInPixelWorld(event.getWhoClicked().getWorld())) {
-            if(!(event.getInventory() instanceof PlayerInventory) && !(event.getInventory() instanceof CraftingInventory)) {
-                event.setCancelled(true);
-            }
-        }
-    }
-
-    @EventHandler
-    static void onInventoryPickupItem(InventoryPickupItemEvent event) {
-        if(CommonEventHandlers.isInPixelWorld(event.getItem().getWorld())
-            && event.getInventory().getType() == InventoryType.HOPPER) {
-            event.setCancelled(true);
-        }
-    }
-}
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlacePixelListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlacePixelListener.java
index 008b3bb..3130016 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlacePixelListener.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlacePixelListener.java
@@ -1,27 +1,27 @@
 package eu.mhsl.minecraft.pixelblocks.listeners;
 
-import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock;
-import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlockWorld;
-import org.bukkit.Location;
-import org.bukkit.World;
+import eu.mhsl.minecraft.pixelblocks.utils.EventCanceling;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.block.BlockPlaceEvent;
-
-import java.util.Objects;
+import org.bukkit.event.player.PlayerBucketEmptyEvent;
 
 public class PlacePixelListener implements Listener {
     @EventHandler
     static void onBlockPlace(BlockPlaceEvent event) {
-        World world = event.getBlock().getWorld();
-        if(!PixelBlockWorld.isPixelWorld(world)) return;
+        EventCanceling.shouldCancelInPixelBlock(
+            event,
+            event.getBlock().getWorld(),
+            pixelBlock -> !pixelBlock.getPixelWorld().allowPlacements(event.getBlock().getLocation())
+        );
+    }
 
-        PixelBlock pixelBlock = PixelBlock.getPixelBlockFromBlockWorld(world);
-        Objects.requireNonNull(pixelBlock);
-
-        PixelBlockWorld pixelBlockWorld = pixelBlock.getPixelWorld();
-
-        Location blockLocation = event.getBlock().getLocation();
-        if(!pixelBlockWorld.allowPlacements(blockLocation)) event.setCancelled(true);
+    @EventHandler
+    static void onBuketEmpty(PlayerBucketEmptyEvent event) {
+        EventCanceling.shouldCancelInPixelBlock(
+                event,
+                event.getBlock().getWorld(),
+                pixelBlock -> !pixelBlock.getPixelWorld().allowPlacements(event.getBlock().getLocation())
+        );
     }
 }
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventEntityPlacementListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventEntityPlacementListener.java
new file mode 100644
index 0000000..9e672ab
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventEntityPlacementListener.java
@@ -0,0 +1,13 @@
+package eu.mhsl.minecraft.pixelblocks.listeners;
+
+import eu.mhsl.minecraft.pixelblocks.utils.EventCanceling;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityPlaceEvent;
+
+public class PreventEntityPlacementListener implements Listener {
+    @EventHandler
+    public static void preventPlace(EntityPlaceEvent event) {
+        EventCanceling.cancelIfInPixelWorld(event, event.getBlock().getWorld());
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventHopperActionsListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventHopperActionsListener.java
new file mode 100644
index 0000000..d349a40
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventHopperActionsListener.java
@@ -0,0 +1,18 @@
+package eu.mhsl.minecraft.pixelblocks.listeners;
+
+import eu.mhsl.minecraft.pixelblocks.utils.EventCanceling;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.InventoryPickupItemEvent;
+import org.bukkit.event.inventory.InventoryType;
+
+public class PreventHopperActionsListener implements Listener {
+    @EventHandler
+    static void onInventoryPickupItem(InventoryPickupItemEvent event) {
+        EventCanceling.shouldCancelInPixelBlock(
+            event,
+            event.getItem().getWorld(),
+            (pixelBlock) -> event.getInventory().getType() == InventoryType.HOPPER
+        );
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventIllegalBlocksListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventIllegalBlocksListener.java
new file mode 100644
index 0000000..1b56d95
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventIllegalBlocksListener.java
@@ -0,0 +1,31 @@
+package eu.mhsl.minecraft.pixelblocks.listeners;
+
+import eu.mhsl.minecraft.pixelblocks.utils.EventCanceling;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockExplodeEvent;
+import org.bukkit.event.entity.CreatureSpawnEvent;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.EntityExplodeEvent;
+
+public class PreventIllegalBlocksListener implements Listener {
+    @EventHandler
+    static void onBlockExplode(BlockExplodeEvent event) {
+        EventCanceling.cancelIfInPixelWorld(event, event.getBlock().getWorld());
+    }
+
+    @EventHandler
+    static void onCreatureSpawn(CreatureSpawnEvent event) {
+        EventCanceling.cancelIfInPixelWorld(event, event.getLocation().getWorld());
+    }
+
+    @EventHandler
+    static void onEntityDamage(EntityDamageEvent event) {
+        EventCanceling.cancelIfInPixelWorld(event, event.getEntity().getWorld());
+    }
+
+    @EventHandler
+    static void onEntityExplode(EntityExplodeEvent event) {
+        EventCanceling.cancelIfInPixelWorld(event, event.getLocation().getWorld());
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventInventorysListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventInventorysListener.java
new file mode 100644
index 0000000..dcec263
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventInventorysListener.java
@@ -0,0 +1,35 @@
+package eu.mhsl.minecraft.pixelblocks.listeners;
+
+import eu.mhsl.minecraft.pixelblocks.utils.EventCanceling;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.*;
+import org.bukkit.inventory.CraftingInventory;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.PlayerInventory;
+
+public class PreventInventorysListener implements Listener {
+    @EventHandler
+    static void onInventoryOpen(InventoryOpenEvent event) {
+        EventCanceling.shouldCancelInPixelBlock(
+            event,
+            event.getPlayer().getWorld(),
+            (pixelBlock) -> isDisallowedInventory(event.getInventory())
+        );
+    }
+
+    @EventHandler
+    static void onInventoryInteract(InventoryInteractEvent event) {
+        EventCanceling.shouldCancelInPixelBlock(
+            event,
+            event.getWhoClicked().getWorld(),
+            (pixelBlock) -> isDisallowedInventory(event.getInventory())
+        );
+    }
+
+    private static boolean isDisallowedInventory(Inventory inventory) {
+        return !(inventory instanceof PlayerInventory
+                || inventory instanceof CraftingInventory
+                || inventory.getType() == InventoryType.ENDER_CHEST);
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventLiquidsFlowListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventLiquidsFlowListener.java
new file mode 100644
index 0000000..79ccc4a
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventLiquidsFlowListener.java
@@ -0,0 +1,17 @@
+package eu.mhsl.minecraft.pixelblocks.listeners;
+
+import eu.mhsl.minecraft.pixelblocks.utils.EventCanceling;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockFromToEvent;
+
+public class PreventLiquidsFlowListener implements Listener {
+    @EventHandler
+    public static void onLiquidFlow(BlockFromToEvent event) {
+        EventCanceling.shouldCancelInPixelBlock(
+                event,
+                event.getToBlock().getWorld(),
+                pixelBlock -> !pixelBlock.getPixelWorld().allowPlacements(event.getToBlock().getLocation())
+        );
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventPistonsListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventPistonsListener.java
new file mode 100644
index 0000000..f9e8b28
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PreventPistonsListener.java
@@ -0,0 +1,19 @@
+package eu.mhsl.minecraft.pixelblocks.listeners;
+
+import eu.mhsl.minecraft.pixelblocks.utils.EventCanceling;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockPistonExtendEvent;
+
+public class PreventPistonsListener implements Listener {
+    @EventHandler
+    public static void blockPistons(BlockPistonExtendEvent event) {
+        EventCanceling.shouldCancelInPixelBlock(
+            event,
+            event.getBlock().getWorld(),
+            (pixelBlock) -> event.getBlocks().stream()
+                .anyMatch(block -> !pixelBlock.getPixelWorld()
+                        .allowPlacements(block.getLocation().add(event.getDirection().getDirection())))
+        );
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/utils/EventCanceling.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/utils/EventCanceling.java
new file mode 100644
index 0000000..9f5f975
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/utils/EventCanceling.java
@@ -0,0 +1,24 @@
+package eu.mhsl.minecraft.pixelblocks.utils;
+
+import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock;
+import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlockWorld;
+import org.bukkit.World;
+import org.bukkit.event.Cancellable;
+
+import java.util.Objects;
+import java.util.function.Function;
+
+public class EventCanceling {
+    public static void shouldCancelInPixelBlock(Cancellable event, World world, Function<PixelBlock, Boolean> callback) {
+        if(!PixelBlockWorld.isPixelWorld(world)) return;
+        PixelBlock pixelBlock = PixelBlock.getPixelBlockFromBlockWorld(world);
+        Objects.requireNonNull(pixelBlock);
+        if(callback.apply(pixelBlock)) event.setCancelled(true);
+    }
+
+    public static void cancelIfInPixelWorld(Cancellable event, World world) {
+        if(PixelBlockWorld.isPixelWorld(world)) {
+            event.setCancelled(true);
+        }
+    }
+}