--- a/net/minecraft/server/TileEntity.java
+++ b/net/minecraft/server/TileEntity.java
@@ -4,9 +4,18 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.util.Supplier;
+// CraftBukkit start
+import org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer;
+import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry;
+import org.bukkit.inventory.InventoryHolder;
+// CraftBukkit end
 
 public abstract class TileEntity {
 
+    // CraftBukkit start - data containers
+    private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry();
+    public CraftPersistentDataContainer persistentDataContainer;
+    // CraftBukkit end
     private static final Logger LOGGER = LogManager.getLogger();
     private final TileEntityTypes<?> b;
     @Nullable
@@ -37,6 +46,14 @@
 
     public void load(NBTTagCompound nbttagcompound) {
         this.position = new BlockPosition(nbttagcompound.getInt("x"), nbttagcompound.getInt("y"), nbttagcompound.getInt("z"));
+        // CraftBukkit start - read container
+        this.persistentDataContainer = new CraftPersistentDataContainer(DATA_TYPE_REGISTRY);
+
+        NBTTagCompound persistentDataTag = nbttagcompound.getCompound("PublicBukkitValues");
+        if (persistentDataTag != null) {
+            this.persistentDataContainer.putAll(persistentDataTag);
+        }
+        // CraftBukkit end
     }
 
     public NBTTagCompound save(NBTTagCompound nbttagcompound) {
@@ -53,6 +70,11 @@
             nbttagcompound.setInt("x", this.position.getX());
             nbttagcompound.setInt("y", this.position.getY());
             nbttagcompound.setInt("z", this.position.getZ());
+            // CraftBukkit start - store container
+            if (this.persistentDataContainer != null && !this.persistentDataContainer.isEmpty()) {
+                nbttagcompound.set("PublicBukkitValues", this.persistentDataContainer.toTagCompound());
+            }
+            // CraftBukkit end
             return nbttagcompound;
         }
     }
@@ -168,4 +190,13 @@
                     }, this::getPosition});
         }
     }
+
+    // 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
 }