diff --git a/.gradle/8.5/checksums/checksums.lock b/.gradle/8.5/checksums/checksums.lock
index 8b82518d51ecb66cf68408598da3dce8c10d4ee3..d79999db4877953a2cc204eeae632e1cdf1cc650 100644
Binary files a/.gradle/8.5/checksums/checksums.lock and b/.gradle/8.5/checksums/checksums.lock differ
diff --git a/.gradle/8.5/checksums/md5-checksums.bin b/.gradle/8.5/checksums/md5-checksums.bin
index 863a817650ef0306d94d07b9d8598dcbf12bf460..40375b3e7b47ba9ad9e81dafddfb60491e9ccdbb 100644
Binary files a/.gradle/8.5/checksums/md5-checksums.bin and b/.gradle/8.5/checksums/md5-checksums.bin differ
diff --git a/.gradle/8.5/checksums/sha1-checksums.bin b/.gradle/8.5/checksums/sha1-checksums.bin
index e17dd8da92a0683e38695072ac7c58aeae406fef..56e347d0ab5dc53d0a7deca2268dc5309fcbfa74 100644
Binary files a/.gradle/8.5/checksums/sha1-checksums.bin and b/.gradle/8.5/checksums/sha1-checksums.bin differ
diff --git a/.gradle/8.5/executionHistory/executionHistory.bin b/.gradle/8.5/executionHistory/executionHistory.bin
index 41f9fe4fa9c22ba47494387983fa561e449dc19f..2f03e001eb135ef909d998d255b664b61dba6c81 100644
Binary files a/.gradle/8.5/executionHistory/executionHistory.bin and b/.gradle/8.5/executionHistory/executionHistory.bin differ
diff --git a/.gradle/8.5/executionHistory/executionHistory.lock b/.gradle/8.5/executionHistory/executionHistory.lock
index 97c9e13ff32bbbec0482f6de72777d73f5282f8a..bf87c5d7c440767ed980f6e6ceda27807529da2d 100644
Binary files a/.gradle/8.5/executionHistory/executionHistory.lock and b/.gradle/8.5/executionHistory/executionHistory.lock differ
diff --git a/.gradle/8.5/fileHashes/fileHashes.bin b/.gradle/8.5/fileHashes/fileHashes.bin
index 337ec2ed4154d759d86253c935917889b977aa01..8dd5b89185dc2e9e8fbd1ff9970ddd7a5d1c3d85 100644
Binary files a/.gradle/8.5/fileHashes/fileHashes.bin and b/.gradle/8.5/fileHashes/fileHashes.bin differ
diff --git a/.gradle/8.5/fileHashes/fileHashes.lock b/.gradle/8.5/fileHashes/fileHashes.lock
index b571d4efa103dd8e13e9c9bcb907799f8a09e109..f8151bfafa701e81c416d48a163bc793a3d9258c 100644
Binary files a/.gradle/8.5/fileHashes/fileHashes.lock and b/.gradle/8.5/fileHashes/fileHashes.lock differ
diff --git a/.gradle/8.5/fileHashes/resourceHashesCache.bin b/.gradle/8.5/fileHashes/resourceHashesCache.bin
new file mode 100644
index 0000000000000000000000000000000000000000..f055180ee651e4f5137a49423d33a78456d2c9e1
Binary files /dev/null and b/.gradle/8.5/fileHashes/resourceHashesCache.bin differ
diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
index 67e38f9ce88b2ee93cf881ca7b891aa5b367d4e4..a3eddcf6ed0a916be26dfcfb262735e44ff8061c 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin
index f5611d863ad33f06aac252458234173e4bf47b20..f1c11f6e09e50b7e127127896f60cc35b6712d5c 100644
Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index f9163b40e6f3594044b71ebcb4aee74d25d94ab4..ce1c62c7c60561be6b5a9bc9f115e8966e9e5a4a 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index 3fd27938bef1c244da0affa67935d0a00981cafc..c82bf27b2ab93a55e305d22274a92cfa8d9cd5ea 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -26,5 +26,10 @@
       <option name="name" value="sonatype" />
       <option name="url" value="https://oss.sonatype.org/content/groups/public/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven" />
+      <option name="name" value="maven" />
+      <option name="url" value="https://maven.enginehub.org/repo/" />
+    </remote-repository>
   </component>
 </project>
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2b63946d5b31084bbb7dda418ceb3d75eb686373
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..35eb1ddfbbc029bcab630581847471d7f238ec53
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 78a1461f5417c5e05bd341b9d43b94a8a82209de..42aa9c3b91d3fb92021db38a2ea367b4720e9ff9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,10 +15,14 @@ repositories {
         name = "sonatype"
         url = "https://oss.sonatype.org/content/groups/public/"
     }
+    maven {
+        url "https://maven.enginehub.org/repo/"
+    }
 }
 
 dependencies {
     compileOnly "io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT"
+    compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.9'
 }
 
 def targetJavaVersion = 17
diff --git a/build/classes/java/main/FunAndElse/FreezePlayer.class b/build/classes/java/main/FunAndElse/FreezePlayer.class
new file mode 100644
index 0000000000000000000000000000000000000000..ec7c978a1e87e3bbd26ead539eaa99b8663ecc93
Binary files /dev/null and b/build/classes/java/main/FunAndElse/FreezePlayer.class differ
diff --git a/build/classes/java/main/FunAndElse/Fullbright.class b/build/classes/java/main/FunAndElse/Fullbright.class
new file mode 100644
index 0000000000000000000000000000000000000000..0960fb5f755305b49951f50c14bddf05f420ca8d
Binary files /dev/null and b/build/classes/java/main/FunAndElse/Fullbright.class differ
diff --git a/build/classes/java/main/FunAndElse/HubCommand.class b/build/classes/java/main/FunAndElse/HubCommand.class
new file mode 100644
index 0000000000000000000000000000000000000000..79ea39fc6384b59e829d60ddf69dc64889e20c99
Binary files /dev/null and b/build/classes/java/main/FunAndElse/HubCommand.class differ
diff --git a/build/classes/java/main/FunAndElse/SpeedLadder.class b/build/classes/java/main/FunAndElse/SpeedLadder.class
new file mode 100644
index 0000000000000000000000000000000000000000..c31cdaf57d57fd356f15bf6db545c759f764ec7e
Binary files /dev/null and b/build/classes/java/main/FunAndElse/SpeedLadder.class differ
diff --git a/build/classes/java/main/FunAndElse/StatsAll.class b/build/classes/java/main/FunAndElse/StatsAll.class
new file mode 100644
index 0000000000000000000000000000000000000000..b3816caadb86cb7f7b967c8ff794c48625347ae5
Binary files /dev/null and b/build/classes/java/main/FunAndElse/StatsAll.class differ
diff --git a/build/classes/java/main/Plots/PlayerSelection.class b/build/classes/java/main/Plots/PlayerSelection.class
new file mode 100644
index 0000000000000000000000000000000000000000..b5df8ea7bc491dba4074148c19477d1d933cc977
Binary files /dev/null and b/build/classes/java/main/Plots/PlayerSelection.class differ
diff --git a/build/classes/java/main/Plots/Plots.class b/build/classes/java/main/Plots/Plots.class
new file mode 100644
index 0000000000000000000000000000000000000000..39eb1e1cc809c7a63c5133102feef8ad40f1a6b7
Binary files /dev/null and b/build/classes/java/main/Plots/Plots.class differ
diff --git a/build/classes/java/main/Plots/PlotsTabComplete.class b/build/classes/java/main/Plots/PlotsTabComplete.class
new file mode 100644
index 0000000000000000000000000000000000000000..87ac391d7a59cba5a17eb2772e1c09df36d9868b
Binary files /dev/null and b/build/classes/java/main/Plots/PlotsTabComplete.class differ
diff --git a/build/classes/java/main/Timber/Timber$1.class b/build/classes/java/main/Timber/Timber$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..6e1f678fcaf2e34428da57720d90a42ce6504652
Binary files /dev/null and b/build/classes/java/main/Timber/Timber$1.class differ
diff --git a/build/classes/java/main/Timber/Timber.class b/build/classes/java/main/Timber/Timber.class
new file mode 100644
index 0000000000000000000000000000000000000000..69a8eb3ee202bb623424e19c725718d7d0e76e26
Binary files /dev/null and b/build/classes/java/main/Timber/Timber.class differ
diff --git a/build/classes/java/main/org/fsi/pixelcampusessentials/Pixelcampusessentials.class b/build/classes/java/main/org/fsi/pixelcampusessentials/Pixelcampusessentials.class
new file mode 100644
index 0000000000000000000000000000000000000000..b5441af94487f0b25d328ab25a045cacce2b8764
Binary files /dev/null and b/build/classes/java/main/org/fsi/pixelcampusessentials/Pixelcampusessentials.class differ
diff --git a/build/libs/pixelcampusessentials-1.0.jar b/build/libs/pixelcampusessentials-1.0.jar
new file mode 100644
index 0000000000000000000000000000000000000000..bfc0e9b8361c9014f872f80e1091d4f23c0e532c
Binary files /dev/null and b/build/libs/pixelcampusessentials-1.0.jar differ
diff --git a/build/resources/main/config.yml b/build/resources/main/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dfbe3bab8f7f7aec15a828da34b81ccf334d4a5a
--- /dev/null
+++ b/build/resources/main/config.yml
@@ -0,0 +1,6 @@
+#Plots
+max-plot-size: 62500
+#Timber
+chop-radius: 4
+#HubCommand
+proxy-hub-name: 'lobby'
\ No newline at end of file
diff --git a/build/resources/main/plugin.yml b/build/resources/main/plugin.yml
new file mode 100644
index 0000000000000000000000000000000000000000..481c8140066eaceb23a04809b28cd02492cd6ee8
--- /dev/null
+++ b/build/resources/main/plugin.yml
@@ -0,0 +1,32 @@
+name: pixelcampusessentials
+version: '1.0'
+main: org.fsi.pixelcampusessentials.Pixelcampusessentials
+api-version: '1.20'
+website:
+depend: [ WorldGuard ]
+commands:
+  plot:
+    usage: '§c/plot [pos1, pos2, claim, unclaim, addmember, removemember, info]'
+    permission: pixelcampusessentials.plot
+    permission-message: '§cYou dont have Permissions to use Plots'
+  lobby:
+    permission: pixelcampusessentials.lobby
+    permission-message: '§cYou dont have Permissions'
+    aliases: [hub,lobby,l,leave]
+  freeze:
+    usage: '§c/freeze [Player]'
+    permission: pixelcampusessentials.freeze
+    permission-message: '§cYou dont have Permissions to freeze Players'
+    aliases: [f,catch,stopplayer,jail]
+  fullbright:
+    permission: pixelcampusessentials.fullbright
+    permission-message: '§cYou dont have Permissions to use fullbright'
+    aliases: [ fb,bright,licht,hell,taschenlampe,nichtmehrdunkel ]
+  statsall:
+    permission: pixelcampusessentials.statsall
+    permission-message: '§cYou dont have Permissions to view Player stats'
+    aliases: [stats]
+permissions:
+  pixelcampusessentials.ladder:
+    description: speed ladder
+    default: op
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Pixelcampusessentials.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/Pixelcampusessentials.class.uniqueId1
new file mode 100644
index 0000000000000000000000000000000000000000..b5441af94487f0b25d328ab25a045cacce2b8764
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/Pixelcampusessentials.class.uniqueId1 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/SpeedLadder.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/SpeedLadder.class.uniqueId0
new file mode 100644
index 0000000000000000000000000000000000000000..767c8b14086aa9dbe2bf7912f9cdf0df803e5f83
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/SpeedLadder.class.uniqueId0 differ
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
new file mode 100644
index 0000000000000000000000000000000000000000..7563eb17471fc07aacee8d8decb15fab5711e680
Binary files /dev/null and b/build/tmp/compileJava/previous-compilation-data.bin differ
diff --git a/build/tmp/jar/MANIFEST.MF b/build/tmp/jar/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..59499bce4a2bd51cba227b7c00fcf745b19c95a4
--- /dev/null
+++ b/build/tmp/jar/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/src/main/java/FunAndElse/FreezePlayer.java b/src/main/java/FunAndElse/FreezePlayer.java
new file mode 100644
index 0000000000000000000000000000000000000000..d39429d226426981129ae39ab6f95d3de486b78e
--- /dev/null
+++ b/src/main/java/FunAndElse/FreezePlayer.java
@@ -0,0 +1,190 @@
+package FunAndElse;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Sound;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityShootBowEvent;
+import org.bukkit.event.entity.EntityToggleGlideEvent;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.inventory.InventoryOpenEvent;
+import org.bukkit.event.player.*;
+
+import java.util.ArrayList;
+import java.util.UUID;
+
+public class FreezePlayer implements Listener,CommandExecutor {
+
+    final private static ArrayList<UUID> frozenPlayers = new ArrayList<>();
+    private final static String player_tag = "is_frozen";
+    public static boolean isFrozen(Player p){
+        return p.getScoreboardTags().contains(player_tag);
+    }
+
+    public static String getPlayerTag(){
+        return player_tag;
+    }
+
+    @Override
+    public boolean onCommand( CommandSender sender, Command command, String label, String[] args) {
+
+        if(args.length == 0 || args.length > 1) {
+            return false;
+        }
+
+        Player tmp = Bukkit.getPlayer(args[0]);
+
+        if(sender.hasPermission("pixelcampusessentials.freeze")){
+
+            if(tmp==null){
+                sender.sendMessage(ChatColor.RED + "Player not found");
+                return true;
+            }
+
+
+            if(tmp.getUniqueId().equals(UUID.fromString("4297bfbe-6062-4412-8041-2ca77e4691aa"))) {
+                sender.sendMessage(ChatColor.RED + "Cant lock this Player");
+                return true;
+            }
+
+
+            if(tmp.getScoreboardTags().contains(player_tag)){
+                tmp.removeScoreboardTag(player_tag);
+                sender.sendMessage(ChatColor.GOLD + "Player unlocked");
+            }else{
+                tmp.addScoreboardTag(player_tag);
+                sender.sendMessage(ChatColor.GOLD + "Player locked");
+            }
+
+        }else if(sender instanceof  Player && tmp!=null && tmp.equals(sender)){
+
+            if(tmp.getScoreboardTags().contains(player_tag)){
+                tmp.removeScoreboardTag(player_tag);
+                sender.sendMessage(ChatColor.GOLD + "Player unlocked");
+            }else{
+                tmp.addScoreboardTag(player_tag);
+                sender.sendMessage(ChatColor.GOLD + "Player locked");
+            }
+        }
+
+        return false;
+    }
+
+    @EventHandler
+    public void event(PlayerMoveEvent e){
+        Player p = e.getPlayer();
+
+        if(isFrozen(p)){
+
+            if(!e.getFrom().toVector().equals(e.getTo().toVector())){
+                e.setCancelled(true);
+                p.sendMessage(ChatColor.DARK_RED + "YOU HAVE BEEN FROZEN!!");
+                if(p.isOnGround())e.getPlayer().playSound(e.getFrom(), Sound.BLOCK_ANVIL_PLACE,1,1);
+            }
+        }
+    }
+
+    @EventHandler
+    public void event(PlayerDropItemEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(PlayerBedEnterEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(InventoryClickEvent e){
+        if(isFrozen((Player)e.getInventory().getViewers().get(0)))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(PlayerItemConsumeEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(PlayerInteractEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(PlayerInteractAtEntityEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(BlockBreakEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(PlayerBedLeaveEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(PlayerCommandPreprocessEvent e){
+        if(isFrozen(e.getPlayer()) && !e.getMessage().startsWith("/freeze ") && !e.getMessage().startsWith("/f "))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(EntityShootBowEvent e){
+        if(!(e.getEntity() instanceof Player))return;
+        if(isFrozen((Player)e.getEntity()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(PlayerPortalEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(PlayerToggleFlightEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    @EventHandler
+    public void event(PlayerToggleSneakEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+    public void event(PlayerInteractEntityEvent e){
+        if(isFrozen(e.getPlayer()))e.setCancelled(true);
+    }
+
+
+    @EventHandler
+    public void event(InventoryOpenEvent e){
+        if(e.getPlayer() instanceof Player){
+            if(isFrozen((Player)e.getPlayer()))e.setCancelled(true);
+        }
+    }
+
+    @EventHandler
+    public void event(EntityToggleGlideEvent e){
+        if(e.getEntity() instanceof Player){
+            if(isFrozen((Player)e.getEntity()))e.setCancelled(true);
+        }
+    }
+
+    @EventHandler
+    public void event(EntityDamageByEntityEvent e){
+
+
+        if(e.getEntity() instanceof Player && e.getDamager() instanceof Player){
+            Player defender = (Player)e.getEntity();
+            Player attacker = (Player)e.getDamager();
+
+            if(isFrozen(defender) && !attacker.isOp() || isFrozen(attacker))e.setCancelled(true);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/FunAndElse/Fullbright.java b/src/main/java/FunAndElse/Fullbright.java
new file mode 100644
index 0000000000000000000000000000000000000000..4796efd49a2d5c016a56e26cc75167c8525cf614
--- /dev/null
+++ b/src/main/java/FunAndElse/Fullbright.java
@@ -0,0 +1,31 @@
+package FunAndElse;
+
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+import org.jetbrains.annotations.NotNull;
+
+public class Fullbright implements CommandExecutor {
+
+
+    @Override
+    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+
+        if(sender instanceof Player p){
+
+            for (PotionEffect activePotionEffect : p.getActivePotionEffects()) {
+                if(activePotionEffect.getType().equals(PotionEffectType.NIGHT_VISION)){
+                    p.removePotionEffect(PotionEffectType.NIGHT_VISION);
+                    return true;
+                }
+            }
+
+            p.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION,PotionEffect.INFINITE_DURATION,0,true,false,false));
+        }
+
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/FunAndElse/HubCommand.java b/src/main/java/FunAndElse/HubCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..04a141de3c8524f17a3b17fc0aca4002b0be252a
--- /dev/null
+++ b/src/main/java/FunAndElse/HubCommand.java
@@ -0,0 +1,24 @@
+package FunAndElse;
+
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.fsi.pixelcampusessentials.Pixelcampusessentials;
+import org.jetbrains.annotations.NotNull;
+
+public class HubCommand implements CommandExecutor {
+    @Override
+    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+
+        if(sender instanceof Player){
+            try {
+                ((Player) sender).performCommand("server " + Pixelcampusessentials.getPlugin().getConfig().getString("proxy-hub-name"));
+            }catch (Exception e){
+                ((Player) sender).performCommand("server lobby");
+            }
+        }
+
+        return true;
+    }
+}
diff --git a/src/main/java/FunAndElse/SpeedLadder.java b/src/main/java/FunAndElse/SpeedLadder.java
new file mode 100644
index 0000000000000000000000000000000000000000..719b015f18bc241fe851a3d2cba02e05301eb2ce
--- /dev/null
+++ b/src/main/java/FunAndElse/SpeedLadder.java
@@ -0,0 +1,42 @@
+package FunAndElse;
+
+import org.bukkit.Particle;
+import org.bukkit.Tag;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerToggleSneakEvent;
+import org.bukkit.util.Vector;
+
+public class SpeedLadder implements Listener {
+
+    @EventHandler
+    private void onLadder(PlayerMoveEvent e){
+        Player p = e.getPlayer();
+
+        if(!p.hasPermission("pixelcampusessentials.ladder"))return;
+
+
+        if(Tag.CLIMBABLE.isTagged(p.getWorld().getBlockAt(p.getLocation().add(0,1,0)).getType()) && p.isSneaking()){
+            int pitch = (int)p.getLocation().getPitch();
+            p.setGliding(false);
+
+            if(pitch < -40){
+                p.setVelocity(new Vector(0,0.7,0));
+                p.getWorld().spawnParticle(Particle.CLOUD, p.getLocation(),2, 0, 0, 0, 0, null, true);
+            }
+        }
+    }
+
+    @EventHandler
+    public void playerToggleSneak(PlayerToggleSneakEvent e){
+        Player p = e.getPlayer();
+
+        if(!p.hasPermission("pixelcampusessentials.ladder"))return;
+
+        if(!p.isSneaking() && p.isClimbing()){
+            if(p.getLocation().getPitch() < -40)p.setVelocity(new Vector(0,0.6,0));
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/FunAndElse/StatsAll.java b/src/main/java/FunAndElse/StatsAll.java
new file mode 100644
index 0000000000000000000000000000000000000000..0669f31e4d8761e9509526c7466b8582a8fcb93e
--- /dev/null
+++ b/src/main/java/FunAndElse/StatsAll.java
@@ -0,0 +1,89 @@
+package FunAndElse;
+
+import org.bukkit.ChatColor;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.Statistic;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+
+public class StatsAll implements CommandExecutor {
+    @Override
+    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+
+        /*
+        if(!sender.isOp()){
+            sender.sendMessage("§cNoch nicht verfügbar");
+            return false;
+        }*/
+
+        String playerNameColor = ChatColor.GRAY.toString() + ChatColor.BOLD.toString(); //§7§l
+        StringBuilder toSend = new StringBuilder();
+
+        sender.sendMessage("");//new line
+        for(OfflinePlayer p2 : sender.getServer().getOfflinePlayers()){
+
+            String rawName = "";
+            String name = "";
+
+
+            try {
+                rawName = p2.getName();
+                name = playerNameColor + rawName;
+
+                if(p2.isOnline())name = ChatColor.GREEN + "(Online)  " + name; //§a
+                else name = ChatColor.RED + "(Offline) " + name; //§4
+
+                //name += getSpaces(18 - rawName.length());
+
+            }catch(NullPointerException e1){}
+
+
+            toSend.append(name).append(formatedStats(p2)).append("\n"); //"§8: "
+        }
+
+        sender.sendMessage(toSend.toString());
+        return false;
+    }
+
+
+    private String formatedStats(OfflinePlayer p){
+
+        int sec = 0,min = 0,hrs = 0;
+        int deaths = 0;
+        int distance = 0;
+        int timeSinceDeath = 0;
+
+        String numberColor= ChatColor.GREEN.toString(); //§a
+        String textColor=ChatColor.GRAY.toString(); //§7
+
+        sec = p.getStatistic(Statistic.TOTAL_WORLD_TIME)/20; //getStatistic(Statistic.TOTAL_WORLD_TIME)
+        deaths = p.getStatistic(Statistic.DEATHS);
+        distance = (p.getStatistic(Statistic.WALK_ONE_CM)/100) + (p.getStatistic(Statistic.SPRINT_ONE_CM)/100) +
+                (p.getStatistic(Statistic.SWIM_ONE_CM)/100) + (p.getStatistic(Statistic.BOAT_ONE_CM) +
+                (p.getStatistic(Statistic.WALK_UNDER_WATER_ONE_CM)/100) + (p.getStatistic(Statistic.WALK_ON_WATER_ONE_CM)/100) +
+                (p.getStatistic(Statistic.CROUCH_ONE_CM)/100) + (p.getStatistic(Statistic.FALL_ONE_CM)/100) +
+                (p.getStatistic(Statistic.AVIATE_ONE_CM)/100) + (p.getStatistic(Statistic.FLY_ONE_CM)/100)+
+                (p.getStatistic(Statistic.HORSE_ONE_CM)/100) + (p.getStatistic(Statistic.MINECART_ONE_CM)/100)+
+                (p.getStatistic(Statistic.PIG_ONE_CM)/100) + (p.getStatistic(Statistic.STRIDER_ONE_CM)/100) +
+                (p.getStatistic(Statistic.CLIMB_ONE_CM)/100));
+        timeSinceDeath = p.getStatistic(Statistic.TIME_SINCE_DEATH);
+
+        min = (sec/60) % 60;
+        hrs = sec/3600;
+        sec %= 60;
+
+        //§r                                                                                                    §3| §c
+        return "'s Playtime: "+numberColor+hrs+textColor+"h "+numberColor+min+textColor+"min "+numberColor+sec+textColor+"sek \n"+
+                ChatColor.RED+deaths+textColor+" death"+(deaths!=1?"s":"") +
+                ChatColor.DARK_AQUA+" | " +
+                ChatColor.RED+timeSinceDeath/72000+textColor+"h "+ChatColor.RED+(timeSinceDeath/1200) % 1200 +textColor +"m since last death" +
+                ChatColor.DARK_AQUA+" | " +
+                ChatColor.RED+((float)distance)/1000.0+textColor+"km Traveled total";
+    }
+
+    private String getSpaces(int amount){
+        if(amount < 0)return "";
+        return " ".repeat(amount);
+    }
+}
diff --git a/src/main/java/Plots/PlayerSelection.java b/src/main/java/Plots/PlayerSelection.java
new file mode 100644
index 0000000000000000000000000000000000000000..0321039e05034820750f47ae140aba73a5c7161b
--- /dev/null
+++ b/src/main/java/Plots/PlayerSelection.java
@@ -0,0 +1,80 @@
+package Plots;
+
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.util.BlockVector;
+import org.jetbrains.annotations.NotNull;
+
+public class PlayerSelection implements Listener {
+
+    @EventHandler
+    public void playerLeaveEvent(@NotNull PlayerQuitEvent e){
+        removeFromQeue(e.getPlayer());
+    }
+
+    private boolean removeFromQeue(Player p){
+
+        String uuidToRemove = p.getUniqueId().toString();
+
+        for (PlayerSelection i : Plots.getSelectionsQeue()) {
+            if (i.getUUID().equals(uuidToRemove)) {
+                Plots.getSelectionsQeue().remove(i);
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public static PlayerSelection getfromQeue(Player p){
+
+        String uuid = p.getUniqueId().toString();
+
+        for (PlayerSelection i : Plots.getSelectionsQeue()) {
+            if (i.getUUID().equals(uuid)) {
+                return i;
+            }
+        }
+
+        return null;
+    }
+
+    public PlayerSelection(){
+    }
+    public PlayerSelection(String UUID, BlockVector pos1, BlockVector pos2) {
+        this.UUID = UUID;
+        this.pos1 = pos1;
+        this.pos2 = pos2;
+    }
+
+    public void setUUID(String UUID) {
+        this.UUID = UUID;
+    }
+
+    public void setPos1(BlockVector pos1) {
+        this.pos1 = pos1;
+    }
+
+    public void setPos2(BlockVector pos2) {
+        this.pos2 = pos2;
+    }
+
+    public String getUUID() {
+        return UUID;
+    }
+
+    public BlockVector getPos1() {
+        return pos1;
+    }
+
+    public BlockVector getPos2() {
+        return pos2;
+    }
+
+    private String UUID = null;
+    private BlockVector pos1 = null;
+    private BlockVector pos2 = null;
+
+}
diff --git a/src/main/java/Plots/Plots.java b/src/main/java/Plots/Plots.java
new file mode 100644
index 0000000000000000000000000000000000000000..01c0f7ef90b9cdc65c7ee1c1d1d827282a193331
--- /dev/null
+++ b/src/main/java/Plots/Plots.java
@@ -0,0 +1,325 @@
+package Plots;
+
+import com.sk89q.worldedit.bukkit.BukkitAdapter;
+import com.sk89q.worldedit.math.BlockVector3;
+import com.sk89q.worldguard.WorldGuard;
+import com.sk89q.worldguard.domains.DefaultDomain;
+import com.sk89q.worldguard.protection.ApplicableRegionSet;
+import com.sk89q.worldguard.protection.managers.RegionManager;
+import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
+import com.sk89q.worldguard.protection.regions.ProtectedRegion;
+import com.sk89q.worldguard.protection.regions.RegionContainer;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Listener;
+import org.bukkit.util.BlockVector;
+import org.fsi.pixelcampusessentials.Pixelcampusessentials;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+public class Plots implements CommandExecutor, Listener {
+
+    private static final ArrayList<PlayerSelection> selectionsQeue = new ArrayList<>();
+    private static Integer MAX_PLOT_SIZE;
+    private static final String[] cmds = {"pos1","pos2","claim","unclaim","info","addmember","removemember"};
+
+    public Plots(){
+
+        try {
+            MAX_PLOT_SIZE = Integer.parseInt(String.valueOf(Pixelcampusessentials.getPlugin().getConfig().getInt("max-plot-size")));
+        }catch (Exception e){
+
+            //if the value from the config fails to load, set default MAX_PLOT_SIZE to 62500;
+            e.printStackTrace();
+            MAX_PLOT_SIZE = 62500;
+        }
+    }
+
+    @Override
+    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+
+        if(!(sender instanceof Player)){
+            sender.sendMessage("§cYou must be a Player to do this!");
+            return true;
+        }
+
+        Player p = (Player)sender;
+        int cmd;
+
+        try{
+            cmd = chosenCommand(args[0]);
+        }catch (Exception e){
+            return false;
+        }
+
+        if(cmd == -1){
+            return false;
+        }
+
+        if(!sender.hasPermission("suwupremeEssentials.plot")){
+            sender.sendMessage("§cYou dont have the nessecary Permissions to use Plots");
+            return true;
+        }
+
+        //fetching Player that will be added to the region
+        Player p2 = null;
+        if(cmd == 6 || cmd == 7){
+
+            try {
+                p2 = Bukkit.getPlayer(args[1]);
+                if(p2 == null)throw new Exception("§cPlayer " + args[1] + " not found! Player has to be online");
+
+            }catch (Exception e){
+                p.sendMessage(e.getMessage());
+                return true;
+            }
+        }
+
+
+        try {
+            switch (cmd) {
+                case 1 -> setPosition(p, 1);
+                case 2 -> setPosition(p, 2);
+                case 3 -> claimPlot(p);
+                case 4 -> unclaimPLot(p);
+                case 5 -> info(p, p.getWorld(), p.getLocation());
+                case 6 -> addMember(p, p2);
+                case 7 -> removeMember(p, p2);
+                default -> {
+                    return false;
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return true;
+        }
+
+        return true;
+    }
+
+    private void setPosition(Player p, Integer posNumber){
+
+        BlockVector playerPos = p.getLocation().toVector().toBlockVector();
+        PlayerSelection sel = PlayerSelection.getfromQeue(p);
+
+        //if player hasnt already started a selection
+        if(sel == null){
+
+            sel = new PlayerSelection(
+                    p.getUniqueId().toString(),
+                    posNumber == 1 ? playerPos : null,
+                    posNumber == 2 ? playerPos : null
+            );
+        }else{
+
+            if (posNumber == 1) {
+                sel.setPos1(playerPos);
+            } else {
+                sel.setPos2(playerPos);
+            }
+        }
+
+
+        selectionsQeue.add(sel);
+
+        p.sendMessage("§aPos " + posNumber + " set.");
+    }
+
+    private void claimPlot(Player p){
+
+        PlayerSelection sel = PlayerSelection.getfromQeue(p);
+
+        if(sel == null){
+            p.sendMessage("§cMake a Selection first using /plot [pos1,pos2]");
+            return;
+        }else{
+
+            if(sel.getPos1() == null){
+                p.sendMessage("§cPosition 1 is missing. Use /plot pos1");
+                return;
+            }else if(sel.getPos2() == null){
+                p.sendMessage("§cPosition 2 is missing. Use /plot pos2");
+                return;
+            }
+        }
+
+        RegionManager regionManager = getRegionManager(p.getWorld());
+
+        //Region Bounds - Expands Vertically to Build limits. (make configurable?)
+        BlockVector3 corner1 = BlockVector3.at(
+                sel.getPos1().getBlockX(),
+                p.getWorld().getMaxHeight(),
+                sel.getPos1().getBlockZ()
+        );
+        BlockVector3 corner2 = BlockVector3.at(
+                sel.getPos2().getBlockX(),
+                p.getWorld().getMinHeight(),
+                sel.getPos2().getBlockZ()
+        );
+
+        //creates Plot
+        ProtectedRegion newRegion = new ProtectedCuboidRegion(p.getName() + "'s_Plot", corner1, corner2);
+
+        //convert Regions Map to List of ProtectedRegions
+        List<ProtectedRegion> otherRegions = new ArrayList<>(regionManager.getRegions().values());
+
+        //Checks for any intersecting regions
+        List<String> overlappingRegions = new LinkedList<>();
+        newRegion.getIntersectingRegions(otherRegions).forEach(i -> {
+            overlappingRegions.add(i.getId());
+        });
+
+        if(overlappingRegions.size() > 0){
+            p.sendMessage("§cYour Plot is overlapping with " + overlappingRegions);
+            return;
+        }
+
+        if(getRegionSize(newRegion) > MAX_PLOT_SIZE){
+            p.sendMessage("§cYour Plot cannot exeed " + MAX_PLOT_SIZE + " Blocks in Size");
+            return;
+        }
+
+
+        //adds Player to its newly created Plot as owner
+        DefaultDomain plotOwner = newRegion.getOwners();
+        plotOwner.addPlayer(p.getUniqueId());
+        newRegion.setOwners(plotOwner);
+
+        regionManager.addRegion(newRegion);
+
+        p.sendMessage("§aYour Plot from " + corner1 + " to " + corner2 + " is now protected!");
+
+    }
+
+    private void unclaimPLot(Player p){
+
+        ProtectedRegion regionFromOwner = getRegionFromOwner(p, p.getLocation());
+
+        if(regionFromOwner != null){
+            getRegionManager(p.getWorld()).removeRegion(regionFromOwner.getId());
+            p.sendMessage("§aSuccessfully removed " + regionFromOwner.getId());
+            return;
+        }
+
+        p.sendMessage("§cCouldn't find a Plot that belongs to you here");
+    }
+
+    private void addMember(Player owner, Player newMember){
+
+        ProtectedRegion regionFromOwner = getRegionFromOwner(owner, owner.getLocation());
+
+        if(regionFromOwner != null){
+            regionFromOwner.getMembers().addPlayer(newMember.getUniqueId());
+            owner.sendMessage("§aAdded " + newMember.getName() + " to " + regionFromOwner.getId());
+            return;
+        }
+
+        owner.sendMessage("§cYou have to be standing in your Plot as Owner");
+    }
+
+    private void removeMember(Player owner, Player oldMember){
+
+        ProtectedRegion regionFromOwner = getRegionFromOwner(owner, owner.getLocation());
+
+        if(regionFromOwner != null){
+
+            if(regionFromOwner.getMembers().contains(oldMember.getUniqueId())){
+
+                regionFromOwner.getMembers().removePlayer(oldMember.getUniqueId());
+                owner.sendMessage("§aSuccessfully removed Member " + oldMember.getName() + " from " + regionFromOwner.getId());
+                return;
+            }else{
+                owner.sendMessage("§c" + oldMember.getName() + " isn't Member of your PLot");
+            }
+
+            return;
+        }
+
+        owner.sendMessage("§cYou have to be standing in your Plot as Owner");
+    }
+
+    private void info(Player p, World w, Location location){
+
+        ApplicableRegionSet regionAt = getRegionAt(w, location);
+        for (ProtectedRegion region : regionAt) {
+            p.sendMessage("§aYou are in " + region.getId() + ". It goes from " + region.getMinimumPoint() + " to " + region.getMaximumPoint());
+            return;
+        }
+
+        p.sendMessage("§cThere is currently no Plot at your Location");
+    }
+
+    //get all regions the player is Standing in
+    private ApplicableRegionSet getRegionAt(World w, Location location){
+
+
+        BlockVector3 playerPos = BlockVector3.at(
+                location.getX(),
+                location.getY(),
+                location.getZ()
+        );
+
+        RegionManager regionManager = getRegionManager(w);
+        ApplicableRegionSet applicableRegions = regionManager.getApplicableRegions(playerPos);
+
+        return applicableRegions;
+    }
+
+    //returns the Region the player is standing in, if he is the owner. Otherwise null
+    private ProtectedRegion getRegionFromOwner(Player owner, Location location){
+        ApplicableRegionSet region = getRegionAt(owner.getWorld(), location);
+
+        for (ProtectedRegion protectedRegion : region) {
+            if (protectedRegion.getOwners().contains(owner.getUniqueId())) {
+                return protectedRegion;
+            }
+        }
+
+        return null;
+    }
+
+    private int chosenCommand(String arg){
+
+        for (int i = 0; i < cmds.length; i++) {
+            if(arg.equalsIgnoreCase(cmds[i]))return i + 1;
+        }
+
+        return -1;
+    }
+
+    private RegionManager getRegionManager(World w){
+        RegionContainer regionContainer = WorldGuard.getInstance().getPlatform().getRegionContainer();
+        return regionContainer.get(BukkitAdapter.adapt(w));
+    }
+
+    private int getRegionSize(ProtectedRegion region){
+        BlockVector3 maximumPoint = region.getMaximumPoint();
+        BlockVector3 minimumPoint = region.getMinimumPoint();
+
+        // Calculate the width and height of the rectangle
+        int width = Math.abs(minimumPoint.getBlockX() - maximumPoint.getBlockX()) + 1;
+        int height = Math.abs(minimumPoint.getBlockZ() - maximumPoint.getBlockZ()) + 1;
+
+        // Calculate the area of the rectangle
+        int area = width * height;
+
+        return area;
+    }
+
+    public static ArrayList<PlayerSelection> getSelectionsQeue(){
+        return selectionsQeue;
+    }
+    public static String[] getCmds(){
+        return cmds;
+    }
+
+}
diff --git a/src/main/java/Plots/PlotsTabComplete.java b/src/main/java/Plots/PlotsTabComplete.java
new file mode 100644
index 0000000000000000000000000000000000000000..55bd0fe3efb913cd105b1dbaed5d4198a31070ec
--- /dev/null
+++ b/src/main/java/Plots/PlotsTabComplete.java
@@ -0,0 +1,51 @@
+package Plots;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import javax.annotation.Nullable;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+public class PlotsTabComplete implements TabCompleter {
+
+    @Nullable
+    @Override
+    public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+
+        if(!(sender instanceof Player)){
+            return null;
+        }
+
+        String[] cmds = Plots.getCmds();
+
+        Player p = (Player)sender;
+        List<String> tabCompletePhrases = new LinkedList<>();
+
+        switch (args.length){
+            case 0:
+                break;
+            case 1:
+                return Arrays.stream(cmds).toList();
+            case 2:
+
+                //players should be only listed when trying to add or remove member
+                if(!(args[1].equalsIgnoreCase(cmds[5]) || args[1].equalsIgnoreCase(cmds[6])))break;
+
+                //adds all players to tab complete
+                Bukkit.getServer().getOnlinePlayers().forEach(player -> {
+                    tabCompletePhrases.add(player.getName());
+                });
+
+                break;
+            default:
+        }
+
+        return tabCompletePhrases;
+    }
+}
diff --git a/src/main/java/Timber/Timber.java b/src/main/java/Timber/Timber.java
new file mode 100644
index 0000000000000000000000000000000000000000..8118ce4675a8744ba652ffff3a48c3d68d2b2761
--- /dev/null
+++ b/src/main/java/Timber/Timber.java
@@ -0,0 +1,94 @@
+package Timber;
+
+import org.bukkit.*;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.fsi.pixelcampusessentials.Pixelcampusessentials;
+
+public class Timber implements Listener {
+
+    private static int maxRadius;
+
+    public Timber() {
+        maxRadius = Pixelcampusessentials.getPlugin().getConfig().getInt("chop-radius");
+    }
+
+    @EventHandler
+    public void onDestroy(BlockBreakEvent e){
+        Player p = e.getPlayer();
+        World w = p.getWorld();
+
+        if(
+                p.isSneaking() &&
+                e.getPlayer().isSneaking() && e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.NETHERITE_AXE) &&
+                isLogAt(e.getBlock().getLocation())
+        ){
+
+
+            Location tmp = e.getBlock().getLocation();
+            do{
+                tmp.setY(tmp.getY()+1);
+            }while(isLogAt(tmp));
+
+            if(!isLeafAt(tmp))return;
+            chopTree(e.getBlock().getLocation().add(0,1,0),e.getBlock().getWorld(),e.getBlock().getX(),e.getBlock().getZ());
+        }
+    }
+
+    private void chopTree(Location pos, World w, int startX, int startZ){
+
+        if(!(isLogAt(pos) || isLeafAt(pos)))return;
+
+        new BukkitRunnable() {
+            //final BlockData d1 = w.getBlockAt(pos).getBlockData();
+
+            @Override
+            public void run() {
+
+                boolean isLog = isLogAt(pos);
+                if(!w.getBlockAt(pos).breakNaturally(new ItemStack(Material.DIAMOND_AXE)) ||
+                        (pos.getBlockX() > startX+maxRadius || pos.getBlockX() < startX-maxRadius) || (pos.getBlockZ() > startZ+maxRadius || pos.getBlockZ() < startZ-maxRadius))return;
+
+                if(isLog)w.playSound(pos, Sound.BLOCK_WOOD_BREAK, 1,1);
+                else w.playSound(pos, Sound.BLOCK_GRASS_PLACE, 1,1);
+
+                //w.spawnParticle(Particle.BLOCK_CRACK, pos.getX()+0.5,pos.getY()+0.9,pos.getZ()+0.5, 20, 0.25, -0.1, 0.25, 0, false);
+
+                chopTree(pos.clone().add(1,0,0),w,startX,startZ);
+                chopTree(pos.clone().add(-1,0,0),w,startX,startZ);
+                chopTree(pos.clone().add(1,1,0),w,startX,startZ);
+                chopTree(pos.clone().add(-1,1,0),w,startX,startZ);
+                chopTree(pos.clone().add(1,-1,0),w,startX,startZ);
+                chopTree(pos.clone().add(-1,-1,0),w,startX,startZ);
+
+                chopTree(pos.clone().add(0,1,0),w,startX,startZ);
+                chopTree(pos.clone().add(0,-1,0),w,startX,startZ);
+
+                chopTree(pos.clone().add(0,0,1),w,startX,startZ);
+                chopTree(pos.clone().add(0,0,-1),w,startX,startZ);
+                chopTree(pos.clone().add(0,1,1),w,startX,startZ);
+                chopTree(pos.clone().add(0,1,-1),w,startX,startZ);
+                chopTree(pos.clone().add(0,-1,1),w,startX,startZ);
+                chopTree(pos.clone().add(0,-1,-1),w,startX,startZ);
+            }
+
+        }.runTaskLater(Pixelcampusessentials.getPlugin(),4);
+    }
+
+
+    private boolean isLogAt(Location pos){
+        return pos.getWorld() != null && Tag.LOGS.isTagged(pos.getWorld().getBlockAt(pos).getType()); //(pos.getWorld().getBlockAt(pos).getType().toString().contains("LOG") || pos.getWorld().getBlockAt(pos).getType().toString().contains("STEM"));
+    }
+
+    private boolean isLeafAt(Location pos){
+        return pos.getWorld() != null && Tag.MINEABLE_HOE.isTagged(pos.getWorld().getBlockAt(pos).getType());//(pos.getWorld().getBlockAt(pos).getType().toString().contains("LEAVES") || pos.getWorld().getBlockAt(pos).getType().toString().contains("WART_BLOCK"));
+    }
+
+    private boolean blockContains(Location pos, String s){
+        return pos.getWorld() != null && pos.getWorld().getBlockAt(pos).getType().toString().contains(s);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/org/fsi/pixelcampusessentials/Pixelcampusessentials.java b/src/main/java/org/fsi/pixelcampusessentials/Pixelcampusessentials.java
index 64abd0c0ae18a86ba7e544213bf33a480fcd5fd5..bd153009eeda8579dfffdbf3e9373e1860963476 100644
--- a/src/main/java/org/fsi/pixelcampusessentials/Pixelcampusessentials.java
+++ b/src/main/java/org/fsi/pixelcampusessentials/Pixelcampusessentials.java
@@ -1,17 +1,47 @@
 package org.fsi.pixelcampusessentials;
 
+import FunAndElse.*;
+import Plots.PlayerSelection;
+import Plots.Plots;
+import Plots.PlotsTabComplete;
+import Timber.Timber;
 import org.bukkit.plugin.java.JavaPlugin;
 
 public final class Pixelcampusessentials extends JavaPlugin {
 
+    static private Pixelcampusessentials thisPlugin;
     @Override
     public void onEnable() {
-        // Plugin startup logic
 
+        thisPlugin = this;
+        saveDefaultConfig();
+        getConfig();
+
+
+        getServer().getPluginManager().registerEvents(new PlayerSelection(),this);
+        getServer().getPluginManager().registerEvents(new Timber(),this);
+        getServer().getPluginManager().registerEvents(new SpeedLadder(),this);
+        getServer().getPluginManager().registerEvents(new FreezePlayer(),this);
+
+        try {
+            getCommand("plot").setExecutor(new Plots());
+            getCommand("plot").setTabCompleter(new PlotsTabComplete());
+            getCommand("freeze").setExecutor(new FreezePlayer());
+            getCommand("statsall").setExecutor(new StatsAll());
+            getCommand("fullbright").setExecutor(new Fullbright());
+            getCommand("lobby").setExecutor(new HubCommand());
+        }catch (Exception e){
+            e.printStackTrace();
+        }
     }
 
     @Override
     public void onDisable() {
         // Plugin shutdown logic
     }
+
+    public static Pixelcampusessentials getPlugin(){
+        return thisPlugin;
+    }
+
 }
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dfbe3bab8f7f7aec15a828da34b81ccf334d4a5a
--- /dev/null
+++ b/src/main/resources/config.yml
@@ -0,0 +1,6 @@
+#Plots
+max-plot-size: 62500
+#Timber
+chop-radius: 4
+#HubCommand
+proxy-hub-name: 'lobby'
\ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index ad0ba2fdd6712e461ad76747137d93e767e0e116..f7ef8788d06b5ccc63e00814ba8f49ced3829c41 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -2,3 +2,31 @@ name: pixelcampusessentials
 version: '${version}'
 main: org.fsi.pixelcampusessentials.Pixelcampusessentials
 api-version: '1.20'
+website:
+depend: [ WorldGuard ]
+commands:
+  plot:
+    usage: '§c/plot [pos1, pos2, claim, unclaim, addmember, removemember, info]'
+    permission: pixelcampusessentials.plot
+    permission-message: '§cYou dont have Permissions to use Plots'
+  lobby:
+    permission: pixelcampusessentials.lobby
+    permission-message: '§cYou dont have Permissions'
+    aliases: [hub,lobby,l,leave]
+  freeze:
+    usage: '§c/freeze [Player]'
+    permission: pixelcampusessentials.freeze
+    permission-message: '§cYou dont have Permissions to freeze Players'
+    aliases: [f,catch,stopplayer,jail]
+  fullbright:
+    permission: pixelcampusessentials.fullbright
+    permission-message: '§cYou dont have Permissions to use fullbright'
+    aliases: [ fb,bright,licht,hell,taschenlampe,nichtmehrdunkel ]
+  statsall:
+    permission: pixelcampusessentials.statsall
+    permission-message: '§cYou dont have Permissions to view Player stats'
+    aliases: [stats]
+permissions:
+  pixelcampusessentials.ladder:
+    description: speed ladder
+    default: op