diff --git a/network/build.gradle b/network/build.gradle
new file mode 100644
index 000000000..ee606e340
--- /dev/null
+++ b/network/build.gradle
@@ -0,0 +1,35 @@
+plugins {
+ id 'java-library'
+ id 'maven-publish'
+ id 'checkstyle'
+}
+
+apply plugin: 'org.cadixdev.licenser'
+apply from: '../gradle/checkstyle.gradle'
+apply from: '../gradle/publish.gradle'
+apply from: '../gradle/errorprone.gradle'
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+}
+
+license {
+ header = project.rootProject.file('HEADER.txt')
+}
+
+dependencies {
+ implementation project(':velocity-proxy-core')
+}
+
+test {
+ useJUnitPlatform()
+}
+
+publishing {
+ publications {
+ mavenJava(MavenPublication) {
+ from components.java
+ }
+ }
+}
diff --git a/proxy-core/build.gradle b/proxy-core/build.gradle
new file mode 100644
index 000000000..981b07a79
--- /dev/null
+++ b/proxy-core/build.gradle
@@ -0,0 +1,41 @@
+plugins {
+ id 'java-library'
+ id 'maven-publish'
+ id 'checkstyle'
+}
+
+apply plugin: 'org.cadixdev.licenser'
+apply from: '../gradle/checkstyle.gradle'
+apply from: '../gradle/publish.gradle'
+apply from: '../gradle/errorprone.gradle'
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+}
+
+license {
+ header = project.rootProject.file('HEADER.txt')
+}
+
+dependencies {
+ implementation project(':velocity-api')
+ implementation project(':velocity-annotation-processor')
+
+ implementation "net.kyori:adventure-nbt:${adventureVersion}"
+
+ implementation "org.apache.logging.log4j:log4j-api:${log4jVersion}"
+
+ implementation "org.lanternpowered:lmbda:2.0.0"
+
+ implementation "com.github.ben-manes.caffeine:caffeine:2.8.8"
+ implementation "com.vdurmont:semver4j:3.1.0"
+ compileOnly "com.github.spotbugs:spotbugs-annotations:4.1.2"
+
+ testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}"
+ testImplementation "org.junit.jupiter:junit-jupiter-engine:${junitVersion}"
+}
+
+test {
+ useJUnitPlatform()
+}
\ No newline at end of file
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/AbstractCommandInvocation.java b/proxy-core/src/main/java/com/velocitypowered/proxy/command/AbstractCommandInvocation.java
similarity index 100%
rename from proxy/src/main/java/com/velocitypowered/proxy/command/AbstractCommandInvocation.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/command/AbstractCommandInvocation.java
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/util/BrigadierUtils.java b/proxy-core/src/main/java/com/velocitypowered/proxy/command/BrigadierUtils.java
similarity index 99%
rename from proxy/src/main/java/com/velocitypowered/proxy/util/BrigadierUtils.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/command/BrigadierUtils.java
index db6a5919d..27a631b64 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/util/BrigadierUtils.java
+++ b/proxy-core/src/main/java/com/velocitypowered/proxy/command/BrigadierUtils.java
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.velocitypowered.proxy.util;
+package com.velocitypowered.proxy.command;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/CommandInvocationFactory.java b/proxy-core/src/main/java/com/velocitypowered/proxy/command/CommandInvocationFactory.java
similarity index 100%
rename from proxy/src/main/java/com/velocitypowered/proxy/command/CommandInvocationFactory.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/command/CommandInvocationFactory.java
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/CommandNodeFactory.java b/proxy-core/src/main/java/com/velocitypowered/proxy/command/CommandNodeFactory.java
similarity index 98%
rename from proxy/src/main/java/com/velocitypowered/proxy/command/CommandNodeFactory.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/command/CommandNodeFactory.java
index 5f68066f8..7489c408a 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/command/CommandNodeFactory.java
+++ b/proxy-core/src/main/java/com/velocitypowered/proxy/command/CommandNodeFactory.java
@@ -26,7 +26,6 @@ import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.command.InvocableCommand;
import com.velocitypowered.api.command.RawCommand;
import com.velocitypowered.api.command.SimpleCommand;
-import com.velocitypowered.proxy.util.BrigadierUtils;
@FunctionalInterface
public interface CommandNodeFactory {
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/VelocityCommandManager.java b/proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocityCommandManager.java
similarity index 99%
rename from proxy/src/main/java/com/velocitypowered/proxy/command/VelocityCommandManager.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocityCommandManager.java
index 4db8974e5..97d83ea18 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/command/VelocityCommandManager.java
+++ b/proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocityCommandManager.java
@@ -37,7 +37,6 @@ import com.velocitypowered.api.event.command.CommandExecuteEvent;
import com.velocitypowered.api.event.command.CommandExecuteEvent.CommandResult;
import com.velocitypowered.api.event.command.CommandExecuteEventImpl;
import com.velocitypowered.proxy.event.VelocityEventManager;
-import com.velocitypowered.proxy.util.BrigadierUtils;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/VelocityCommandMeta.java b/proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocityCommandMeta.java
similarity index 100%
rename from proxy/src/main/java/com/velocitypowered/proxy/command/VelocityCommandMeta.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocityCommandMeta.java
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/VelocityRawCommandInvocation.java b/proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocityRawCommandInvocation.java
similarity index 97%
rename from proxy/src/main/java/com/velocitypowered/proxy/command/VelocityRawCommandInvocation.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocityRawCommandInvocation.java
index 3e41c4436..15f238c38 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/command/VelocityRawCommandInvocation.java
+++ b/proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocityRawCommandInvocation.java
@@ -21,7 +21,6 @@ import com.google.common.base.Preconditions;
import com.mojang.brigadier.context.CommandContext;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.command.RawCommand;
-import com.velocitypowered.proxy.util.BrigadierUtils;
final class VelocityRawCommandInvocation extends AbstractCommandInvocation
implements RawCommand.Invocation {
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/VelocitySimpleCommandInvocation.java b/proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocitySimpleCommandInvocation.java
similarity index 97%
rename from proxy/src/main/java/com/velocitypowered/proxy/command/VelocitySimpleCommandInvocation.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocitySimpleCommandInvocation.java
index 74d851c88..31d246ade 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/command/VelocitySimpleCommandInvocation.java
+++ b/proxy-core/src/main/java/com/velocitypowered/proxy/command/VelocitySimpleCommandInvocation.java
@@ -20,7 +20,6 @@ package com.velocitypowered.proxy.command;
import com.mojang.brigadier.context.CommandContext;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.command.SimpleCommand;
-import com.velocitypowered.proxy.util.BrigadierUtils;
final class VelocitySimpleCommandInvocation extends AbstractCommandInvocation
implements SimpleCommand.Invocation {
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/event/CustomHandlerAdapter.java b/proxy-core/src/main/java/com/velocitypowered/proxy/event/CustomHandlerAdapter.java
similarity index 100%
rename from proxy/src/main/java/com/velocitypowered/proxy/event/CustomHandlerAdapter.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/event/CustomHandlerAdapter.java
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/event/UntargetedEventHandler.java b/proxy-core/src/main/java/com/velocitypowered/proxy/event/UntargetedEventHandler.java
similarity index 100%
rename from proxy/src/main/java/com/velocitypowered/proxy/event/UntargetedEventHandler.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/event/UntargetedEventHandler.java
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/event/VelocityEventManager.java b/proxy-core/src/main/java/com/velocitypowered/proxy/event/VelocityEventManager.java
similarity index 100%
rename from proxy/src/main/java/com/velocitypowered/proxy/event/VelocityEventManager.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/event/VelocityEventManager.java
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/plugin/PluginClassLoader.java b/proxy-core/src/main/java/com/velocitypowered/proxy/plugin/PluginClassLoader.java
similarity index 100%
rename from proxy/src/main/java/com/velocitypowered/proxy/plugin/PluginClassLoader.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/plugin/PluginClassLoader.java
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/plugin/VelocityPluginManager.java b/proxy-core/src/main/java/com/velocitypowered/proxy/plugin/VelocityPluginManager.java
similarity index 98%
rename from proxy/src/main/java/com/velocitypowered/proxy/plugin/VelocityPluginManager.java
rename to proxy-core/src/main/java/com/velocitypowered/proxy/plugin/VelocityPluginManager.java
index 0b6811302..af5999f42 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/plugin/VelocityPluginManager.java
+++ b/proxy-core/src/main/java/com/velocitypowered/proxy/plugin/VelocityPluginManager.java
@@ -35,7 +35,6 @@ import com.velocitypowered.api.plugin.PluginDescription;
import com.velocitypowered.api.plugin.PluginManager;
import com.velocitypowered.api.plugin.meta.PluginDependency;
import com.velocitypowered.api.proxy.ProxyServer;
-import com.velocitypowered.proxy.VelocityServer;
import com.velocitypowered.proxy.plugin.loader.VelocityPluginContainer;
import com.velocitypowered.proxy.plugin.loader.jvm.JvmPluginLoader;
import com.velocitypowered.proxy.plugin.util.PluginDependencyUtils;
@@ -63,9 +62,9 @@ public class VelocityPluginManager implements PluginManager {
private final Map plugins = new LinkedHashMap<>();
private final IdentityHashMap