--- a/net/minecraft/server/IChunkLoader.java
+++ b/net/minecraft/server/IChunkLoader.java
@@ -17,15 +17,56 @@
         this.b = datafixer;
     }
 
-    public NBTTagCompound getChunkData(DimensionManager dimensionmanager, Supplier<WorldPersistentData> supplier, NBTTagCompound nbttagcompound) {
+    // CraftBukkit start
+    private boolean check(ChunkProviderServer cps, int x, int z) throws IOException {
+        ChunkCoordIntPair pos = new ChunkCoordIntPair(x, z);
+        if (cps != null) {
+            com.google.common.base.Preconditions.checkState(org.bukkit.Bukkit.isPrimaryThread(), "primary thread");
+            if (cps.isLoaded(x, z)) {
+                return true;
+            }
+        }
+
+        if (this.chunkExists(pos)) {
+            NBTTagCompound nbt = read(pos);
+            if (nbt != null) {
+                NBTTagCompound level = nbt.getCompound("Level");
+                if (level.getBoolean("TerrainPopulated")) {
+                    return true;
+                }
+
+                ChunkStatus status = ChunkStatus.a(level.getString("Status"));
+                if (status != null && status.b(ChunkStatus.FEATURES)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+    // CraftBukkit end
+
+    public NBTTagCompound getChunkData(DimensionManager dimensionmanager, Supplier<WorldPersistentData> supplier, NBTTagCompound nbttagcompound, ChunkCoordIntPair pos, @Nullable GeneratorAccess generatoraccess) throws IOException {
         int i = a(nbttagcompound);
         boolean flag = true;
 
+        // CraftBukkit start
+        if (i < 1466) {
+            NBTTagCompound level = nbttagcompound.getCompound("Level");
+            if (level.getBoolean("TerrainPopulated") && !level.getBoolean("LightPopulated")) {
+                ChunkProviderServer cps = (generatoraccess == null) ? null : ((WorldServer) generatoraccess).getChunkProvider();
+                if (check(cps, pos.x - 1, pos.z) && check(cps, pos.x - 1, pos.z - 1) && check(cps, pos.x, pos.z - 1)) {
+                    level.setBoolean("LightPopulated", true);
+                }
+            }
+        }
+        // CraftBukkit end
+
         if (i < 1493) {
             nbttagcompound = GameProfileSerializer.a(this.b, DataFixTypes.CHUNK, nbttagcompound, i, 1493);
             if (nbttagcompound.getCompound("Level").getBoolean("hasLegacyStructureData")) {
                 if (this.a == null) {
-                    this.a = PersistentStructureLegacy.a(dimensionmanager, (WorldPersistentData) supplier.get());
+                    this.a = PersistentStructureLegacy.a(dimensionmanager.getType(), (WorldPersistentData) supplier.get()); // CraftBukkit - getType
                 }
 
                 nbttagcompound = this.a.a(nbttagcompound);