diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..b26911b
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+  
+    
+  
+
\ No newline at end of file
diff --git a/.idea/saveactions_settings.xml b/.idea/saveactions_settings.xml
new file mode 100644
index 0000000..6025467
--- /dev/null
+++ b/.idea/saveactions_settings.xml
@@ -0,0 +1,13 @@
+
+
+  
+    
+    
+  
+
\ No newline at end of file
diff --git a/src/main/java/de/cliffbreak/core/CliffbreakCore.java b/src/main/java/de/cliffbreak/core/CliffbreakCore.java
index 4b0f0af..b60aecc 100644
--- a/src/main/java/de/cliffbreak/core/CliffbreakCore.java
+++ b/src/main/java/de/cliffbreak/core/CliffbreakCore.java
@@ -1,27 +1,77 @@
 package de.cliffbreak.core;
 
+import de.cliffbreak.core.classes.StatusSign;
 import de.cliffbreak.core.commands.CommandGM;
 import de.cliffbreak.core.commands.CommandHub;
+import de.cliffbreak.core.commands.CommandSign;
 import de.cliffbreak.core.commands.CommandSpeed;
 import de.cliffbreak.core.listeners.ChatListener;
 import de.cliffbreak.core.listeners.PlayerJoinListener;
+import de.cliffbreak.core.listeners.PlayerPortalListener;
+import de.cliffbreak.core.listeners.PlayerQuitListener;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
 import org.bukkit.configuration.file.FileConfiguration;
 import org.bukkit.configuration.file.YamlConfiguration;
 import org.bukkit.plugin.java.JavaPlugin;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
 
 public class CliffbreakCore extends JavaPlugin {
 
+    public ArrayList statusSigns = new ArrayList();
+
     public File cfgFile = new File("plugins/Core", "config.yml");
     public FileConfiguration cfg = YamlConfiguration.loadConfiguration(cfgFile);
 
+    @SuppressWarnings("unchecked")
     @Override
     public void onEnable() {
+
+        // Enable BungeeCord Messaging System
+        this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
+
         getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this);
+        getServer().getPluginManager().registerEvents(new PlayerQuitListener(), this);
         getServer().getPluginManager().registerEvents(new ChatListener(), this);
+        getServer().getPluginManager().registerEvents(new PlayerPortalListener(this), this);
         this.getCommand("gm").setExecutor(new CommandGM());
         this.getCommand("speed").setExecutor(new CommandSpeed());
         this.getCommand("hub").setExecutor(new CommandHub(this));
+        this.getCommand("sign").setExecutor(new CommandSign(this));
+
+        if (cfg.getList("Signs") == null || cfg.getList("Signs").isEmpty())
+            getLogger().info("No Signs registered. Skipping...");
+        else
+            for (Iterator i = cfg.getList("Signs").iterator(); i.hasNext(); ) {
+                Map sign = (Map) i.next();
+                getLogger().info("" + sign);
+
+                Map locationMap = ((Map) sign.get("location"));
+                Location location = new Location(
+                        Bukkit.getServer().getWorld((String) locationMap.get("world")),
+                        (double) (Integer) locationMap.get("x"),
+                        (double) (Integer) locationMap.get("y"),
+                        (double) (Integer) locationMap.get("z")
+                );
+                /* TODO: Add autoremoval
+                if (location.getBlock() == null || (location.getBlock().getState() instanceof Sign)) {
+                    getLogger().info("Nicht vorhandenes Schild wurde aus der Konfiguration entfernt. Position: " + location);
+                }*/
+
+                statusSigns.add(new StatusSign(location, (String) sign.get("host"), (Integer) sign.get("port"), (String) sign.get("name")));
+
+                Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
+                    @Override
+                    public void run() {
+                        for (StatusSign s : statusSigns) {
+                            s.update();
+                        }
+                    }
+                }, 0L, 5 * 20L);
+            }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/de/cliffbreak/core/classes/StatusSign.java b/src/main/java/de/cliffbreak/core/classes/StatusSign.java
new file mode 100644
index 0000000..5130522
--- /dev/null
+++ b/src/main/java/de/cliffbreak/core/classes/StatusSign.java
@@ -0,0 +1,83 @@
+package de.cliffbreak.core.classes;
+
+import org.bukkit.Location;
+import org.bukkit.block.Sign;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+
+public class StatusSign {
+
+    private Location location;
+    private Sign sign;
+    private String name, host;
+    private int port;
+
+    public StatusSign(Location location, String host, int port, String name) {
+        this.location = location;
+        this.sign = (Sign) location.getBlock().getState();
+        this.host = host;
+        this.port = port;
+        this.name = name;
+    }
+
+    public void update() {
+        try {
+            Socket socket = new Socket();
+            socket.connect(new InetSocketAddress(this.host, this.port), 500);
+            socket.setSoTimeout(500);
+
+            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
+            DataInputStream in = new DataInputStream(socket.getInputStream());
+
+            out.write(0xFE);
+
+            StringBuilder str = new StringBuilder();
+
+            int b;
+            while ((b = in.read()) != -1) {
+                if (b != 0 && b > 16 && b != 255 && b != 23 && b != 24) {
+                    str.append((char) b);
+                }
+            }
+
+            String[] data = str.toString().split("§");
+            //String motd = data[0];
+            int onlinePlayers = Integer.parseInt(data[1]);
+            int maxPlayers = Integer.parseInt(data[2]);
+
+            sign.setLine(0, "§2 ▒▒▒▒▒▒▒▒");
+            sign.setLine(1, "§b§l§o" + this.name.substring(0, 1).toUpperCase() + this.name.substring(1));
+            sign.setLine(2, "§f" + onlinePlayers + "§a/§f" + maxPlayers);
+            sign.setLine(3, "§2 ▒▒▒▒▒▒▒▒");
+
+            sign.update();
+            socket.close();
+        } catch (Exception e) {
+            sign.setLine(0, "§4 ▒▒▒▒▒▒▒▒");
+            sign.setLine(1, "§b§l§o" + this.name.substring(0, 1).toUpperCase() + this.name.substring(1));
+            sign.setLine(2, "§c§lOFFLINE");
+            sign.setLine(3, "§4 ▒▒▒▒▒▒▒▒");
+            sign.update();
+        }
+
+    }
+
+    public Location getLocation() {
+        return location;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public int getPort() {
+        return port;
+    }
+}
diff --git a/src/main/java/de/cliffbreak/core/commands/CommandSign.java b/src/main/java/de/cliffbreak/core/commands/CommandSign.java
new file mode 100644
index 0000000..5d55f60
--- /dev/null
+++ b/src/main/java/de/cliffbreak/core/commands/CommandSign.java
@@ -0,0 +1,88 @@
+package de.cliffbreak.core.commands;
+
+import de.cliffbreak.core.CliffbreakCore;
+import de.cliffbreak.core.classes.StatusSign;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.type.Sign;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import java.io.IOException;
+import java.util.*;
+
+public class CommandSign implements CommandExecutor {
+    private CliffbreakCore plugin;
+
+    public CommandSign(CliffbreakCore plugin) {
+        this.plugin = plugin;
+    }
+
+    @Override
+    public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) {
+        if (commandSender instanceof Player) {
+            Player p = (Player) commandSender;
+            if (!p.hasPermission("cliffbreak.command.sign")) {
+                p.sendMessage("§cNope");
+                return true;
+            }
+            if (args.length > 0 && args[0].equalsIgnoreCase("add")) {
+                if (args.length < 4) {
+                    p.sendMessage("§c/sign add   ");
+                    return true;
+                }
+
+                String host = args[1];
+                int port = Integer.parseInt(args[2]);
+                String name = args[3];
+
+                Set set = new HashSet();
+                set.add(Material.AIR);
+                Block block = p.getTargetBlock(set, 10);
+
+                if (block == null || (block.getState() instanceof Sign)) {
+                    p.sendMessage("§cBitte schaue auf ein Schild!");
+                    return true;
+                }
+
+                StatusSign statusSign = new StatusSign(block.getLocation(), host, port, name);
+                saveSign(statusSign, p);
+                plugin.statusSigns.add(statusSign);
+            }
+        }
+        return true;
+    }
+
+    @SuppressWarnings("unchecked")
+    private void saveSign(StatusSign statusSign, Player p) {
+        List