diff --git a/nms-patches/ChunkRegionLoader.patch b/nms-patches/ChunkRegionLoader.patch
index bb45e8250e..fc721911e2 100644
--- a/nms-patches/ChunkRegionLoader.patch
+++ b/nms-patches/ChunkRegionLoader.patch
@@ -1,6 +1,6 @@
 --- a/net/minecraft/server/ChunkRegionLoader.java
 +++ b/net/minecraft/server/ChunkRegionLoader.java
-@@ -29,8 +29,36 @@
+@@ -29,25 +29,55 @@
          this.e = dataconvertermanager;
      }
  
@@ -37,7 +37,21 @@
          ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j);
          NBTTagCompound nbttagcompound = (NBTTagCompound) this.b.get(chunkcoordintpair);
  
-@@ -47,7 +75,7 @@
+         if (nbttagcompound == null) {
+-            DataInputStream datainputstream = RegionFileCache.c(this.d, i, j);
++            // CraftBukkit start
++            nbttagcompound = RegionFileCache.c(this.d, i, j);
+ 
+-            if (datainputstream == null) {
++            if (nbttagcompound == null) {
+                 return null;
+             }
+ 
+-            nbttagcompound = this.e.a((DataConverterType) DataConverterTypes.CHUNK, NBTCompressedStreamTools.a(datainputstream));
++            nbttagcompound = this.e.a((DataConverterType) DataConverterTypes.CHUNK, nbttagcompound);
++            // CraftBukkit end
+         }
+ 
          return this.a(world, i, j, nbttagcompound);
      }
  
@@ -46,7 +60,7 @@
          if (!nbttagcompound.hasKeyOfType("Level", 10)) {
              ChunkRegionLoader.a.error("Chunk file at {},{} is missing level data, skipping", new Object[] { Integer.valueOf(i), Integer.valueOf(j)});
              return null;
-@@ -64,10 +92,28 @@
+@@ -64,10 +94,28 @@
                      ChunkRegionLoader.a.error("Chunk file at {},{} is in the wrong location; relocating. (Expected {}, {}, got {}, {})", new Object[] { Integer.valueOf(i), Integer.valueOf(j), Integer.valueOf(i), Integer.valueOf(j), Integer.valueOf(chunk.locX), Integer.valueOf(chunk.locZ)});
                      nbttagcompound1.setInt("xPos", i);
                      nbttagcompound1.setInt("zPos", j);
@@ -76,7 +90,23 @@
              }
          }
      }
-@@ -326,6 +372,13 @@
+@@ -131,10 +179,14 @@
+     }
+ 
+     private void b(ChunkCoordIntPair chunkcoordintpair, NBTTagCompound nbttagcompound) throws IOException {
+-        DataOutputStream dataoutputstream = RegionFileCache.d(this.d, chunkcoordintpair.x, chunkcoordintpair.z);
++        // CraftBukkit start
++        RegionFileCache.d(this.d, chunkcoordintpair.x, chunkcoordintpair.z, nbttagcompound);
+ 
++        /*
+         NBTCompressedStreamTools.a(nbttagcompound, (DataOutput) dataoutputstream);
+         dataoutputstream.close();
++        */
++        // CraftBukkit end
+     }
+ 
+     public void b(World world, Chunk chunk) throws IOException {}
+@@ -326,6 +378,13 @@
              chunk.a(nbttagcompound.getByteArray("Biomes"));
          }
  
@@ -90,7 +120,7 @@
          NBTTagList nbttaglist1 = nbttagcompound.getList("Entities", 10);
  
          if (nbttaglist1 != null) {
-@@ -369,7 +422,7 @@
+@@ -369,7 +428,7 @@
              }
          }
  
@@ -99,7 +129,7 @@
      }
  
      @Nullable
-@@ -397,14 +450,20 @@
+@@ -397,14 +456,20 @@
      }
  
      @Nullable
@@ -121,7 +151,7 @@
                  return null;
              } else {
                  if (nbttagcompound.hasKeyOfType("Passengers", 9)) {
-@@ -433,8 +492,14 @@
+@@ -433,8 +498,14 @@
          }
      }
  
diff --git a/nms-patches/RegionFileCache.patch b/nms-patches/RegionFileCache.patch
new file mode 100644
index 0000000000..e1839bffb6
--- /dev/null
+++ b/nms-patches/RegionFileCache.patch
@@ -0,0 +1,32 @@
+--- a/net/minecraft/server/RegionFileCache.java
++++ b/net/minecraft/server/RegionFileCache.java
+@@ -53,15 +53,25 @@
+         RegionFileCache.a.clear();
+     }
+ 
+-    public static DataInputStream c(File file, int i, int j) {
++    // CraftBukkit start - call sites hoisted for synchronization
++    public static synchronized NBTTagCompound c(File file, int i, int j) throws IOException {
+         RegionFile regionfile = a(file, i, j);
+ 
+-        return regionfile.a(i & 31, j & 31);
++        DataInputStream datainputstream = regionfile.a(i & 31, j & 31);
++
++        if (datainputstream == null) {
++            return null;
++        }
++
++        return NBTCompressedStreamTools.a(datainputstream);
+     }
+ 
+-    public static DataOutputStream d(File file, int i, int j) {
++    public static synchronized void d(File file, int i, int j, NBTTagCompound nbttagcompound) throws IOException {
+         RegionFile regionfile = a(file, i, j);
+ 
+-        return regionfile.b(i & 31, j & 31);
++        DataOutputStream dataoutputstream = regionfile.b(i & 31, j & 31);
++        NBTCompressedStreamTools.a(nbttagcompound, (java.io.DataOutput) dataoutputstream);
++        dataoutputstream.close();
+     }
++    // CraftBukkit end
+ }