--- a/net/minecraft/server/Main.java
+++ b/net/minecraft/server/Main.java
@@ -58,6 +58,12 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+// CraftBukkit start
+import net.minecraft.SharedConstants;
+import net.minecraft.world.level.dimension.DimensionManager;
+import net.minecraft.world.level.dimension.WorldDimension;
+// CraftBukkit end
+
 public class Main {
 
     private static final Logger LOGGER = LogManager.getLogger();
@@ -65,8 +71,9 @@
     public Main() {}
 
     @DontObfuscate
-    public static void main(String[] astring) {
+    public static void main(final OptionSet optionset) { // CraftBukkit - replaces main(String[] astring)
         SharedConstants.a();
+        /* CraftBukkit start - Replace everything
         OptionParser optionparser = new OptionParser();
         OptionSpec<Void> optionspec = optionparser.accepts("nogui");
         OptionSpec<Void> optionspec1 = optionparser.accepts("initSettings", "Initializes 'server.properties' and 'eula.txt', then quits");
@@ -90,20 +97,22 @@
                 optionparser.printHelpOn(System.err);
                 return;
             }
+            */ // CraftBukkit end
 
+        try {
             CrashReport.h();
             DispenserRegistry.init();
             DispenserRegistry.c();
             SystemUtils.l();
             IRegistryCustom.Dimension iregistrycustom_dimension = IRegistryCustom.a();
             Path path = Paths.get("server.properties");
-            DedicatedServerSettings dedicatedserversettings = new DedicatedServerSettings(path);
+            DedicatedServerSettings dedicatedserversettings = new DedicatedServerSettings(optionset); // CraftBukkit - CLI argument support
 
             dedicatedserversettings.save();
             Path path1 = Paths.get("eula.txt");
             EULA eula = new EULA(path1);
 
-            if (optionset.has(optionspec1)) {
+            if (optionset.has("initSettings")) { // CraftBukkit
                 Main.LOGGER.info("Initialized '{}' and '{}'", path.toAbsolutePath(), path1.toAbsolutePath());
                 return;
             }
@@ -113,14 +122,15 @@
                 return;
             }
 
-            File file = new File((String) optionset.valueOf(optionspec9));
+            File file = (File) optionset.valueOf("universe"); // CraftBukkit
             YggdrasilAuthenticationService yggdrasilauthenticationservice = new YggdrasilAuthenticationService(Proxy.NO_PROXY);
             MinecraftSessionService minecraftsessionservice = yggdrasilauthenticationservice.createMinecraftSessionService();
             GameProfileRepository gameprofilerepository = yggdrasilauthenticationservice.createProfileRepository();
             UserCache usercache = new UserCache(gameprofilerepository, new File(file, MinecraftServer.USERID_CACHE_FILE.getName()));
-            String s = (String) Optional.ofNullable((String) optionset.valueOf(optionspec10)).orElse(dedicatedserversettings.getProperties().levelName);
+            // CraftBukkit start
+            String s = (String) Optional.ofNullable((String) optionset.valueOf("world")).orElse(dedicatedserversettings.getProperties().levelName);
             Convertable convertable = Convertable.a(file.toPath());
-            Convertable.ConversionSession convertable_conversionsession = convertable.c(s);
+            Convertable.ConversionSession convertable_conversionsession = convertable.c(s, WorldDimension.OVERWORLD);
 
             MinecraftServer.convertWorld(convertable_conversionsession);
             WorldInfo worldinfo = convertable_conversionsession.d();
@@ -131,13 +141,30 @@
             }
 
             DataPackConfiguration datapackconfiguration = convertable_conversionsession.e();
-            boolean flag = optionset.has(optionspec6);
+            boolean flag = optionset.has("safeMode");
 
             if (flag) {
                 Main.LOGGER.warn("Safe mode active, only vanilla datapack will be loaded");
             }
 
             ResourcePackRepository resourcepackrepository = new ResourcePackRepository(EnumResourcePackType.SERVER_DATA, new ResourcePackSource[]{new ResourcePackSourceVanilla(), new ResourcePackSourceFolder(convertable_conversionsession.getWorldFolder(SavedFile.DATAPACK_DIR).toFile(), PackSource.WORLD)});
+            // CraftBukkit start
+            File bukkitDataPackFolder = new File(convertable_conversionsession.getWorldFolder(SavedFile.DATAPACK_DIR).toFile(), "bukkit");
+            if (!bukkitDataPackFolder.exists()) {
+                bukkitDataPackFolder.mkdirs();
+            }
+            File mcMeta = new File(bukkitDataPackFolder, "pack.mcmeta");
+            try {
+                com.google.common.io.Files.write("{\n"
+                        + "    \"pack\": {\n"
+                        + "        \"description\": \"Data pack for resources provided by Bukkit plugins\",\n"
+                        + "        \"pack_format\": " + SharedConstants.getGameVersion().getPackVersion() + "\n"
+                        + "    }\n"
+                        + "}\n", mcMeta, com.google.common.base.Charsets.UTF_8);
+            } catch (java.io.IOException ex) {
+                throw new RuntimeException("Could not initialize Bukkit datapack", ex);
+            }
+            // CraftBukkit end
             DataPackConfiguration datapackconfiguration1 = MinecraftServer.a(resourcepackrepository, datapackconfiguration == null ? DataPackConfiguration.DEFAULT : datapackconfiguration, flag);
             CompletableFuture completablefuture = DataPackResources.a(resourcepackrepository.f(), iregistrycustom_dimension, CommandDispatcher.ServerType.DEDICATED, dedicatedserversettings.getProperties().functionPermissionLevel, SystemUtils.f(), Runnable::run);
 
@@ -152,6 +179,7 @@
             }
 
             datapackresources.j();
+            /*
             RegistryReadOps<NBTBase> registryreadops = RegistryReadOps.a((DynamicOps) DynamicOpsNBT.INSTANCE, datapackresources.i(), (IRegistryCustom) iregistrycustom_dimension);
 
             dedicatedserversettings.getProperties().a((IRegistryCustom) iregistrycustom_dimension);
@@ -181,21 +209,32 @@
             }
 
             convertable_conversionsession.a((IRegistryCustom) iregistrycustom_dimension, (SaveData) object);
+            */
             final DedicatedServer dedicatedserver = (DedicatedServer) MinecraftServer.a((thread) -> {
-                DedicatedServer dedicatedserver1 = new DedicatedServer(thread, iregistrycustom_dimension, convertable_conversionsession, resourcepackrepository, datapackresources, object, dedicatedserversettings, DataConverterRegistry.a(), minecraftsessionservice, gameprofilerepository, usercache, WorldLoadListenerLogger::new);
+                DedicatedServer dedicatedserver1 = new DedicatedServer(optionset, datapackconfiguration1, thread, iregistrycustom_dimension, convertable_conversionsession, resourcepackrepository, datapackresources, null, dedicatedserversettings, DataConverterRegistry.a(), minecraftsessionservice, gameprofilerepository, usercache, WorldLoadListenerLogger::new);
 
+                /*
                 dedicatedserver1.d((String) optionset.valueOf(optionspec8));
                 dedicatedserver1.setPort((Integer) optionset.valueOf(optionspec11));
                 dedicatedserver1.c(optionset.has(optionspec2));
                 dedicatedserver1.b((String) optionset.valueOf(optionspec12));
-                boolean flag1 = !optionset.has(optionspec) && !optionset.valuesOf(nonoptionargumentspec).contains("nogui");
+                */
+                boolean flag1 = !optionset.has("nogui") && !optionset.nonOptionArguments().contains("nogui");
 
                 if (flag1 && !GraphicsEnvironment.isHeadless()) {
                     dedicatedserver1.bi();
                 }
 
+                if (optionset.has("port")) {
+                    int port = (Integer) optionset.valueOf("port");
+                    if (port > 0) {
+                        dedicatedserver1.setPort(port);
+                    }
+                }
+
                 return dedicatedserver1;
             });
+            /* CraftBukkit start
             Thread thread = new Thread("Server Shutdown Thread") {
                 public void run() {
                     dedicatedserver.safeShutdown(true);
@@ -204,14 +243,15 @@
 
             thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(Main.LOGGER));
             Runtime.getRuntime().addShutdownHook(thread);
+            */ // CraftBukkit end
         } catch (Exception exception1) {
             Main.LOGGER.fatal("Failed to start the minecraft server", exception1);
         }
 
     }
 
-    public static void convertWorld(Convertable.ConversionSession convertable_conversionsession, DataFixer datafixer, boolean flag, BooleanSupplier booleansupplier, ImmutableSet<ResourceKey<World>> immutableset) {
-        Main.LOGGER.info("Forcing world upgrade!");
+    public static void convertWorld(Convertable.ConversionSession convertable_conversionsession, DataFixer datafixer, boolean flag, BooleanSupplier booleansupplier, ImmutableSet<ResourceKey<DimensionManager>> immutableset) { // CraftBukkit
+        Main.LOGGER.info("Forcing world upgrade! {}", convertable_conversionsession.getLevelName()); // CraftBukkit
         WorldUpgrader worldupgrader = new WorldUpgrader(convertable_conversionsession, datafixer, immutableset, flag);
         IChatBaseComponent ichatbasecomponent = null;
 
