--- a/net/minecraft/server/TileEntity.java
+++ b/net/minecraft/server/TileEntity.java
@@ -4,6 +4,8 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import org.bukkit.inventory.InventoryHolder; // CraftBukkit
+
 public abstract class TileEntity {
 
     private static final Logger a = LogManager.getLogger();
@@ -54,8 +56,15 @@
         }
     }
 
+    // CraftBukkit start
     @Nullable
     public static TileEntity create(NBTTagCompound nbttagcompound) {
+        return create(nbttagcompound, null);
+    }
+
+    @Nullable
+    public static TileEntity create(NBTTagCompound nbttagcompound, @Nullable World world) {
+        // CraftBukkit end
         TileEntity tileentity = null;
         String s = nbttagcompound.getString("id");
 
@@ -67,6 +76,7 @@
 
         if (tileentity != null) {
             try {
+                tileentity.setWorld(world); // CraftBukkit
                 tileentity.load(nbttagcompound);
             } catch (Throwable throwable1) {
                 TileEntity.a.error("Failed to load data for block entity {}", s, throwable1);
@@ -156,4 +166,13 @@
     public TileEntityTypes<?> C() {
         return this.e;
     }
+
+    // CraftBukkit start - add method
+    public InventoryHolder getOwner() {
+        if (world == null) return null;
+        org.bukkit.block.BlockState state = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()).getState();
+        if (state instanceof InventoryHolder) return (InventoryHolder) state;
+        return null;
+    }
+    // CraftBukkit end
 }