diff --git a/_Misc Files/setup documentation/Gitlab Docker Container Setup.txt b/_Misc Files/setup documentation/Gitlab Docker Container Setup.txt
index 2ec91c357..6c7af33e7 100644
--- a/_Misc Files/setup documentation/Gitlab Docker Container Setup.txt
+++ b/_Misc Files/setup documentation/Gitlab Docker Container Setup.txt
@@ -32,6 +32,11 @@ gitlab project -> settings (on the left menu bar) -> CI/CD -> Runners
and you should see the newly registered runner (the description should show up under the runner's auto generated ID)
+5. optional config
+Open Docker Desktop -> Containers -> Files, go to the file "etc/gitlab-runner/config.toml"
+concurrent can be changed to allow for concurrent builds.
+
+
Additional commands:
diff --git a/api/src/main/java/com/seibel/distanthorizons/api/enums/worldGeneration/EDhApiWorldGeneratorReturnType.java b/api/src/main/java/com/seibel/distanthorizons/api/enums/worldGeneration/EDhApiWorldGeneratorReturnType.java
new file mode 100644
index 000000000..30e411b69
--- /dev/null
+++ b/api/src/main/java/com/seibel/distanthorizons/api/enums/worldGeneration/EDhApiWorldGeneratorReturnType.java
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the Distant Horizons mod
+ * licensed under the GNU LGPL v3 License.
+ *
+ * Copyright (C) 2020-2023 James Seibel
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.seibel.distanthorizons.api.enums.worldGeneration;
+
+import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiDistantGeneratorMode;
+import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGenerator;
+
+import java.util.concurrent.ExecutorService;
+import java.util.function.Consumer;
+
+/**
+ * VANILLA_CHUNKS,
+ * API_CHUNKS
+ *
+ * @author Builderb0y, James Seibel
+ * @version 2023-12-21
+ * @since API 1.1.0
+ */
+public enum EDhApiWorldGeneratorReturnType
+{
+ /**
+ * when this constant is returned by {@link IDhApiWorldGenerator#getReturnType()},
+ * {@link IDhApiWorldGenerator#generateChunks(int, int, byte, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)}
+ * will be used when generating terrain.
+ *
+ * @since API 1.1.0
+ */
+ VANILLA_CHUNKS,
+
+ /**
+ * when this constant is returned by {@link IDhApiWorldGenerator#getReturnType()},
+ * {@link IDhApiWorldGenerator#generateApiChunks(int, int, byte, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)}
+ * will be used when generating terrain.
+ *
+ * @since API 1.1.0
+ */
+ API_CHUNKS;
+
+}
diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/worldGenerator/IDhApiWorldGenerator.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/worldGenerator/IDhApiWorldGenerator.java
index 5ec1293f0..16f3c0a68 100644
--- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/worldGenerator/IDhApiWorldGenerator.java
+++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/worldGenerator/IDhApiWorldGenerator.java
@@ -19,9 +19,11 @@
package com.seibel.distanthorizons.api.interfaces.override.worldGenerator;
+import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiWorldGeneratorReturnType;
import com.seibel.distanthorizons.api.interfaces.override.IDhApiOverrideable;
import com.seibel.distanthorizons.api.enums.EDhApiDetailLevel;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiDistantGeneratorMode;
+import com.seibel.distanthorizons.api.objects.data.DhApiChunk;
import java.io.Closeable;
import java.util.concurrent.CompletableFuture;
@@ -102,7 +104,8 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
//=================//
/**
- * This method is called by Distant Horizons to generate terrain over a given area.
+ * This method is called by Distant Horizons to generate terrain over a given area when
+ * {@link #getReturnType()} returns {@link EDhApiWorldGeneratorReturnType#VANILLA_CHUNKS}.
*
* After a chunk has been generated it (and any necessary supporting objects as listed below) should be passed into the
* resultConsumer's {@link Consumer#accept} method. If the Consumer is given the wrong data
@@ -115,22 +118,80 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
* - [net.minecraft.world.level.chunk.ChunkAccess]
* - [net.minecraft.world.level.ServerLevel] or [net.minecraft.world.level.ClientLevel]
*
- * @param chunkPosMinX the chunk X position closest to negative infinity
- * @param chunkPosMinZ the chunk Z position closest to negative infinity
+ * @implNote the default implementation of this method throws an {@link UnsupportedOperationException},
+ * and must be overridden when {@link #getReturnType()} returns {@link EDhApiWorldGeneratorReturnType#VANILLA_CHUNKS}.
+ * since {@link #getReturnType()} returns {@link EDhApiWorldGeneratorReturnType#VANILLA_CHUNKS} by default,
+ * this method must also be overridden when {@link #getReturnType()} is NOT overridden.
+ *
+ * @param chunkPosMinX the chunk X position closest to negative infinity
+ * @param chunkPosMinZ the chunk Z position closest to negative infinity
* @param granularity TODO find a central location to store the definition of granularity. For now it is stored in the Core method: WorldGenerationQueue#startGenerationEvent
* @param targetDataDetail the LOD Detail level requested to generate. See {@link EDhApiDetailLevel} for additional information.
* @param generatorMode how far into the world gen pipeline this method run. See {@link EDhApiDistantGeneratorMode} for additional documentation.
* @param worldGeneratorThreadPool the thread pool that should be used when generating the returned {@link CompletableFuture}.
* @param resultConsumer the consumer that should be fired whenever a chunk finishes generating.
- *
+ *
* @return a future that should run on the worldGeneratorThreadPool and complete once the given generation task has completed.
- *
+ *
* @since API 1.0.0
*/
- CompletableFuture generateChunks(
- int chunkPosMinX, int chunkPosMinZ,
- byte granularity, byte targetDataDetail, EDhApiDistantGeneratorMode generatorMode,
- ExecutorService worldGeneratorThreadPool, Consumer