--- a/net/minecraft/world/level/storage/LevelStorageSource.java
+++ b/net/minecraft/world/level/storage/LevelStorageSource.java
@@ -145,6 +_,7 @@
         PrimaryLevelData primaryLevelData = PrimaryLevelData.parse(
             dynamic, levelSettings, complete.specialWorldProperty(), worldGenSettings.options(), lifecycle
         );
+        primaryLevelData.pdc = (Tag) dynamic.getElement("BukkitValues", null); // CraftBukkit - Add PDC to world
         return new LevelDataAndDimensions(primaryLevelData, complete);
     }
 
@@ -340,25 +_,39 @@
         return this.backupDir;
     }
 
-    public LevelStorageSource.LevelStorageAccess validateAndCreateAccess(String saveName) throws IOException, ContentValidationException {
+    public LevelStorageSource.LevelStorageAccess validateAndCreateAccess(String saveName, ResourceKey<LevelStem> dimensionType) throws IOException, ContentValidationException { // CraftBukkit
         Path levelPath = this.getLevelPath(saveName);
-        List<ForbiddenSymlinkInfo> list = this.worldDirValidator.validateDirectory(levelPath, true);
+        List<ForbiddenSymlinkInfo> list = Boolean.getBoolean("paper.disableWorldSymlinkValidation") ? List.of() : this.worldDirValidator.validateDirectory(levelPath, true); // Paper - add skipping of symlinks scan
         if (!list.isEmpty()) {
             throw new ContentValidationException(levelPath, list);
         } else {
-            return new LevelStorageSource.LevelStorageAccess(saveName, levelPath);
+            return new LevelStorageSource.LevelStorageAccess(saveName, levelPath, dimensionType); // CraftBukkit
         }
     }
 
-    public LevelStorageSource.LevelStorageAccess createAccess(String saveName) throws IOException {
+    public LevelStorageSource.LevelStorageAccess createAccess(String saveName, ResourceKey<LevelStem> dimensionType) throws IOException { // CraftBukkit
         Path levelPath = this.getLevelPath(saveName);
-        return new LevelStorageSource.LevelStorageAccess(saveName, levelPath);
+        return new LevelStorageSource.LevelStorageAccess(saveName, levelPath, dimensionType); // CraftBukkit
     }
 
     public DirectoryValidator getWorldDirValidator() {
         return this.worldDirValidator;
     }
 
+    // CraftBukkit start
+    public static Path getStorageFolder(Path path, ResourceKey<LevelStem> dimensionType) {
+        if (dimensionType == LevelStem.OVERWORLD) {
+            return path;
+        } else if (dimensionType == LevelStem.NETHER) {
+            return path.resolve("DIM-1");
+        } else if (dimensionType == LevelStem.END) {
+            return path.resolve("DIM1");
+        } else {
+            return path.resolve("dimensions").resolve(dimensionType.location().getNamespace()).resolve(dimensionType.location().getPath());
+        }
+    }
+    // CraftBukkit end
+
     public record LevelCandidates(List<LevelStorageSource.LevelDirectory> levels) implements Iterable<LevelStorageSource.LevelDirectory> {
         public boolean isEmpty() {
             return this.levels.isEmpty();
@@ -409,8 +_,12 @@
         public final LevelStorageSource.LevelDirectory levelDirectory;
         private final String levelId;
         private final Map<LevelResource, Path> resources = Maps.newHashMap();
+        // CraftBukkit start
+        public final ResourceKey<LevelStem> dimensionType;
 
-        LevelStorageAccess(final String levelId, final Path levelDir) throws IOException {
+        LevelStorageAccess(final String levelId, final Path levelDir, final ResourceKey<LevelStem> dimensionType) throws IOException {
+            this.dimensionType = dimensionType;
+            // CraftBukkit end
             this.levelId = levelId;
             this.levelDirectory = new LevelStorageSource.LevelDirectory(levelDir);
             this.lock = DirectoryLock.create(levelDir);
@@ -453,7 +_,7 @@
         }
 
         public Path getDimensionPath(ResourceKey<Level> dimensionPath) {
-            return DimensionType.getStorageFolder(dimensionPath, this.levelDirectory.path());
+            return LevelStorageSource.getStorageFolder(this.levelDirectory.path(), this.dimensionType); // CraftBukkit
         }
 
         private void checkLock() {
