diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
index 54567ea..3cee928 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
@@ -16,6 +16,7 @@ import eu.mhsl.craftattack.spawn.appliances.fleischerchest.Fleischerchest;
 import eu.mhsl.craftattack.spawn.appliances.help.Help;
 import eu.mhsl.craftattack.spawn.appliances.hotbarRefill.HotbarRefill;
 import eu.mhsl.craftattack.spawn.appliances.kick.Kick;
+import eu.mhsl.craftattack.spawn.appliances.knockDoor.KnockDoor;
 import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed;
 import eu.mhsl.craftattack.spawn.appliances.panicBan.PanicBan;
 import eu.mhsl.craftattack.spawn.appliances.playerlimit.PlayerLimit;
@@ -77,7 +78,8 @@ public final class Main extends JavaPlugin {
             new AntiSignEdit(),
             new HotbarRefill(),
             new ChatMention(),
-            new DoubleDoor()
+            new DoubleDoor(),
+            new KnockDoor()
         );
 
         Main.logger.info("Loading appliances...");
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoor.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoor.java
new file mode 100644
index 0000000..1b5219b
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoor.java
@@ -0,0 +1,61 @@
+package eu.mhsl.craftattack.spawn.appliances.knockDoor;
+
+import eu.mhsl.craftattack.spawn.Main;
+import eu.mhsl.craftattack.spawn.appliance.Appliance;
+import eu.mhsl.craftattack.spawn.appliances.settings.Settings;
+import eu.mhsl.craftattack.spawn.appliances.settings.datatypes.SelectSetting;
+import eu.mhsl.craftattack.spawn.appliances.settings.settings.KnockDoorSetting;
+import org.bukkit.*;
+import org.bukkit.block.Block;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Listener;
+import org.bukkit.metadata.FixedMetadataValue;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class KnockDoor extends Appliance {
+    public void knockAtDoor(Player knockingPlayer, Block knockedBlock) {
+        SelectSetting.Options.Option setting = Settings.instance().getSetting(knockingPlayer, Settings.Key.KnockDoors, SelectSetting.Options.Option.class);
+        if(setting.is(KnockDoorSetting.disabled)) return;
+
+        if(setting.is(KnockDoorSetting.knockSingleTime)) {
+            playSound(knockedBlock);
+        }
+
+        if(setting.is(KnockDoorSetting.knockThreeTimes)) {
+            String metadataKey = new NamespacedKey(Main.instance(), KnockDoor.class.getName()).getNamespace();
+            if(knockingPlayer.hasMetadata(metadataKey)) return;
+            knockingPlayer.setMetadata(metadataKey, new FixedMetadataValue(Main.instance(), 0));
+
+            new BukkitRunnable() {
+                @Override
+                public void run() {
+                    int timesKnocked = knockingPlayer.getMetadata(metadataKey).getFirst().asInt();
+                    if(timesKnocked >= 3) {
+                        knockingPlayer.removeMetadata(metadataKey, Main.instance());
+                        cancel();
+                        return;
+                    }
+                    playSound(knockedBlock);
+                    knockingPlayer.setMetadata(metadataKey, new FixedMetadataValue(Main.instance(), timesKnocked + 1));
+                }
+            }.runTaskTimer(Main.instance(), 0, 8);
+        }
+    }
+
+    private void playSound(Block knockedBlock) {
+        Location knockLocation = knockedBlock.getLocation();
+        Sound sound = knockedBlock.getType() == Material.IRON_DOOR
+            ? Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR
+            : Sound.ITEM_SHIELD_BLOCK;
+
+        knockLocation.getWorld().playSound(knockLocation, sound, SoundCategory.PLAYERS, 1f, 1f);
+    }
+
+    @Override
+    protected @NotNull List<Listener> eventHandlers() {
+        return List.of(new KnockDoorListener());
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoorListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoorListener.java
new file mode 100644
index 0000000..701be50
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoorListener.java
@@ -0,0 +1,25 @@
+package eu.mhsl.craftattack.spawn.appliances.knockDoor;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
+import org.bukkit.GameMode;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.type.Door;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.EquipmentSlot;
+
+import java.util.Objects;
+
+public class KnockDoorListener extends ApplianceListener<KnockDoor> {
+    @EventHandler
+    public void onKnock(PlayerInteractEvent event) {
+        if(!event.getAction().equals(Action.LEFT_CLICK_BLOCK)) return;
+        if(!Objects.equals(event.getHand(), EquipmentSlot.HAND)) return;
+        if(event.getPlayer().getGameMode() != GameMode.SURVIVAL) return;
+        Block block = event.getClickedBlock();
+        if(block == null) return;
+        if(!(block.getBlockData() instanceof Door)) return;
+        getAppliance().knockAtDoor(event.getPlayer(), block);
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/Settings.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/Settings.java
index 6d5be39..d674ea1 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/Settings.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/Settings.java
@@ -32,6 +32,7 @@ public class Settings extends Appliance {
         HotbarReplacer,
         ChatMentions,
         DoubleDoors,
+        KnockDoors,
     }
 
     public static Settings instance() {
@@ -59,7 +60,8 @@ public class Settings extends Appliance {
             new ShowJoinAndLeaveMessagesSetting(),
             new TechnicalTablistSetting(),
             new SettingsShortcutSetting(),
-            new DoubleDoorSetting()
+            new DoubleDoorSetting(),
+            new KnockDoorSetting()
         );
 
         settings.forEach(setting -> setting.initializeFromPlayer(player));
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/KnockDoorSetting.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/KnockDoorSetting.java
new file mode 100644
index 0000000..c87b123
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/KnockDoorSetting.java
@@ -0,0 +1,50 @@
+package eu.mhsl.craftattack.spawn.appliances.settings.settings;
+
+import eu.mhsl.craftattack.spawn.appliances.settings.CategorizedSetting;
+import eu.mhsl.craftattack.spawn.appliances.settings.SettingCategory;
+import eu.mhsl.craftattack.spawn.appliances.settings.Settings;
+import eu.mhsl.craftattack.spawn.appliances.settings.datatypes.SelectSetting;
+import org.bukkit.Material;
+import org.bukkit.NamespacedKey;
+
+import java.util.List;
+import java.util.Locale;
+
+public class KnockDoorSetting extends SelectSetting implements CategorizedSetting {
+    private static final String namespace = KnockDoorSetting.class.getSimpleName().toLowerCase(Locale.ROOT);
+    public static Options.Option disabled = new Options.Option("Deaktiviert", new NamespacedKey(namespace, "disabled"));
+    public static Options.Option knockSingleTime = new Options.Option("Einmal an der Tür anklopfen", new NamespacedKey(namespace, "single"));
+    public static Options.Option knockThreeTimes = new Options.Option("Dreimal an der Tür anklopfen", new NamespacedKey(namespace, "three"));
+
+    public KnockDoorSetting() {
+        super(
+            Settings.Key.KnockDoors,
+            new Options(List.of(disabled, knockSingleTime, knockThreeTimes))
+        );
+    }
+
+    @Override
+    public SettingCategory category() {
+        return SettingCategory.Gameplay;
+    }
+
+    @Override
+    protected String title() {
+        return "Klopfen an Türen";
+    }
+
+    @Override
+    protected String description() {
+        return "Klopft durch das schlagen an eine Tür an.";
+    }
+
+    @Override
+    protected Material icon() {
+        return Material.BELL;
+    }
+
+    @Override
+    protected Options.Option defaultValue() {
+        return disabled;
+    }
+}