diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
index ce063e2..471c5dc 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
@@ -5,6 +5,8 @@ import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker;
 import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages;
 import eu.mhsl.craftattack.spawn.appliances.countdown.Countdown;
 import eu.mhsl.craftattack.spawn.appliances.debug.Debug;
+import eu.mhsl.craftattack.spawn.appliances.event.Event;
+import eu.mhsl.craftattack.spawn.appliances.help.Help;
 import eu.mhsl.craftattack.spawn.appliances.report.Report;
 import eu.mhsl.craftattack.spawn.appliances.tablist.Tablist;
 import eu.mhsl.craftattack.spawn.appliances.titleClear.TitleClear;
@@ -35,12 +37,15 @@ public final class Main extends JavaPlugin {
                 new Tablist(),
                 new ChatMessages(),
                 new Report(),
+                new Event(),
+                new Help(),
                 new Debug()
         );
         Bukkit.getLogger().info("Loading appliances...");
         appliances.forEach(appliance -> {
-            appliance.initialize(this);
+            Bukkit.getLogger().info("Enabling " + appliance.getClass().getSimpleName());
             appliance.onEnable();
+            appliance.initialize(this);
         });
         Bukkit.getLogger().info("Loaded " + appliances.size() + " appliances!");
 
@@ -49,12 +54,15 @@ public final class Main extends JavaPlugin {
 
     @Override
     public void onDisable() {
+        Bukkit.getLogger().info("Disabling appliances...");
         appliances.forEach(appliance -> {
+            Bukkit.getLogger().info("Disabling " + appliance.getClass().getSimpleName());
             appliance.onDisable();
             appliance.destruct(this);
         });
         HandlerList.unregisterAll(this);
         Bukkit.getScheduler().cancelTasks(this);
+        Bukkit.getLogger().info("Disabled " + appliances.size() + " appliances!");
     }
 
     public <T extends Appliance> T getAppliance(Class<T> clazz) {
@@ -66,6 +74,9 @@ public final class Main extends JavaPlugin {
         return (Class<T>) ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0];
     }
 
+    public List<Appliance> getAppliances() {
+        return appliances;
+    }
 
     public static Main instance() {
         return instance;
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java
index 937ad9a..92b4a5b 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java
@@ -1,6 +1,5 @@
 package eu.mhsl.craftattack.spawn.appliance;
 
-import eu.mhsl.craftattack.spawn.Main;
 import net.kyori.adventure.text.Component;
 import net.kyori.adventure.text.format.NamedTextColor;
 import org.bukkit.Bukkit;
@@ -18,12 +17,10 @@ import java.util.Optional;
 /**
  * Utility class which enables command name definition over a constructor.
  */
-public abstract class ApplianceCommand<T extends Appliance> implements ApplianceSupplier<T>, TabCompleter, CommandExecutor {
+public abstract class ApplianceCommand<T extends Appliance> extends ApplianceSupplier<T> implements TabCompleter, CommandExecutor {
     public String commandName;
-    private final T appliance;
-    protected Component errorMessage = Component.text("Error whilst executing command").color(NamedTextColor.RED);
+    protected Component errorMessage = Component.text("Fehler: ").color(NamedTextColor.RED);
     public ApplianceCommand(String command) {
-        this.appliance = Main.instance().getAppliance(Main.getApplianceType(getClass()));
         this.commandName = command;
     }
 
@@ -36,9 +33,11 @@ public abstract class ApplianceCommand<T extends Appliance> implements Appliance
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
         try {
             execute(sender, command, label, args);
+        } catch (Error e) {
+            sender.sendMessage(errorMessage.append(Component.text(e.getMessage())));
         } catch (Exception e) {
-            sender.sendMessage(errorMessage);
-            Bukkit.getLogger().warning("Error executing appliance command " + commandName + " with " + e.getMessage());
+            sender.sendMessage(errorMessage.append(Component.text("Interner Fehler")));
+            Bukkit.getLogger().warning("Error executing appliance command " + commandName + ": " + e.getMessage());
             e.printStackTrace(System.err);
             return false;
         }
@@ -56,17 +55,12 @@ public abstract class ApplianceCommand<T extends Appliance> implements Appliance
 
     protected abstract void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args);
 
-    @Override
-    public T getAppliance() {
-        return appliance;
-    }
-
     /**
      * Utility class for command which can only be used as a Player. You can access the executing player with the getPlayer() method.
      */
     public static abstract class PlayerChecked<T extends Appliance> extends ApplianceCommand<T> {
         private Player player;
-        private Component notPlayerMessage = Component.text("This command can only be executed as an Player!").color(NamedTextColor.RED);
+        private Component notPlayerMessage = Component.text("Dieser Command kann nur von Spielern ausgeführt werden!").color(NamedTextColor.RED);
         public PlayerChecked(String command) {
             super(command);
         }
@@ -95,4 +89,10 @@ public abstract class ApplianceCommand<T extends Appliance> implements Appliance
             return this.player;
         }
     }
+
+    public static class Error extends RuntimeException {
+        public Error(String message) {
+            super(message);
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java
index 5203381..b8268fb 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java
@@ -1,6 +1,5 @@
 package eu.mhsl.craftattack.spawn.appliance;
 
-import eu.mhsl.craftattack.spawn.Main;
 import org.bukkit.event.Listener;
 
 /**
@@ -8,14 +7,6 @@ import org.bukkit.event.Listener;
  * You can access the appliance with the protected 'appliance' field.
  * @param <T> the type of your appliance
  */
-public abstract class ApplianceListener<T extends Appliance> implements ApplianceSupplier<T>, Listener {
-    private final T appliance;
-    protected ApplianceListener() {
-        this.appliance = Main.instance().getAppliance(Main.getApplianceType(getClass()));
-    }
+public abstract class ApplianceListener<T extends Appliance> extends ApplianceSupplier<T> implements Listener {
 
-    @Override
-    public T getAppliance() {
-        return appliance;
-    }
 }
\ No newline at end of file
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceSupplier.java b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceSupplier.java
index f4094a8..28773d3 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceSupplier.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceSupplier.java
@@ -1,5 +1,16 @@
 package eu.mhsl.craftattack.spawn.appliance;
 
-public interface ApplianceSupplier<T extends Appliance> {
-    T getAppliance();
+import eu.mhsl.craftattack.spawn.Main;
+
+public class ApplianceSupplier<T extends Appliance> implements IApplianceSupplier<T> {
+    private final T appliance;
+
+    public ApplianceSupplier() {
+        this.appliance = Main.instance().getAppliance(Main.getApplianceType(getClass()));
+    }
+
+    @Override
+    public T getAppliance() {
+        return this.appliance;
+    }
 }
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java b/src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java
new file mode 100644
index 0000000..8c8bbde
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java
@@ -0,0 +1,5 @@
+package eu.mhsl.craftattack.spawn.appliance;
+
+public interface IApplianceSupplier<T extends Appliance> {
+    T getAppliance();
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java
index 4b1e94e..1364ac3 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java
@@ -2,6 +2,7 @@ package eu.mhsl.craftattack.spawn.appliances.debug;
 
 import eu.mhsl.craftattack.spawn.appliance.Appliance;
 import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.debug.command.AppliancesCommand;
 import eu.mhsl.craftattack.spawn.appliances.debug.command.UserInfoCommand;
 import org.jetbrains.annotations.NotNull;
 
@@ -9,6 +10,9 @@ import java.util.List;
 public class Debug extends Appliance {
     @Override
     protected @NotNull List<ApplianceCommand<?>> commands() {
-        return List.of(new UserInfoCommand());
+        return List.of(
+                new UserInfoCommand(),
+                new AppliancesCommand()
+        );
     }
 }
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/AppliancesCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/AppliancesCommand.java
new file mode 100644
index 0000000..e8e9a60
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/AppliancesCommand.java
@@ -0,0 +1,30 @@
+package eu.mhsl.craftattack.spawn.appliances.debug.command;
+
+import eu.mhsl.craftattack.spawn.Main;
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.debug.Debug;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.ComponentBuilder;
+import net.kyori.adventure.text.TextComponent;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.stream.Collectors;
+
+public class AppliancesCommand extends ApplianceCommand<Debug> {
+    public AppliancesCommand() {
+        super("appliances");
+    }
+
+    @Override
+    protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        ComponentBuilder<TextComponent, TextComponent.Builder> componentBuilder = Component.text()
+                .append(Component.text(Main.instance().getAppliances().size()))
+                .append(Component.text(" appliances loaded:"))
+                .appendNewline()
+                .append(Component.text(Main.instance().getAppliances().stream().map(appliance -> appliance.getClass().getSimpleName()).collect(Collectors.joining(", "))));
+
+        sender.sendMessage(componentBuilder.build());
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java
new file mode 100644
index 0000000..1b805ce
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java
@@ -0,0 +1,78 @@
+package eu.mhsl.craftattack.spawn.appliances.event;
+
+import eu.mhsl.craftattack.spawn.appliance.Appliance;
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.event.command.EventCommand;
+import eu.mhsl.craftattack.spawn.appliances.event.command.EventEndSessionCommand;
+import eu.mhsl.craftattack.spawn.appliances.event.command.EventOpenSessionCommand;
+import eu.mhsl.craftattack.spawn.appliances.event.command.MoveEventVillagerCommand;
+import eu.mhsl.craftattack.spawn.util.DisplayVillager;
+import eu.mhsl.craftattack.spawn.util.PluginMessage;
+import eu.mhsl.craftattack.spawn.util.commonListeners.DismissInventoryOpenFromHolder;
+import eu.mhsl.craftattack.spawn.util.commonListeners.PlayerInteractAtEntityEventListener;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
+import org.bukkit.entity.Player;
+import org.bukkit.entity.Villager;
+import org.bukkit.event.Listener;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class Event extends Appliance {
+    public DisplayVillager.ConfigBound villager;
+    private boolean isOpen = false;
+
+    public Event() {
+        super("event");
+    }
+
+    @Override
+    public void onEnable() {
+        this.villager = new DisplayVillager.ConfigBound(
+                localConfig(),
+                villager -> {
+                    villager.customName(Component.text("Events", NamedTextColor.GOLD));
+                    villager.setProfession(Villager.Profession.LIBRARIAN);
+                    villager.setVillagerType(Villager.Type.SNOW);
+                }
+        );
+    }
+
+    public void openEvent() {
+        if(isOpen) throw new ApplianceCommand.Error("Es läuft derzeit bereits ein Event!");
+        isOpen = true;
+    }
+
+    public void joinEvent(Player p) {
+        if(!isOpen) {
+            p.sendMessage(Component.text("Zurzeit ist kein Event geöffnet.", NamedTextColor.RED));
+            return;
+        }
+
+        PluginMessage.connect(p, localConfig().getString("connect-server-name"));
+    }
+
+    public void endEvent() {
+        if(!isOpen) throw new ApplianceCommand.Error("Es läuft derzeit kein Event!");
+        isOpen = false;
+    }
+
+    @Override
+    protected @NotNull List<ApplianceCommand<?>> commands() {
+        return List.of(
+                new EventCommand(),
+                new MoveEventVillagerCommand(),
+                new EventOpenSessionCommand(),
+                new EventEndSessionCommand()
+        );
+    }
+
+    @Override
+    protected @NotNull List<Listener> eventHandlers() {
+        return List.of(
+                new PlayerInteractAtEntityEventListener(this.villager.getUniqueId(), playerInteractAtEntityEvent -> joinEvent(playerInteractAtEntityEvent.getPlayer())),
+                new DismissInventoryOpenFromHolder(this.villager.getUniqueId())
+        );
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventCommand.java
new file mode 100644
index 0000000..0473883
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventCommand.java
@@ -0,0 +1,18 @@
+package eu.mhsl.craftattack.spawn.appliances.event.command;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.event.Event;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+public class EventCommand extends ApplianceCommand.PlayerChecked<Event> {
+    public EventCommand() {
+        super("event");
+    }
+
+    @Override
+    protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        getAppliance().joinEvent(getPlayer());
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventEndSessionCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventEndSessionCommand.java
new file mode 100644
index 0000000..018bfd0
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventEndSessionCommand.java
@@ -0,0 +1,18 @@
+package eu.mhsl.craftattack.spawn.appliances.event.command;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.event.Event;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+public class EventEndSessionCommand extends ApplianceCommand<Event> {
+    public EventEndSessionCommand() {
+        super("eventEndSession");
+    }
+
+    @Override
+    protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        getAppliance().endEvent();
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventOpenSessionCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventOpenSessionCommand.java
new file mode 100644
index 0000000..be06bb6
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventOpenSessionCommand.java
@@ -0,0 +1,18 @@
+package eu.mhsl.craftattack.spawn.appliances.event.command;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.event.Event;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+public class EventOpenSessionCommand extends ApplianceCommand<Event> {
+    public EventOpenSessionCommand() {
+        super("eventOpenSession");
+    }
+
+    @Override
+    protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        getAppliance().openEvent();
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/MoveEventVillagerCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/MoveEventVillagerCommand.java
new file mode 100644
index 0000000..b1f3428
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/MoveEventVillagerCommand.java
@@ -0,0 +1,18 @@
+package eu.mhsl.craftattack.spawn.appliances.event.command;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.event.Event;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+public class MoveEventVillagerCommand extends ApplianceCommand.PlayerChecked<Event> {
+    public MoveEventVillagerCommand() {
+        super("moveEventVillager");
+    }
+
+    @Override
+    protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        getAppliance().villager.updateLocation(getPlayer().getLocation());
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/Help.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/Help.java
new file mode 100644
index 0000000..2b2bbad
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/Help.java
@@ -0,0 +1,25 @@
+package eu.mhsl.craftattack.spawn.appliances.help;
+
+import eu.mhsl.craftattack.spawn.appliance.Appliance;
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.help.command.HelpCommand;
+import eu.mhsl.craftattack.spawn.appliances.help.command.SpawnCommand;
+import eu.mhsl.craftattack.spawn.appliances.help.command.TeamspeakCommand;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class Help extends Appliance {
+    public Help() {
+        super("help");
+    }
+
+    @Override
+    protected @NotNull List<ApplianceCommand<?>> commands() {
+        return List.of(
+                new HelpCommand(),
+                new SpawnCommand(),
+                new TeamspeakCommand()
+        );
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/HelpCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/HelpCommand.java
new file mode 100644
index 0000000..83af74b
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/HelpCommand.java
@@ -0,0 +1,24 @@
+package eu.mhsl.craftattack.spawn.appliances.help.command;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.help.Help;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+public class HelpCommand extends ApplianceCommand<Help> {
+    public HelpCommand() {
+        super("help");
+    }
+
+    @Override
+    protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        sender.sendMessage(
+                Component.text("Willkommen auf Craftattack!", NamedTextColor.GOLD)
+                        .appendNewline()
+                        .append(Component.text("Hier ist ein Hilfetext!", NamedTextColor.GRAY))
+        );
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/SpawnCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/SpawnCommand.java
new file mode 100644
index 0000000..d912e8b
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/SpawnCommand.java
@@ -0,0 +1,24 @@
+package eu.mhsl.craftattack.spawn.appliances.help.command;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.help.Help;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public class SpawnCommand extends ApplianceCommand<Help> {
+    private static final String spawnKey = "spawn";
+    public SpawnCommand() {
+        super("spawn");
+    }
+
+    @Override
+    protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        if(!getAppliance().localConfig().isString(spawnKey)) throw new ApplianceCommand.Error("Es wurde kein Spawnbereich hinterlegt!");
+        sender.sendMessage(Component.text(Objects.requireNonNull(getAppliance().localConfig().getString(spawnKey)), NamedTextColor.GOLD));
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/TeamspeakCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/TeamspeakCommand.java
new file mode 100644
index 0000000..6326e7c
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/TeamspeakCommand.java
@@ -0,0 +1,32 @@
+package eu.mhsl.craftattack.spawn.appliances.help.command;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.help.Help;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+public class TeamspeakCommand extends ApplianceCommand<Help> {
+    private static final String teamspeakKey = "teamspeak";
+    public TeamspeakCommand() {
+        super("teamspeak");
+    }
+
+    @Override
+    protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        if(!getAppliance().localConfig().isString(teamspeakKey)) throw new ApplianceCommand.Error("Es wurde kein Teamspeak hinterlegt!");
+        sender.sendMessage(
+                Component.text()
+                        .append(Component.text("Joine unserem Teamspeak: ", NamedTextColor.GOLD))
+                        .append(getTeamspeakIp(getAppliance().localConfig().getString(teamspeakKey)))
+        );
+    }
+
+    private Component getTeamspeakIp(String ip) {
+        return Component.text()
+                .append(Component.text(ip, NamedTextColor.AQUA))
+                .build();
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/WorldMuseum.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/WorldMuseum.java
index d0efee6..4d56b63 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/WorldMuseum.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/WorldMuseum.java
@@ -2,13 +2,11 @@ package eu.mhsl.craftattack.spawn.appliances.worldmuseum;
 
 import eu.mhsl.craftattack.spawn.appliance.Appliance;
 import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
-import eu.mhsl.craftattack.spawn.appliances.worldmuseum.listener.InventoryOpenListener;
-import eu.mhsl.craftattack.spawn.config.ConfigUtil;
-import eu.mhsl.craftattack.spawn.config.Configuration;
 import eu.mhsl.craftattack.spawn.appliances.worldmuseum.command.MoveWorldMuseumVillagerCommand;
-import eu.mhsl.craftattack.spawn.appliances.worldmuseum.listener.PlayerEntityInteractListener;
 import eu.mhsl.craftattack.spawn.util.DisplayVillager;
 import eu.mhsl.craftattack.spawn.util.PluginMessage;
+import eu.mhsl.craftattack.spawn.util.commonListeners.DismissInventoryOpenFromHolder;
+import eu.mhsl.craftattack.spawn.util.commonListeners.PlayerInteractAtEntityEventListener;
 import net.kyori.adventure.text.Component;
 import net.kyori.adventure.text.format.NamedTextColor;
 import org.bukkit.Bukkit;
@@ -18,11 +16,9 @@ import org.bukkit.event.Listener;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.List;
-import java.util.Objects;
-import java.util.UUID;
 
 public class WorldMuseum extends Appliance {
-    public DisplayVillager villager;
+    public DisplayVillager.ConfigBound villager;
 
     public WorldMuseum() {
         super("worldMuseum");
@@ -30,28 +26,17 @@ public class WorldMuseum extends Appliance {
 
     @Override
     public void onEnable() {
-        Location location = ConfigUtil.Position.paseLocation(Objects.requireNonNull(localConfig().getConfigurationSection("villagerLocation")));
-        this.villager = new DisplayVillager(
-                UUID.fromString(localConfig().getString("uuid", UUID.randomUUID().toString())),
-                location,
+        this.villager = new DisplayVillager.ConfigBound(
+                localConfig(),
                 villager -> {
-                    localConfig().set("uuid", villager.getUniqueId().toString());
-                    Configuration.saveChanges();
-
-                    villager.customName(Component.text("Weltenansicht").color(NamedTextColor.GOLD));
-                    villager.setProfession(Villager.Profession.LIBRARIAN);
-                    villager.setVillagerType(Villager.Type.SAVANNA);
+                    villager.customName(Component.text("Museum der Welten").color(NamedTextColor.GOLD));
+                    villager.setProfession(Villager.Profession.CARTOGRAPHER);
+                    villager.setVillagerType(Villager.Type.SNOW);
                 }
         );
     }
     public void updateVillagerPosition(Location location) {
-        ConfigUtil.Position.writeLocation(
-                Objects.requireNonNull(localConfig().getConfigurationSection("villagerLocation")),
-                location
-        );
-        Configuration.saveChanges();
-
-        this.villager.getVillager().teleport(location);
+        this.villager.updateLocation(location);
     }
 
     public void handleVillagerInteraction(Player player) {
@@ -67,8 +52,8 @@ public class WorldMuseum extends Appliance {
     @Override
     protected @NotNull List<Listener> eventHandlers() {
         return List.of(
-                new PlayerEntityInteractListener(),
-                new InventoryOpenListener()
+                new PlayerInteractAtEntityEventListener(this.villager.getUniqueId(), playerInteractAtEntityEvent -> handleVillagerInteraction(playerInteractAtEntityEvent.getPlayer())),
+                new DismissInventoryOpenFromHolder(this.villager.getUniqueId())
         );
     }
 }
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/InventoryOpenListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/InventoryOpenListener.java
deleted file mode 100644
index baedf5f..0000000
--- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/InventoryOpenListener.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package eu.mhsl.craftattack.spawn.appliances.worldmuseum.listener;
-
-import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
-import eu.mhsl.craftattack.spawn.appliances.worldmuseum.WorldMuseum;
-import org.bukkit.entity.Villager;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.inventory.InventoryOpenEvent;
-
-public class InventoryOpenListener extends ApplianceListener<WorldMuseum> {
-    @EventHandler
-    public void onInventoryOpen(InventoryOpenEvent event) {
-        if(event.getInventory().getHolder() instanceof Villager villager) {
-            event.setCancelled(villager.getUniqueId().equals(getAppliance().villager.getVillager().getUniqueId()));
-        }
-    }
-}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/PlayerEntityInteractListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/PlayerEntityInteractListener.java
deleted file mode 100644
index 364e70d..0000000
--- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/PlayerEntityInteractListener.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package eu.mhsl.craftattack.spawn.appliances.worldmuseum.listener;
-
-import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
-import eu.mhsl.craftattack.spawn.appliances.worldmuseum.WorldMuseum;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerInteractAtEntityEvent;
-
-public class PlayerEntityInteractListener extends ApplianceListener<WorldMuseum> {
-    @EventHandler
-    public void onInteract(PlayerInteractAtEntityEvent event) {
-        if (!event.getRightClicked().getUniqueId().equals(getAppliance().villager.getVillager().getUniqueId())) return;
-
-        event.setCancelled(true);
-        getAppliance().handleVillagerInteraction(event.getPlayer());
-    }
-}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/DisplayVillager.java b/src/main/java/eu/mhsl/craftattack/spawn/util/DisplayVillager.java
index 3483628..6f62fcc 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/util/DisplayVillager.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/util/DisplayVillager.java
@@ -1,6 +1,9 @@
 package eu.mhsl.craftattack.spawn.util;
 
+import eu.mhsl.craftattack.spawn.config.ConfigUtil;
+import eu.mhsl.craftattack.spawn.config.Configuration;
 import org.bukkit.Location;
+import org.bukkit.configuration.ConfigurationSection;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Villager;
 
@@ -43,4 +46,42 @@ public class DisplayVillager {
         villager.setCustomNameVisible(true);
         return villager;
     }
+
+    public static class ConfigBound {
+        private final DisplayVillager villager;
+        private final ConfigurationSection config;
+        public ConfigBound(ConfigurationSection configurationSection, Consumer<Villager> villagerCreator) {
+            this.config = configurationSection;
+
+            Location location = ConfigUtil.Position.paseLocation(Objects.requireNonNull(this.config.getConfigurationSection("villagerLocation")));
+            this.villager = new DisplayVillager(
+                    UUID.fromString(this.config.getString("uuid", UUID.randomUUID().toString())),
+                    location,
+                    villager -> {
+                        this.config.set("uuid", villager.getUniqueId().toString());
+                        Configuration.saveChanges();
+
+                        villagerCreator.accept(villager);
+                    }
+            );
+        }
+
+        public void updateLocation(Location location) {
+            ConfigUtil.Position.writeLocation(
+                    Objects.requireNonNull(this.config.getConfigurationSection("villagerLocation")),
+                    location
+            );
+            Configuration.saveChanges();
+
+            this.villager.getVillager().teleport(location);
+        }
+
+        public Villager getVillager() {
+            return villager.getVillager();
+        }
+
+        public UUID getUniqueId() {
+            return getVillager().getUniqueId();
+        }
+    }
 }
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/DismissInventoryOpenFromHolder.java b/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/DismissInventoryOpenFromHolder.java
new file mode 100644
index 0000000..4acf048
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/DismissInventoryOpenFromHolder.java
@@ -0,0 +1,23 @@
+package eu.mhsl.craftattack.spawn.util.commonListeners;
+
+import org.bukkit.entity.Entity;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.InventoryOpenEvent;
+
+import java.util.UUID;
+
+public class DismissInventoryOpenFromHolder implements Listener {
+    private final UUID inventoryHolder;
+
+    public DismissInventoryOpenFromHolder(UUID inventoryHolder) {
+        this.inventoryHolder = inventoryHolder;
+    }
+
+    @EventHandler
+    public void onInventoryOpen(InventoryOpenEvent event) {
+        if(event.getInventory().getHolder() instanceof Entity holder) {
+            if(holder.getUniqueId().equals(this.inventoryHolder)) event.setCancelled(true);
+        }
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/PlayerInteractAtEntityEventListener.java b/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/PlayerInteractAtEntityEventListener.java
new file mode 100644
index 0000000..d9bd98f
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/PlayerInteractAtEntityEventListener.java
@@ -0,0 +1,24 @@
+package eu.mhsl.craftattack.spawn.util.commonListeners;
+
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerInteractAtEntityEvent;
+
+import java.util.UUID;
+import java.util.function.Consumer;
+
+public class PlayerInteractAtEntityEventListener implements Listener {
+    private final UUID interactableEntityUUID;
+    private final Consumer<PlayerInteractAtEntityEvent> callback;
+
+    public PlayerInteractAtEntityEventListener(UUID interactableEntityUUID, Consumer<PlayerInteractAtEntityEvent> callback) {
+        this.interactableEntityUUID = interactableEntityUUID;
+        this.callback = callback;
+    }
+
+    @EventHandler
+    public void onInteract(PlayerInteractAtEntityEvent event) {
+        if (!event.getRightClicked().getUniqueId().equals(this.interactableEntityUUID)) return;
+        this.callback.accept(event);
+    }
+}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 375640f..9a163d5 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,5 +1,4 @@
 worldMuseum:
-  enabled: false
   uuid:
   connect-server-name: worldmuseum
   villagerLocation:
@@ -23,3 +22,19 @@ countdown:
 
 report:
   api: https://mhsl.eu/craftattack/report
+
+event:
+  api: http://10.20.0.1/
+  connect-server-name: event
+  uuid:
+  villagerLocation:
+    world: world
+    x: 0
+    y: 0
+    z: 0
+    yaw: 0
+    pitch: 0
+
+help:
+  teamspeak: myserver.com
+  spawn: "Der Weltspawn befindet sich bei x:0 y:0 z:0"
\ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index dbaee46..f77aa01 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -18,3 +18,12 @@ commands:
     description: Cancels project countdown
   projectStartReset:
     description: Resets project countdown
+  moveEventVillager:
+  appliances:
+  event:
+  eventOpenSession:
+  eventEndSession:
+  help:
+  spawn:
+  teamspeak:
+    aliases: ["ts"]