diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java
index dec58e21e..4610f4a1b 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java
@@ -98,23 +98,29 @@ public class CraftingPage
 
     }
 
+    @Override
+    public void onTick() {
+        ticks++;
+        for (GuidebookSlot slot : slots) {
+            if(ticks > 20) {
+                slot.showRandomItem();
+                if(slots.get(slots.size()-1) == slot){
+                    ticks = 0;
+                }
+            }
+        }
+    }
+
     @Override
     protected void renderForeground(TextureManager re, Font fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
         if(recipes.isEmpty()){
             drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
         }
         GuidebookSlot mouseOverSlot = null;
-        ticks++;
         for (GuidebookSlot slot : slots) {
             if(slot.item != null){
                 if(!slot.isOutput) slot.item.stackSize = 1;
             }
-            if(ticks > 150) {
-                slot.showRandomItem();
-                if(slots.get(slots.size()-1) == slot){
-                    ticks = 0;
-                }
-            }
             drawSlot(x+slot.x -1,y+slot.y -1,0xFFFFFFFF);
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
             itemElement.render(slot.getItem(),x+slot.x,y+slot.y,mouseOverSlot == slot,slot);
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/smelting/BlastSmeltingPage.java b/src/main/java/net/minecraft/client/gui/guidebook/smelting/BlastSmeltingPage.java
index 6e2d40968..702373d59 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/smelting/BlastSmeltingPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/smelting/BlastSmeltingPage.java
@@ -57,19 +57,25 @@ public class BlastSmeltingPage
     }
 
     @Override
-    protected void renderForeground(TextureManager re, Font fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
-        if(recipes.isEmpty()){
-            drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
-        }
-        GuidebookSlot mouseOverSlot = null;
+    public void onTick() {
         ticks++;
         for (GuidebookSlot slot : slots) {
-            if(ticks > 150) {
+            if(ticks > 20) {
                 slot.showRandomItem();
                 if(slots.get(slots.size()-1) == slot){
                     ticks = 0;
                 }
             }
+        }
+    }
+
+    @Override
+    protected void renderForeground(TextureManager re, Font fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
+        if(recipes.isEmpty()){
+            drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
+        }
+        GuidebookSlot mouseOverSlot = null;
+        for (GuidebookSlot slot : slots) {
             drawSlot(x+slot.x -1,y+slot.y -1,0xFFFFFFFF);
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
             itemElement.render(slot.getItem(),x+slot.x,y+slot.y,mouseOverSlot == slot,slot);
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/smelting/SmeltingPage.java b/src/main/java/net/minecraft/client/gui/guidebook/smelting/SmeltingPage.java
index 7aeb8a6cd..7df6ee29d 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/smelting/SmeltingPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/smelting/SmeltingPage.java
@@ -57,19 +57,25 @@ public class SmeltingPage
     }
 
     @Override
-    protected void renderForeground(TextureManager re, Font fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
-        if(recipes.isEmpty()){
-            drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
-        }
-        GuidebookSlot mouseOverSlot = null;
+    public void onTick() {
         ticks++;
         for (GuidebookSlot slot : slots) {
-            if(ticks > 150) {
+            if(ticks > 20) {
                 slot.showRandomItem();
                 if(slots.get(slots.size()-1) == slot){
                     ticks = 0;
                 }
             }
+        }
+    }
+
+    @Override
+    protected void renderForeground(TextureManager re, Font fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
+        if(recipes.isEmpty()){
+            drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
+        }
+        GuidebookSlot mouseOverSlot = null;
+        for (GuidebookSlot slot : slots) {
             drawSlot(x+slot.x -1,y+slot.y -1,0xFFFFFFFF);
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
             itemElement.render(slot.getItem(),x+slot.x,y+slot.y,mouseOverSlot == slot,slot);
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/trommeling/TrommelPage.java b/src/main/java/net/minecraft/client/gui/guidebook/trommeling/TrommelPage.java
index aa9c5a0bc..4757c7745 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/trommeling/TrommelPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/trommeling/TrommelPage.java
@@ -79,14 +79,19 @@ public class TrommelPage
     }
 
     @Override
-    protected void renderForeground(TextureManager re, Font fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
-        if(recipes.isEmpty()){
-            drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
-        }
-        GuidebookSlot mouseOverSlot = null;
+    public void onTick() {
         ticks++;
+        for (GuidebookSlot slot : slots) {
+            if(ticks > 20) {
+                slot.showRandomItem();
+                if(slots.get(slots.size()-1) == slot){
+                    ticks = 0;
+                }
+            }
+        }
+
         ticks2++;
-        if(ticks2 > 200) {
+        if(ticks2 > 25) {
             ticks2 = 0;
             for (GuidebookSlot slot : slots) {
                 if (slot.recipe instanceof RecipeEntryTrommel) {
@@ -111,13 +116,15 @@ public class TrommelPage
                 }
             }
         }
+    }
+
+    @Override
+    protected void renderForeground(TextureManager re, Font fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
+        if(recipes.isEmpty()){
+            drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
+        }
+        GuidebookSlot mouseOverSlot = null;
         for (GuidebookSlot slot : slots) {
-            if(ticks > 150) {
-                slot.showRandomItem();
-                if(slots.get(slots.size()-1) == slot){
-                    ticks = 0;
-                }
-            }
             drawSlot(x+slot.x -1,y+slot.y -1,0xFFFFFFFF);
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
             itemElement.render(slot.getItem(),x+slot.x,y+slot.y,mouseOverSlot == slot,slot);
diff --git a/src/main/java/net/minecraft/client/gui/hud/IngameHud.java b/src/main/java/net/minecraft/client/gui/hud/IngameHud.java
index 53ccc13aa..8f9129b6a 100644
--- a/src/main/java/net/minecraft/client/gui/hud/IngameHud.java
+++ b/src/main/java/net/minecraft/client/gui/hud/IngameHud.java
@@ -55,6 +55,7 @@ import org.slf4j.Logger;
 
 public class IngameHud extends Gui
 {
+    public static final float DEBUG_SCALE = 0.75f;
     private static final Logger LOGGER = LogUtils.getLogger();
     public static final Direction[] directions = new Direction[]{Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST};
 
@@ -186,8 +187,10 @@ public class IngameHud extends Gui
 
             if (mc.gameSettings.showDebugScreen.value)
             {
+                glPushMatrix();
                 glEnable(GL_BLEND);
                 glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+                glScalef(DEBUG_SCALE, DEBUG_SCALE, 1);
 
                 debugLine = 0;
                 debugLineRight = 0;
@@ -297,6 +300,11 @@ public class IngameHud extends Gui
 
                 debugOffset += space;
 
+                drawDebugScreenLine("Entities: " + mc.theWorld.getLoadedEntityList().size());
+                drawDebugScreenLine("Block Entities: " + mc.theWorld.getLoadedBlockEntityList().size());
+
+                debugOffset += space;
+
                 if (clock)
                 {
                     drawDebugScreenLine("Time: " + getTimeString() + " (Day " + (mc.theWorld.getWorldTime() / Global.DAY_LENGTH_TICKS) + ")");
@@ -409,6 +417,7 @@ public class IngameHud extends Gui
                         }
                     }
                 }
+                glPopMatrix();
             }
             if (!mc.gameSettings.showDebugScreen.value)
             {
@@ -648,7 +657,7 @@ public class IngameHud extends Gui
     {
         int width = font.getStringWidth(string);
         int height = debugLineHeight;
-        int x = right ? mc.resolution.getScaledWidthScreenCoords() - width - 2 : 2;
+        int x = right ? (int) ((mc.resolution.getScaledWidthScreenCoords() / DEBUG_SCALE) - width - 2) : 2;
         int y = 3 + line * debugLineHeight + offset;
 
         glDisable(GL_TEXTURE_2D);
diff --git a/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java b/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java
index c7d77846d..01e91ef0c 100644
--- a/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java
+++ b/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java
@@ -723,7 +723,7 @@ public class MinecartEntity extends Entity implements Container {
                 break;
             case CHEST_CART:
                 if(!world.isClientSide) {
-                    if (player.isSneaking() && player.getHeldObject() == null) {
+                    if (player.isSneaking() && player.inventory.getCurrentItem() == null && player.getHeldObject() == null) {
                         ChestBlockEntity blockEntity = new ChestBlockEntity();
                         for (int i = 0; i < this.getContainerSize(); i++) {
                             blockEntity.setItem(i, this.getItem(i));
diff --git a/src/main/java/net/minecraft/core/world/World.java b/src/main/java/net/minecraft/core/world/World.java
index fc277ad9d..d3bebcc0a 100644
--- a/src/main/java/net/minecraft/core/world/World.java
+++ b/src/main/java/net/minecraft/core/world/World.java
@@ -88,7 +88,6 @@ public class World implements WorldSource {
     private final TreeSet<NextTickListEntry> scheduledTickTreeSet = new TreeSet<>();
     private final Set<NextTickListEntry> scheduledTickSet = new HashSet<>();
     public List<BlockEntity> loadedBlockEntityList = new ArrayList<>();
-    private final List<BlockEntity> queuedBlockEntityAdditions = new ArrayList<>();
     public List<Player> players = new ArrayList<>();
     public List<Entity> weatherEffects = new ArrayList<>();
     public final ArrayList<AABB> collidingBoundingBoxes = new ArrayList<>();
@@ -1874,7 +1873,7 @@ public class World implements WorldSource {
             if (!blockEntity.isInvalid() && isBlockLoaded(blockEntity.x, blockEntity.y, blockEntity.z)) {
                 blockEntity.tick();
             }
-            if (blockEntity.isInvalid() && blockEntity == getBlockEntity(blockEntity.x, blockEntity.y, blockEntity.z)) {
+            if (blockEntity.isInvalid()) {
                 loadedBlockEntityList.remove(i);
                 Chunk chunk = getChunkFromChunkCoords(Math.floorDiv(blockEntity.x, Chunk.CHUNK_SIZE_X), Math.floorDiv(blockEntity.z, Chunk.CHUNK_SIZE_Z));
                 if (chunk != null) {
@@ -2261,15 +2260,16 @@ public class World implements WorldSource {
         }
     }
 
-    public void setBlockTileEntity(int i, int j, int k, BlockEntity tileentity)
+    public void setBlockTileEntity(int i, int j, int k, BlockEntity blockEntity)
     {
-        if(!tileentity.isInvalid())
+        if(!blockEntity.isInvalid())
         {
-            loadedBlockEntityList.add(tileentity);
             Chunk chunk = getChunkFromChunkCoords(Math.floorDiv(i, Chunk.CHUNK_SIZE_X), Math.floorDiv(k, Chunk.CHUNK_SIZE_Z));
             if(chunk != null)
             {
-                chunk.setBlockEntity(i & (Chunk.CHUNK_SIZE_X - 1), j, k & (Chunk.CHUNK_SIZE_Z - 1), tileentity);
+                if (chunk.setBlockEntity(i & (Chunk.CHUNK_SIZE_X - 1), j, k & (Chunk.CHUNK_SIZE_Z - 1), blockEntity) && !loadedBlockEntityList.contains(blockEntity)) {
+                    loadedBlockEntityList.add(blockEntity);
+                }
             }
         }
     }
@@ -2711,6 +2711,11 @@ public class World implements WorldSource {
         return loadedEntityList;
     }
 
+    public List<BlockEntity> getLoadedBlockEntityList()
+    {
+        return loadedBlockEntityList;
+    }
+
     public void updateTileEntityChunkAndSendToPlayer(int x, int y, int z, BlockEntity blockEntity)
     {
         if(isBlockLoaded(x, y, z))
diff --git a/src/main/java/net/minecraft/core/world/chunk/Chunk.java b/src/main/java/net/minecraft/core/world/chunk/Chunk.java
index 4a8272092..1427443b7 100644
--- a/src/main/java/net/minecraft/core/world/chunk/Chunk.java
+++ b/src/main/java/net/minecraft/core/world/chunk/Chunk.java
@@ -1,7 +1,6 @@
 package net.minecraft.core.world.chunk;
 
 import com.mojang.logging.LogUtils;
-import net.minecraft.core.Global;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.util.helper.MathHelper;
@@ -511,7 +510,10 @@ public class Chunk
         }
     }
 
-    public void setBlockEntity(int x, int y, int z, BlockEntity blockEntity)
+    /**
+     * @return True if the specified block entity was set
+     */
+    public boolean setBlockEntity(int x, int y, int z, BlockEntity blockEntity)
     {
         ChunkPosition chunkposition = new ChunkPosition(x, y, z);
         blockEntity.worldObj = world;
@@ -526,8 +528,11 @@ public class Chunk
         else
         {
             blockEntity.validate();
-            blockEntityMap.put(chunkposition, blockEntity);
+            BlockEntity previous = blockEntityMap.put(chunkposition, blockEntity);
+            world.loadedBlockEntityList.remove(previous);
+            return true;
         }
+        return false;
     }
 
     public void removeBlockEntity(int x, int y, int z)
diff --git a/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java b/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java
index 3a7610e04..bb96abdfd 100644
--- a/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java
+++ b/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java
@@ -36,7 +36,7 @@ public class DisplayChunk extends EmptyChunk{
         return 15;
     }
     @Override
-    public void setBlockEntity(int x, int y, int z, BlockEntity blockEntity)
+    public boolean setBlockEntity(int x, int y, int z, BlockEntity blockEntity)
     {
         if (x == displayBlockPosX && y == displayBlockPosY && z == displayBlockPosZ){
             displayBlockEntity = blockEntity;
@@ -45,6 +45,7 @@ public class DisplayChunk extends EmptyChunk{
             displayBlockEntity.y = y;
             displayBlockEntity.z = z;
         }
+        return true;
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/world/chunk/EmptyChunk.java b/src/main/java/net/minecraft/core/world/chunk/EmptyChunk.java
index 280ed9359..53d31aecb 100644
--- a/src/main/java/net/minecraft/core/world/chunk/EmptyChunk.java
+++ b/src/main/java/net/minecraft/core/world/chunk/EmptyChunk.java
@@ -130,8 +130,9 @@ public class EmptyChunk extends Chunk
     }
 
     @Override
-	public void setBlockEntity(int x, int y, int z, BlockEntity blockEntity)
+	public boolean setBlockEntity(int x, int y, int z, BlockEntity blockEntity)
     {
+        return false;
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java b/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java
index 4c834ba45..095e6dcf5 100644
--- a/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java
@@ -373,7 +373,7 @@ public class ServerPlayer extends Player implements ContainerListener {
                     WorldServer worldserver = mcServer.getDimensionWorld(dimension);
                     loadedChunks.remove(chunkCoord);
                     playerNetServerHandler.sendPacket(new BlockRegionUpdatePacket(chunkCoord.x * Chunk.CHUNK_SIZE_X, 0, chunkCoord.z * Chunk.CHUNK_SIZE_Z, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SECTIONS * ChunkSection.SECTION_SIZE_Y, Chunk.CHUNK_SIZE_Z, worldserver));
-                    List list = worldserver.getTileEntityList(chunkCoord.x * Chunk.CHUNK_SIZE_X, 0, chunkCoord.z * Chunk.CHUNK_SIZE_Z, chunkCoord.x * Chunk.CHUNK_SIZE_X + Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SECTIONS * ChunkSection.SECTION_SIZE_Y, chunkCoord.z * Chunk.CHUNK_SIZE_Z + Chunk.CHUNK_SIZE_Z);
+                    List list = worldserver.getBlockEntitiesWithinBounds(chunkCoord.x * Chunk.CHUNK_SIZE_X, 0, chunkCoord.z * Chunk.CHUNK_SIZE_Z, chunkCoord.x * Chunk.CHUNK_SIZE_X + Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SECTIONS * ChunkSection.SECTION_SIZE_Y, chunkCoord.z * Chunk.CHUNK_SIZE_Z + Chunk.CHUNK_SIZE_Z);
                     for (int j = 0; j < list.size(); j++)
                     {
                         getTileEntityInfo((BlockEntity) list.get(j));
diff --git a/src/main/java/net/minecraft/server/player/PlayerManager.java b/src/main/java/net/minecraft/server/player/PlayerManager.java
index b4327f74d..f9f855ec3 100644
--- a/src/main/java/net/minecraft/server/player/PlayerManager.java
+++ b/src/main/java/net/minecraft/server/player/PlayerManager.java
@@ -329,7 +329,7 @@ public class PlayerManager
     //	            zSize = 16;
     //            }
                 sendPacketToPlayersInInstance(new BlockRegionUpdatePacket(minWorldX, minWorldY, minWorldZ, xSize, ySize, zSize, world));
-                List<BlockEntity> list = world.getTileEntityList(minWorldX, minWorldY, minWorldZ, minWorldX + xSize, minWorldY + ySize, minWorldZ + zSize);
+                List<BlockEntity> list = world.getBlockEntitiesWithinBounds(minWorldX, minWorldY, minWorldZ, minWorldX + xSize, minWorldY + ySize, minWorldZ + zSize);
                 for(int j3 = 0; j3 < list.size(); j3++)
                 {
                     updateTileEntity((BlockEntity)list.get(j3));
diff --git a/src/main/java/net/minecraft/server/world/WorldServer.java b/src/main/java/net/minecraft/server/world/WorldServer.java
index b3eaea5b7..f361f09e7 100644
--- a/src/main/java/net/minecraft/server/world/WorldServer.java
+++ b/src/main/java/net/minecraft/server/world/WorldServer.java
@@ -60,15 +60,15 @@ public class WorldServer extends World
         return chunkProviderServer;
     }
 
-    public List<BlockEntity> getTileEntityList(int i, int j, int k, int l, int i1, int j1)
+    public List<BlockEntity> getBlockEntitiesWithinBounds(int minX, int minY, int minZ, int maxX, int maxY, int maxZ)
     {
         ArrayList<BlockEntity> arraylist = new ArrayList<>();
-        for(int k1 = 0; k1 < loadedBlockEntityList.size(); k1++)
+        for(int i = 0; i < loadedBlockEntityList.size(); i++)
         {
-            BlockEntity tileentity = loadedBlockEntityList.get(k1);
-            if(tileentity.x >= i && tileentity.y >= j && tileentity.z >= k && tileentity.x < l && tileentity.y < i1 && tileentity.z < j1)
+            BlockEntity blockEntity = loadedBlockEntityList.get(i);
+            if(blockEntity.x >= minX && blockEntity.y >= minY && blockEntity.z >= minZ && blockEntity.x < maxX && blockEntity.y < maxY && blockEntity.z < maxZ)
             {
-                arraylist.add(tileentity);
+                arraylist.add(blockEntity);
             }
         }
 
