diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
index db700abfad..592e12033e 100644
--- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
+++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
@@ -11,7 +11,7 @@ import org.bukkit.block.Block;
 import org.bukkit.craftbukkit.block.CraftBlock;
 
 public class CraftChunk implements Chunk {
-    private final net.minecraft.server.Chunk chunk;
+    private net.minecraft.server.Chunk chunk;
     private final HashMap<Integer, Block> cache = new HashMap<Integer, Block>();
 
     public CraftChunk(net.minecraft.server.Chunk chunk) {
@@ -48,4 +48,8 @@ public class CraftChunk implements Chunk {
         }
         return block;
     }
+
+    public void breakLink() {
+        this.chunk = null;
+    }
 }
diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 7be7c4586b..2f3fe70563 100644
--- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -28,6 +28,7 @@ public class CraftWorld implements World {
     private final Environment environment;
     private final CraftServer server;
     private final ChunkProviderServer provider;
+    private HashMap<Integer,CraftChunk> unloadedChunks = new HashMap<Integer, CraftChunk>();
 
     private static final Random rand = new Random();
 
@@ -45,6 +46,15 @@ public class CraftWorld implements World {
         server.addWorld(this);
     }
 
+    public void preserveChunk( CraftChunk chunk ) {
+        chunk.breakLink();
+        unloadedChunks.put( chunk.getX() << 16 + chunk.getZ(), chunk );
+    }
+
+    public CraftChunk popPreservedChunk( int x, int z ) {
+        return unloadedChunks.remove( x << 16 + z );
+    }
+
     public Block getBlockAt(int x, int y, int z) {
         return getChunkAt(x >> 4, z >> 4).getBlock(x & 0xF, y & 0x7F, z & 0xF);
     }