diff --git a/cloudnet-wrapper-jvm/src/main/java/de/dytanic/cloudnet/wrapper/Premain.java b/cloudnet-wrapper-jvm/src/main/java/de/dytanic/cloudnet/wrapper/Premain.java
index b7c0f4e41..330efd75c 100644
--- a/cloudnet-wrapper-jvm/src/main/java/de/dytanic/cloudnet/wrapper/Premain.java
+++ b/cloudnet-wrapper-jvm/src/main/java/de/dytanic/cloudnet/wrapper/Premain.java
@@ -23,7 +23,7 @@
 import java.util.jar.JarInputStream;
 import org.jetbrains.annotations.NotNull;
 
-final class Premain {
+public final class Premain {
 
   static Instrumentation instrumentation;
 
diff --git a/cloudnet/src/main/java/de/dytanic/cloudnet/service/defaults/JVMCloudService.java b/cloudnet/src/main/java/de/dytanic/cloudnet/service/defaults/JVMCloudService.java
index 20f9b5949..55567a010 100644
--- a/cloudnet/src/main/java/de/dytanic/cloudnet/service/defaults/JVMCloudService.java
+++ b/cloudnet/src/main/java/de/dytanic/cloudnet/service/defaults/JVMCloudService.java
@@ -29,6 +29,7 @@
 import de.dytanic.cloudnet.service.ICloudService;
 import de.dytanic.cloudnet.service.ICloudServiceManager;
 import de.dytanic.cloudnet.service.handler.CloudServiceHandler;
+import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
@@ -177,21 +178,38 @@ protected void startProcess() throws Exception {
     Path wrapperFile = Paths.get(System.getProperty("cloudnet.tempDir", "temp"), "caches", "wrapper.jar");
 
     commandArguments.addAll(this.getServiceConfiguration().getProcessConfig().getJvmOptions());
-    commandArguments.addAll(Arrays.asList(
-      "-Xmx" + this.getServiceConfiguration().getProcessConfig().getMaxHeapMemorySize() + "M",
-      "-cp", type.getClasspath(wrapperFile, applicationFile),
-      "-javaagent:" + wrapperFile.toAbsolutePath()
-    ));
-
-    try (JarInputStream stream = new JarInputStream(Files.newInputStream(wrapperFile))) {
-      commandArguments.add(stream.getManifest().getMainAttributes().getValue("Main-Class"));
+    commandArguments.add(
+      "-Xmx" + this.getServiceConfiguration().getProcessConfig().getMaxHeapMemorySize() + "M"
+    );
+    Path serverWrapperFile = selectServerWrapperPath();
+    if(serverWrapperFile == null) {
+      commandArguments.addAll(Arrays.asList( "-cp", type.getClasspath(wrapperFile, applicationFile)));
+      commandArguments.add("-javaagent:" + wrapperFile.toAbsolutePath());
+      try (JarInputStream stream = new JarInputStream(Files.newInputStream(wrapperFile))) {
+        commandArguments.add(stream.getManifest().getMainAttributes().getValue("Main-Class"));
+      }
+      // internal process arguments
+      commandArguments.add(applicationMainClass);
+      commandArguments.add(applicationFile.toAbsolutePath().toString());
+      commandArguments.add(Boolean.toString(type.shouldPreloadClassesBeforeStartup(applicationFile)));
+    } else {
+      commandArguments.add("-javaagent:" + serverWrapperFile.toAbsolutePath());
+      String wrapperMainClass;
+      String wrapperPreMainClass;
+      try (JarInputStream stream = new JarInputStream(Files.newInputStream(wrapperFile))) {
+        wrapperMainClass = stream.getManifest().getMainAttributes().getValue("Main-Class");
+        wrapperPreMainClass = stream.getManifest().getMainAttributes().getValue("Premain-Class");
+      }
+      commandArguments.add("-Dserverwrapper.agentproxy="+wrapperPreMainClass);
+      commandArguments.addAll(Arrays.asList( "-cp", type.getClasspath(wrapperFile, applicationFile).toString()+File.pathSeparator+serverWrapperFile.toAbsolutePath().toString()));
+      commandArguments.add(type.getMainClass(serverWrapperFile));
+      commandArguments.add(wrapperMainClass);
+      // internal process arguments
+      commandArguments.add(applicationMainClass);
+      commandArguments.add(applicationFile.toAbsolutePath().toString());
+      commandArguments.add(Boolean.toString(type.shouldPreloadClassesBeforeStartup(applicationFile)));
     }
 
-    // internal process arguments
-    commandArguments.add(applicationMainClass);
-    commandArguments.add(applicationFile.toAbsolutePath().toString());
-    commandArguments.add(Boolean.toString(type.shouldPreloadClassesBeforeStartup(applicationFile)));
-
     this.postConfigureServiceEnvironmentStartParameters(commandArguments);
 
     commandArguments.addAll(this.getServiceConfiguration().getProcessConfig().getProcessParameters());
@@ -311,4 +329,12 @@ private Path selectApplicationFile(ServiceEnvironmentType serviceEnvironmentType
 
     return applicationFile;
   }
+
+  private Path selectServerWrapperPath() {
+    Path serverWrapperPath = this.getDirectoryPath().resolve("ServerWrapper.jar");
+    if(Files.exists(serverWrapperPath)) {
+      return serverWrapperPath;
+    }
+    return null;
+  }
 }
