--- ../src-base/minecraft/net/minecraft/tileentity/TileEntity.java
+++ ../src-work/minecraft/net/minecraft/tileentity/TileEntity.java
@@ -294,4 +294,92 @@
         func_145826_a(TileEntityFlowerPot.class, "FlowerPot");
         func_145826_a(TileEntityBanner.class, "Banner");
     }
+
+    // -- BEGIN FORGE PATCHES --
+    /**
+     * Called when you receive a TileEntityData packet for the location this
+     * TileEntity is currently in. On the client, the NetworkManager will always
+     * be the remote server. On the server, it will be whomever is responsible for
+     * sending the packet.
+     *
+     * @param net The NetworkManager the packet originated from
+     * @param pkt The data packet
+     */
+    public void onDataPacket(net.minecraft.network.NetworkManager net, net.minecraft.network.play.server.S35PacketUpdateTileEntity pkt)
+    {
+    }
+
+    /**
+     * Called when the chunk this TileEntity is on is Unloaded.
+     */
+    public void onChunkUnload()
+    {
+    }
+
+    private boolean isVanilla = getClass().getName().startsWith("net.minecraft.tileentity");
+    /**
+     * Called from Chunk.setBlockIDWithMetadata, determines if this tile entity should be re-created when the ID, or Metadata changes.
+     * Use with caution as this will leave straggler TileEntities, or create conflicts with other TileEntities if not used properly.
+     *
+     * @param world Current world
+     * @param pos Tile's world position
+     * @param oldID The old ID of the block
+     * @param newID The new ID of the block (May be the same)
+     * @return True to remove the old tile entity, false to keep it in tact {and create a new one if the new values specify to}
+     */
+    public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate)
+    {
+        return !isVanilla || (oldState != newSate);
+    }
+
+    public boolean shouldRenderInPass(int pass)
+    {
+        return pass == 0;
+    }
+
+    /**
+     * Sometimes default render bounding box: infinite in scope. Used to control rendering on {@link TileEntitySpecialRenderer}.
+     */
+    public static final net.minecraft.util.AxisAlignedBB INFINITE_EXTENT_AABB = new net.minecraft.util.AxisAlignedBB(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
+    /**
+     * Return an {@link AxisAlignedBB} that controls the visible scope of a {@link TileEntitySpecialRenderer} associated with this {@link TileEntity}
+     * Defaults to the collision bounding box {@link Block#getCollisionBoundingBoxFromPool(World, int, int, int)} associated with the block
+     * at this location.
+     *
+     * @return an appropriately size {@link AxisAlignedBB} for the {@link TileEntity}
+     */
+    @SideOnly(Side.CLIENT)
+    public net.minecraft.util.AxisAlignedBB getRenderBoundingBox()
+    {
+        net.minecraft.util.AxisAlignedBB bb = INFINITE_EXTENT_AABB;
+        Block type = func_145838_q();
+        if (type == Blocks.field_150381_bn)
+        {
+            bb = new net.minecraft.util.AxisAlignedBB(func_174877_v(), func_174877_v().func_177982_a(1, 1, 1));
+        }
+        else if (type == Blocks.field_150486_ae || type == Blocks.field_150447_bR)
+        {
+            bb = new net.minecraft.util.AxisAlignedBB(func_174877_v().func_177982_a(-1, 0, -1), func_174877_v().func_177982_a(2, 2, 2));
+        }
+        else if (type != null && type != Blocks.field_150461_bJ)
+        {
+            net.minecraft.util.AxisAlignedBB cbb = type.func_180640_a(field_145850_b, func_174877_v(), field_145850_b.func_180495_p(func_174877_v()));
+            if (cbb != null) bb = cbb;
+        }
+        return bb;
+    }
+
+    /**
+     * Checks if this tile entity knows how to render its 'breaking' overlay effect.
+     * If this returns true, The TileEntitySpecialRenderer will be called again with break progress set.
+     * @return True to re-render tile with breaking effect.
+     */
+    public boolean canRenderBreaking()
+    {
+        Block block = this.func_145838_q();
+        return (block instanceof net.minecraft.block.BlockChest ||
+                block instanceof net.minecraft.block.BlockEnderChest ||
+                block instanceof net.minecraft.block.BlockSign ||
+                block instanceof net.minecraft.block.BlockSkull);
+    }
 }
