diff --git a/src/common/resources/lang/en_US/item.lang b/src/common/resources/lang/en_US/item.lang
index 0edfbd39b..ddaaf49d2 100644
--- a/src/common/resources/lang/en_US/item.lang
+++ b/src/common/resources/lang/en_US/item.lang
@@ -370,3 +370,44 @@ item.seeds.pumpkin.desc=For endless pumpkin pie.
 
 item.seat.name=Seat
 item.seat.desc=Sit down and relax.
+
+item.door.oak.painted.name=Door Painted
+item.door.oak.painted.desc=How did you get this?!
+item.door.oak.painted.black.name=Black Wooden Door
+item.door.oak.painted.black.desc=Every house needs one.
+item.door.oak.painted.red.name=Red Wooden Door
+item.door.oak.painted.red.desc=Every house needs one.
+item.door.oak.painted.green.name=Green Wooden Door
+item.door.oak.painted.green.desc=Every house needs one.
+item.door.oak.painted.brown.name=Brown Wooden Door
+item.door.oak.painted.brown.desc=Every house needs one.
+item.door.oak.painted.blue.name=Blue Wooden Door
+item.door.oak.painted.blue.desc=Every house needs one.
+item.door.oak.painted.purple.name=Purple Wooden Door
+item.door.oak.painted.purple.desc=Every house needs one.
+item.door.oak.painted.cyan.name=Cyan Wooden Door
+item.door.oak.painted.cyan.desc=Every house needs one.
+item.door.oak.painted.silver.name=Light Gray Wooden Door
+item.door.oak.painted.silver.desc=Every house needs one.
+item.door.oak.painted.gray.name=Gray Wooden Door
+item.door.oak.painted.gray.desc=Every house needs one.
+item.door.oak.painted.pink.name=Pink Wooden Door
+item.door.oak.painted.pink.desc=Every house needs one.
+item.door.oak.painted.lime.name=Lime Wooden Door
+item.door.oak.painted.lime.desc=Every house needs one.
+item.door.oak.painted.yellow.name=Yellow Wooden Door
+item.door.oak.painted.yellow.desc=Every house needs one.
+item.door.oak.painted.lightblue.name=Light Blue Wooden Door
+item.door.oak.painted.lightblue.desc=Every house needs one.
+item.door.oak.painted.magenta.name=Magenta Wooden Door
+item.door.oak.painted.magenta.desc=Every house needs one.
+item.door.oak.painted.orange.name=Orange Wooden Door
+item.door.oak.painted.orange.desc=Every house needs one.
+item.door.oak.painted.white.name=White Wooden Door
+item.door.oak.painted.white.desc=Every house needs one.
+
+item.door.glass.name=Glass Door
+item.door.glass.desc=Great for aesthetics, terrible for privacy.
+
+item.rope.name=Rope
+item.rope.desc=Strong enough to climb.
\ No newline at end of file
diff --git a/src/common/resources/lang/en_US/options.lang b/src/common/resources/lang/en_US/options.lang
index fbb1381a5..9da21c214 100644
--- a/src/common/resources/lang/en_US/options.lang
+++ b/src/common/resources/lang/en_US/options.lang
@@ -28,7 +28,7 @@ options.renderDistance.extreme=Extreme
 options.bobView=View Bobbing
 options.ambientOcclusion=Smooth Lighting
 options.anaglyph3d=3D Anaglyph
-options.limitFramerate=Performance
+options.enableVsync=Enable VSync
 options.customFpsLimit.unlimited=Unlimited
 options.customFpsLimit=FPS Limit
 options.difficulty=Difficulty
@@ -142,11 +142,6 @@ options.customAnimations=Custom Animations
 options.turnWithVehicle=Turn with Vehicle
 options.playServerSounds=Play Server Sounds
 
-performance.max=Max FPS
-performance.balanced=Balanced
-performance.powersaver=Power Saver
-performance.vsync=VSync
-
 options.tooltipStyle.default=Default
 options.tooltipStyle.modern=Modern
 options.tooltipStyle.stone=Stone
diff --git a/src/common/resources/lang/en_US/tile.lang b/src/common/resources/lang/en_US/tile.lang
index 9de273c88..337b478be 100644
--- a/src/common/resources/lang/en_US/tile.lang
+++ b/src/common/resources/lang/en_US/tile.lang
@@ -1,915 +1 @@
-tile.stone.name=Stone
-tile.stone.desc=A block of solid stone.
-tile.basalt.name=Basalt
-tile.basalt.desc=A block of solid basalt.
-tile.limestone.name=Limestone
-tile.limestone.desc=A block of solid limestone.
-tile.granite.name=Granite
-tile.granite.desc=A block of solid granite.
-tile.marble.name=Marble
-tile.marble.desc=A block of solid marble.
-tile.slate.name=Slate
-tile.slate.desc=A block of solid slate.
-tile.permafrost.name=Permafrost
-tile.permafrost.desc=A block of frozen stone.
-
-tile.cobble.stone.name=Cobblestone
-tile.cobble.stone.desc=Stone, smashed apart and reconstituted.
-tile.cobble.stone.mossy.name=Mossy Cobblestone
-tile.cobble.stone.mossy.desc=Cobblestone with added greenery.
-tile.cobble.basalt.name=Cobbled Basalt
-tile.cobble.basalt.desc=Basalt, smashed apart and reconstituted.
-tile.cobble.limestone.name=Cobbled Limestone
-tile.cobble.limestone.desc=Limestone, smashed apart and reconstituted.
-tile.cobble.granite.name=Cobbled Granite
-tile.cobble.granite.desc=Granite, smashed apart and reconstituted.
-tile.cobble.permafrost.name=Cobbled Permafrost
-tile.cobble.permafrost.desc=Permafrost, smashed apart and reconstituted.
-
-tile.pillar.marble.name=Marble Pillar
-tile.pillar.marble.desc=A block of marble engraved into a pillar.
-tile.capstone.marble.name=Marble Capstone
-tile.capstone.marble.desc=A pillar capstone made of solid marble.
-
-tile.sandstone.name=Sandstone
-tile.sandstone.desc=Compacted sand.
-
-tile.stone.carved.name=Carved Stone
-tile.stone.carved.desc=Polished Stone with lines hewn through the middle.
-tile.granite.carved.name=Carved Granite
-tile.granite.carved.desc=Polished Granite with lines hewn through the middle.
-tile.limestone.carved.name=Carved Limestone
-tile.limestone.carved.desc=Polished Limestone with lines hewn through the middle.
-tile.basalt.carved.name=Carved Basalt
-tile.basalt.carved.desc=Polished Basalt with lines hewn through the middle.
-
-tile.planks.oak.name=Wooden Planks
-tile.planks.oak.desc=Processed tree insides.
-tile.planks.oak.painted.name=Mystery Planks
-tile.planks.oak.painted.desc=How did you get this?!
-tile.planks.oak.painted.black.name=Black Wooden Planks
-tile.planks.oak.painted.black.desc=Wooden planks, stained black.
-tile.planks.oak.painted.red.name=Red Wooden Planks
-tile.planks.oak.painted.red.desc=Wooden planks, stained red.
-tile.planks.oak.painted.green.name=Green Wooden Planks
-tile.planks.oak.painted.green.desc=Wooden planks, stained green.
-tile.planks.oak.painted.brown.name=Brown Wooden Planks
-tile.planks.oak.painted.brown.desc=Wooden planks, stained brown.
-tile.planks.oak.painted.blue.name=Blue Wooden Planks
-tile.planks.oak.painted.blue.desc=Wooden planks, stained blue.
-tile.planks.oak.painted.purple.name=Purple Wooden Planks
-tile.planks.oak.painted.purple.desc=Wooden planks, stained purple.
-tile.planks.oak.painted.cyan.name=Cyan Wooden Planks
-tile.planks.oak.painted.cyan.desc=Wooden planks, stained cyan.
-tile.planks.oak.painted.silver.name=Light Gray Wooden Planks
-tile.planks.oak.painted.silver.desc=Wooden planks, stained light gray.
-tile.planks.oak.painted.gray.name=Gray Wooden Planks
-tile.planks.oak.painted.gray.desc=Wooden planks, stained gray.
-tile.planks.oak.painted.pink.name=Pink Wooden Planks
-tile.planks.oak.painted.pink.desc=Wooden planks, stained pink.
-tile.planks.oak.painted.lime.name=Lime Wooden Planks
-tile.planks.oak.painted.lime.desc=Wooden planks, stained lime.
-tile.planks.oak.painted.yellow.name=Yellow Wooden Planks
-tile.planks.oak.painted.yellow.desc=Wooden planks, stained yellow.
-tile.planks.oak.painted.lightblue.name=Light Blue Wooden Planks
-tile.planks.oak.painted.lightblue.desc=Wooden planks, stained light blue.
-tile.planks.oak.painted.magenta.name=Magenta Wooden Planks
-tile.planks.oak.painted.magenta.desc=Wooden planks, stained magenta.
-tile.planks.oak.painted.orange.name=Orange Wooden Planks
-tile.planks.oak.painted.orange.desc=Wooden planks, stained orange.
-tile.planks.oak.painted.white.name=White Wooden Planks
-tile.planks.oak.painted.white.desc=Wooden planks, stained white.
-
-tile.torch.coal.name=Torch
-tile.torch.coal.desc=Helps light the way.
-
-tile.ladder.oak.name=Oak Ladder
-tile.ladder.oak.desc=For very rapid vertical movement.
-
-tile.fence.planks.oak.name=Oak Fence
-tile.fence.planks.oak.desc=Too tall to jump over.
-
-tile.fence.planks.oak.painted.name=Mystery Wooden Fence
-tile.fence.planks.oak.painted.desc=How did you get this?!
-tile.fence.planks.oak.painted.black.name=Black Wooden Fence
-tile.fence.planks.oak.painted.black.desc=A wooden fence, stained black.
-tile.fence.planks.oak.painted.red.name=Red Wooden Fence
-tile.fence.planks.oak.painted.red.desc=A wooden fence, stained red.
-tile.fence.planks.oak.painted.green.name=Green Wooden Fence
-tile.fence.planks.oak.painted.green.desc=A wooden fence, stained green.
-tile.fence.planks.oak.painted.brown.name=Brown Wooden Fence
-tile.fence.planks.oak.painted.brown.desc=A wooden fence, stained brown.
-tile.fence.planks.oak.painted.blue.name=Blue Wooden Fence
-tile.fence.planks.oak.painted.blue.desc=A wooden fence, stained blue.
-tile.fence.planks.oak.painted.purple.name=Purple Wooden Fence
-tile.fence.planks.oak.painted.purple.desc=A wooden fence, stained purple.
-tile.fence.planks.oak.painted.cyan.name=Cyan Wooden Fence
-tile.fence.planks.oak.painted.cyan.desc=A wooden fence, stained cyan.
-tile.fence.planks.oak.painted.silver.name=Light Gray Wooden Fence
-tile.fence.planks.oak.painted.silver.desc=A wooden fence, stained light gray.
-tile.fence.planks.oak.painted.gray.name=Gray Wooden Fence
-tile.fence.planks.oak.painted.gray.desc=A wooden fence, stained gray.
-tile.fence.planks.oak.painted.pink.name=Pink Wooden Fence
-tile.fence.planks.oak.painted.pink.desc=A wooden fence, stained pink.
-tile.fence.planks.oak.painted.lime.name=Lime Wooden Fence
-tile.fence.planks.oak.painted.lime.desc=A wooden fence, stained lime.
-tile.fence.planks.oak.painted.yellow.name=Yellow Wooden Fence
-tile.fence.planks.oak.painted.yellow.desc=A wooden fence, stained yellow.
-tile.fence.planks.oak.painted.lightblue.name=Light Blue Wooden Fence
-tile.fence.planks.oak.painted.lightblue.desc=A wooden fence, stained light blue.
-tile.fence.planks.oak.painted.magenta.name=Magenta Wooden Fence
-tile.fence.planks.oak.painted.magenta.desc=A wooden fence, stained magenta.
-tile.fence.planks.oak.painted.orange.name=Orange Wooden Fence
-tile.fence.planks.oak.painted.orange.desc=A wooden fence, stained orange.
-tile.fence.planks.oak.painted.white.name=White Wooden Fence
-tile.fence.planks.oak.painted.white.desc=A wooden fence, stained white.
-
-tile.fencegate.planks.oak.name=Wooden Fence Gate
-tile.fencegate.planks.oak.desc=Like a door but for fences.
-
-tile.fencegate.planks.oak.painted.name=Mystery Wooden Fence Gate
-tile.fencegate.planks.oak.painted.desc=How did you get this?!
-tile.fencegate.planks.oak.painted.black.name=Black Wooden Fence Gate
-tile.fencegate.planks.oak.painted.black.desc=A wooden fence gate, stained black.
-tile.fencegate.planks.oak.painted.red.name=Red Wooden Fence Gate
-tile.fencegate.planks.oak.painted.red.desc=A wooden fence gate, stained red.
-tile.fencegate.planks.oak.painted.green.name=Green Wooden Fence Gate
-tile.fencegate.planks.oak.painted.green.desc=A wooden fence gate, stained green.
-tile.fencegate.planks.oak.painted.brown.name=Brown Wooden Fence Gate
-tile.fencegate.planks.oak.painted.brown.desc=A wooden fence gate, stained brown.
-tile.fencegate.planks.oak.painted.blue.name=Blue Wooden Fence Gate
-tile.fencegate.planks.oak.painted.blue.desc=A wooden fence gate, stained blue.
-tile.fencegate.planks.oak.painted.purple.name=Purple Wooden Fence Gate
-tile.fencegate.planks.oak.painted.purple.desc=A wooden fence gate, stained purple.
-tile.fencegate.planks.oak.painted.cyan.name=Cyan Wooden Fence Gate
-tile.fencegate.planks.oak.painted.cyan.desc=A wooden fence gate, stained cyan.
-tile.fencegate.planks.oak.painted.silver.name=Light Gray Wooden Fence Gate
-tile.fencegate.planks.oak.painted.silver.desc=A wooden fence gate, stained light gray.
-tile.fencegate.planks.oak.painted.gray.name=Gray Wooden Fence Gate
-tile.fencegate.planks.oak.painted.gray.desc=A wooden fence gate, stained gray.
-tile.fencegate.planks.oak.painted.pink.name=Pink Wooden Fence Gate
-tile.fencegate.planks.oak.painted.pink.desc=A wooden fence gate, stained pink.
-tile.fencegate.planks.oak.painted.lime.name=Lime Wooden Fence Gate
-tile.fencegate.planks.oak.painted.lime.desc=A wooden fence gate, stained lime.
-tile.fencegate.planks.oak.painted.yellow.name=Yellow Wooden Fence Gate
-tile.fencegate.planks.oak.painted.yellow.desc=A wooden fence gate, stained yellow.
-tile.fencegate.planks.oak.painted.lightblue.name=Light Blue Wooden Fence Gate
-tile.fencegate.planks.oak.painted.lightblue.desc=A wooden fence gate, stained light blue.
-tile.fencegate.planks.oak.painted.magenta.name=Magenta Wooden Fence Gate
-tile.fencegate.planks.oak.painted.magenta.desc=A wooden fence gate, stained magenta.
-tile.fencegate.planks.oak.painted.orange.name=Orange Wooden Fence Gate
-tile.fencegate.planks.oak.painted.orange.desc=A wooden fence gate, stained orange.
-tile.fencegate.planks.oak.painted.white.name=White Wooden Fence Gate
-tile.fencegate.planks.oak.painted.white.desc=A wooden fence gate, stained white.
-
-tile.bookshelf.planks.oak.name=Bookshelf
-tile.bookshelf.planks.oak.desc=A repository of knowledge.
-
-tile.wool.name=Wool
-tile.wool.desc=How did you get this?!
-tile.wool.black.name=Black Wool
-tile.wool.black.desc=Sheep's wool, dyed black.
-tile.wool.red.name=Red Wool
-tile.wool.red.desc=Sheep's wool, dyed red.
-tile.wool.green.name=Green Wool
-tile.wool.green.desc=Sheep's wool, dyed green.
-tile.wool.brown.name=Brown Wool
-tile.wool.brown.desc=Sheep's wool, dyed brown.
-tile.wool.blue.name=Blue Wool
-tile.wool.blue.desc=Sheep's wool, dyed blue.
-tile.wool.purple.name=Purple Wool
-tile.wool.purple.desc=Sheep's wool, dyed purple.
-tile.wool.cyan.name=Cyan Wool
-tile.wool.cyan.desc=Sheep's wool, dyed cyan.
-tile.wool.silver.name=Light Gray Wool
-tile.wool.silver.desc=Sheep's wool, dyed light gray.
-tile.wool.gray.name=Gray Wool
-tile.wool.gray.desc=Sheep's wool, dyed gray.
-tile.wool.pink.name=Pink Wool
-tile.wool.pink.desc=Sheep's wool, dyed pink.
-tile.wool.lime.name=Lime Wool
-tile.wool.lime.desc=Sheep's wool, dyed lime.
-tile.wool.yellow.name=Yellow Wool
-tile.wool.yellow.desc=Sheep's wool, dyed yellow.
-tile.wool.lightblue.name=Light Blue Wool
-tile.wool.lightblue.desc=Sheep's wool, dyed light blue.
-tile.wool.magenta.name=Magenta Wool
-tile.wool.magenta.desc=Sheep's wool, dyed magenta.
-tile.wool.orange.name=Orange Wool
-tile.wool.orange.desc=Sheep's wool, dyed orange.
-tile.wool.white.name=White Wool
-tile.wool.white.desc=Sheep's wool, dyed white.
-
-tile.brick.clay.name=Clay Bricks
-tile.brick.clay.desc=Stacked bricks of baked clay.
-tile.brick.stone.polished.name=Polished Stone Bricks
-tile.brick.stone.polished.desc=Stacked bricks of polished stone.
-tile.brick.stone.polished.mossy.name=Mossy Polished Stone Bricks
-tile.brick.stone.polished.mossy.desc=Stacked bricks of polished stone with added greenery.
-tile.brick.sandstone.name=Sandstone Bricks
-tile.brick.sandstone.desc=Stacked bricks of sandstone.
-tile.brick.gold.name=Gold Bricks
-tile.brick.gold.desc=Stacked bricks of gold.
-tile.brick.lapis.name=Lapis Lazuli Bricks
-tile.brick.lapis.desc=Stacked bricks of lapis lazuli.
-tile.brick.basalt.name=Basalt Bricks
-tile.brick.basalt.desc=Stacked bricks of basalt.
-tile.brick.limestone.name=Limestone Bricks
-tile.brick.limestone.desc=Stacked bricks of limestone.
-tile.brick.granite.name=Granite Bricks
-tile.brick.granite.desc=Stacked bricks of granite.
-tile.brick.marble.name=Marble Bricks
-tile.brick.marble.desc=Stacked bricks of marble.
-tile.brick.slate.name=Slate Bricks
-tile.brick.slate.desc=Stacked bricks of slate.
-tile.brick.stone.name=Stone Bricks
-tile.brick.stone.desc=Stacked bricks of stone.
-tile.brick.permafrost.name=Permafrost Bricks
-tile.brick.permafrost.desc=Stacked bricks of permafrost.
-tile.brick.iron.name=Iron Bricks
-tile.brick.iron.desc=Stacked bricks of iron.
-
-tile.slab.planks.oak.name=Wooden Slab
-tile.slab.planks.oak.desc=A slab of wooden planks.
-tile.slab.cobble.stone.name=Cobblestone Slab
-tile.slab.cobble.stone.desc=A slab of cobblestone.
-tile.slab.sandstone.name=Sandstone Slab
-tile.slab.sandstone.desc=A slab of sandstone.
-tile.slab.brick.stone.polished.name=Polished Stone Brick Slab
-tile.slab.brick.stone.polished.desc=A slab of polished stone bricks.
-tile.slab.stone.carved.name=Polished Stone Slab
-tile.slab.stone.carved.desc=A slab of polished stone.
-tile.slab.brick.marble.name=Marble Brick Slab
-tile.slab.brick.marble.desc=A slab of marble bricks.
-tile.slab.brick.clay.name=Clay Brick Slab
-tile.slab.brick.clay.desc=A slab of clay bricks.
-tile.slab.capstone.marble.name=Marble Capstone Slab
-tile.slab.capstone.marble.desc=Marble sculpted into a capstone.
-tile.slab.cobble.basalt.name=Cobbled Basalt Slab
-tile.slab.cobble.basalt.desc=A slab of cobbled basalt.
-tile.slab.cobble.limestone.name=Cobbled Limestone Slab
-tile.slab.cobble.limestone.desc=A slab of cobbled limestone.
-tile.slab.cobble.granite.name=Cobbled Granite Slab
-tile.slab.cobble.granite.desc=A slab of cobbled granite.
-tile.slab.brick.basalt.name=Basalt Brick Slab
-tile.slab.brick.basalt.desc=A slab of basalt bricks.
-tile.slab.brick.limestone.name=Limestone Brick Slab
-tile.slab.brick.limestone.desc=A slab of limestone bricks.
-tile.slab.brick.granite.name=Granite Brick Slab
-tile.slab.brick.granite.desc=A slab of granite bricks.
-tile.slab.brick.slate.name=Slate Brick Slab
-tile.slab.brick.slate.desc=A slab of slate bricks.
-tile.slab.brick.stone.name=Stone Brick Slab
-tile.slab.brick.stone.desc=A slab of stone bricks.
-tile.slab.granite.carved.name=Polished Granite Slab
-tile.slab.granite.carved.desc=A slab of polished granite.
-tile.slab.limestone.carved.name=Polished Limestone Slab
-tile.slab.limestone.carved.desc=A slab of polished limestone.
-tile.slab.basalt.carved.name=Polished Basalt Slab
-tile.slab.basalt.carved.desc=A slab of polished basalt.
-
-tile.slab.planks.oak.painted.name=Mystery Wooden Slab
-tile.slab.planks.oak.painted.desc=How did you get this?!
-tile.slab.planks.oak.painted.black.name=Black Wooden Slab
-tile.slab.planks.oak.painted.black.desc=A slab of wooden planks, stained black.
-tile.slab.planks.oak.painted.red.name=Red Wooden Slab
-tile.slab.planks.oak.painted.red.desc=A slab of wooden planks, stained red.
-tile.slab.planks.oak.painted.green.name=Green Wooden Slab
-tile.slab.planks.oak.painted.green.desc=A slab of wooden planks, stained green.
-tile.slab.planks.oak.painted.brown.name=Brown Wooden Slab
-tile.slab.planks.oak.painted.brown.desc=A slab of wooden planks, stained brown.
-tile.slab.planks.oak.painted.blue.name=Blue Wooden Slab
-tile.slab.planks.oak.painted.blue.desc=A slab of wooden planks, stained blue.
-tile.slab.planks.oak.painted.purple.name=Purple Wooden Slab
-tile.slab.planks.oak.painted.purple.desc=A slab of wooden planks, stained purple.
-tile.slab.planks.oak.painted.cyan.name=Cyan Wooden Slab
-tile.slab.planks.oak.painted.cyan.desc=A slab of wooden planks, stained cyan.
-tile.slab.planks.oak.painted.silver.name=Light Gray Wooden Slab
-tile.slab.planks.oak.painted.silver.desc=A slab of wooden planks, stained light gray.
-tile.slab.planks.oak.painted.gray.name=Gray Wooden Slab
-tile.slab.planks.oak.painted.gray.desc=A slab of wooden planks, stained gray.
-tile.slab.planks.oak.painted.pink.name=Pink Wooden Slab
-tile.slab.planks.oak.painted.pink.desc=A slab of wooden planks, stained pink.
-tile.slab.planks.oak.painted.lime.name=Lime Wooden Slab
-tile.slab.planks.oak.painted.lime.desc=A slab of wooden planks, stained lime.
-tile.slab.planks.oak.painted.yellow.name=Yellow Wooden Slab
-tile.slab.planks.oak.painted.yellow.desc=A slab of wooden planks, stained yellow.
-tile.slab.planks.oak.painted.lightblue.name=Light Blue Wooden Slab
-tile.slab.planks.oak.painted.lightblue.desc=A slab of wooden planks, stained light blue.
-tile.slab.planks.oak.painted.magenta.name=Magenta Wooden Slab
-tile.slab.planks.oak.painted.magenta.desc=A slab of wooden planks, stained magenta.
-tile.slab.planks.oak.painted.orange.name=Orange Wooden Slab
-tile.slab.planks.oak.painted.orange.desc=A slab of wooden planks, stained orange.
-tile.slab.planks.oak.painted.white.name=White Wooden Slab
-tile.slab.planks.oak.painted.white.desc=A slab of wooden planks, stained white.
-
-tile.stairs.planks.oak.name=Wooden Stairs
-tile.stairs.planks.oak.desc=Wooden block used for rapid vertical movement.
-tile.stairs.cobble.stone.name=Cobblestone Stairs
-tile.stairs.cobble.stone.desc=Cobblestone block used for rapid vertical movement.
-tile.stairs.brick.stone.polished.name=Polished Stone Brick Stairs
-tile.stairs.brick.stone.polished.desc=Polished stone brick block used for rapid vertical movement.
-tile.stairs.brick.marble.name=Marble Brick Stairs
-tile.stairs.brick.marble.desc=Marble brick block used for rapid vertical movement.
-tile.stairs.cobble.basalt.name=Cobbled Basalt Stairs
-tile.stairs.cobble.basalt.desc=Cobbled basalt block used for rapid vertical movement.
-tile.stairs.cobble.limestone.name=Cobbled Limestone Stairs
-tile.stairs.cobble.limestone.desc=Cobbled limestone block used for rapid vertical movement.
-tile.stairs.cobble.granite.name=Cobbled Granite Stairs
-tile.stairs.cobble.granite.desc=Cobbled granite block used for rapid vertical movement.
-tile.stairs.brick.basalt.name=Basalt Brick Stairs
-tile.stairs.brick.basalt.desc=Basalt brick block used for rapid vertical movement.
-tile.stairs.brick.limestone.name=Limestone Brick Stairs
-tile.stairs.brick.limestone.desc=Limestone brick block used for rapid vertical movement.
-tile.stairs.brick.granite.name=Granite Brick Stairs
-tile.stairs.brick.granite.desc=Granite brick block used for rapid vertical movement.
-tile.stairs.brick.clay.name=Clay Brick Stairs
-tile.stairs.brick.clay.desc=Clay brick block used for rapid vertical movement.
-tile.stairs.brick.slate.name=Slate Brick Stairs
-tile.stairs.brick.slate.desc=Slate brick block used for rapid vertical movement.
-tile.stairs.brick.stone.name=Stone Brick Stairs
-tile.stairs.brick.stone.desc=Stone brick block used for rapid vertical movement.
-
-tile.stairs.planks.oak.painted.name=Mystery Wooden Stairs
-tile.stairs.planks.oak.painted.desc=How did you get this?!
-tile.stairs.planks.oak.painted.black.name=Black Wooden Stairs
-tile.stairs.planks.oak.painted.black.desc=Wooden steps, stained black.
-tile.stairs.planks.oak.painted.red.name=Red Wooden Stairs
-tile.stairs.planks.oak.painted.red.desc=Wooden steps, stained red.
-tile.stairs.planks.oak.painted.green.name=Green Wooden Stairs
-tile.stairs.planks.oak.painted.green.desc=Wooden steps, stained green.
-tile.stairs.planks.oak.painted.brown.name=Brown Wooden Stairs
-tile.stairs.planks.oak.painted.brown.desc=Wooden steps, stained brown.
-tile.stairs.planks.oak.painted.blue.name=Blue Wooden Stairs
-tile.stairs.planks.oak.painted.blue.desc=Wooden steps, stained blue.
-tile.stairs.planks.oak.painted.purple.name=Purple Wooden Stairs
-tile.stairs.planks.oak.painted.purple.desc=Wooden steps, stained purple.
-tile.stairs.planks.oak.painted.cyan.name=Cyan Wooden Stairs
-tile.stairs.planks.oak.painted.cyan.desc=Wooden steps, stained cyan.
-tile.stairs.planks.oak.painted.silver.name=Light Gray Wooden Stairs
-tile.stairs.planks.oak.painted.silver.desc=Wooden steps, stained light gray.
-tile.stairs.planks.oak.painted.gray.name=Gray Wooden Stairs
-tile.stairs.planks.oak.painted.gray.desc=Wooden steps, stained gray.
-tile.stairs.planks.oak.painted.pink.name=Pink Wooden Stairs
-tile.stairs.planks.oak.painted.pink.desc=Wooden steps, stained pink.
-tile.stairs.planks.oak.painted.lime.name=Lime Wooden Stairs
-tile.stairs.planks.oak.painted.lime.desc=Wooden steps, stained lime.
-tile.stairs.planks.oak.painted.yellow.name=Yellow Wooden Stairs
-tile.stairs.planks.oak.painted.yellow.desc=Wooden steps, stained yellow.
-tile.stairs.planks.oak.painted.lightblue.name=Light Blue Wooden Stairs
-tile.stairs.planks.oak.painted.lightblue.desc=Wooden steps, stained light blue.
-tile.stairs.planks.oak.painted.magenta.name=Magenta Wooden Stairs
-tile.stairs.planks.oak.painted.magenta.desc=Wooden steps, stained magenta.
-tile.stairs.planks.oak.painted.orange.name=Orange Wooden Stairs
-tile.stairs.planks.oak.painted.orange.desc=Wooden steps, stained orange.
-tile.stairs.planks.oak.painted.white.name=White Wooden Stairs
-tile.stairs.planks.oak.painted.white.desc=Wooden steps, stained white.
-
-tile.obsidian.name=Obsidian
-tile.obsidian.desc=Rapidly cooled volcanic rock.
-
-tile.glass.name=Glass
-tile.glass.desc=Sand heated until it becomes translucent.
-tile.glass.tinted.name=Tinted Glass
-tile.glass.tinted.desc=Darkened glass that blocks light.
-
-tile.grass.name=Grass
-tile.grass.desc=Crisp, crunchy grass.
-tile.grass.retro.name=Retro Grass
-tile.grass.retro.desc=Crisp, crunchy grass. Smells old.
-tile.grass.scorched.name=Scorched Grass
-tile.grass.scorched.desc=Grass that has baked in the sun.
-
-tile.path.dirt.name=Dirt Path
-tile.path.dirt.desc=Dirt worn down by frequent travelling.
-
-tile.dirt.name=Dirt
-tile.dirt.desc=Crumbly brown dirt.
-tile.dirt.scorched.name=Scorched Dirt
-tile.dirt.scorched.desc=Dirt that has baked in the sun.
-tile.dirt.scorched.rich.name=Rich Scorched Dirt
-tile.dirt.scorched.rich.desc=Dirt that has baked in the sun, searing in minerals.
-
-tile.mud.name=Mud
-tile.mud.desc=Mud sodden to its core.
-tile.mud.baked.name=Baked Mud
-tile.mud.baked.desc=Mud that's been dried out and cracked.
-
-tile.sponge.dry.name=Sponge
-tile.sponge.dry.desc=A dry sponge, good for soaking up water.
-tile.sponge.wet.name=Wet Sponge
-tile.sponge.wet.desc=A sponge full of water.
-
-tile.moss.stone.name=Mossy Stone
-tile.moss.stone.desc=Moss covering a block of stone.
-tile.moss.basalt.name=Mossy Basalt
-tile.moss.basalt.desc=Moss covering a block of basalt.
-tile.moss.limestone.name=Mossy Limestone
-tile.moss.limestone.desc=Moss covering a block of limestone.
-tile.moss.granite.name=Mossy Granite
-tile.moss.granite.desc=Moss covering a block of granite.
-
-tile.sand.name=Sand
-tile.sand.desc=Gets everywhere.
-tile.gravel.name=Gravel
-tile.gravel.desc=A loose collection of pebbles.
-
-tile.bedrock.name=Bedrock
-tile.bedrock.desc=The toughest substance known to man.
-
-tile.fluid.water.flowing.name=Flowing Water
-tile.fluid.water.flowing.desc=Water that flows when placed.
-tile.fluid.water.still.name=Still Water
-tile.fluid.water.still.desc=Water that does not flow when placed.
-tile.fluid.lava.flowing.name=Flowing Lava
-tile.fluid.lava.flowing.desc=Lava that flows when placed.
-tile.fluid.lava.still.name=Still Lava
-tile.fluid.lava.still.desc=Lava that does not flow when placed.
-
-tile.log.oak.name=Oak Log
-tile.log.oak.desc=A log from an oak tree.
-tile.log.pine.name=Pine Log
-tile.log.pine.desc=A log from a pine tree.
-tile.log.birch.name=Birch Log
-tile.log.birch.desc=A log from a birch tree.
-tile.log.cherry.name=Cherry Log
-tile.log.cherry.desc=A log from a cherry tree.
-tile.log.eucalyptus.name=Eucalyptus Log
-tile.log.eucalyptus.desc=A log from a eucalyptus tree.
-tile.log.oak.mossy.name=Mossy Oak Log
-tile.log.oak.mossy.desc=A log from a mossy oak tree.
-
-tile.leaves.oak.name=Oak Leaves
-tile.leaves.oak.desc=Leaves from an oak tree.
-tile.leaves.pine.name=Pine Leaves
-tile.leaves.pine.desc=Leaves from a pine tree.
-tile.leaves.birch.name=Birch Leaves
-tile.leaves.birch.desc=Leaves from a birch tree.
-tile.leaves.cherry.name=Cherry Leaves
-tile.leaves.cherry.desc=Leaves from a cherry tree.
-tile.leaves.eucalyptus.name=Eucalyptus Leaves
-tile.leaves.eucalyptus.desc=Leaves from a eucalyptus tree.
-tile.leaves.oak.retro.name=Retro Leaves
-tile.leaves.oak.retro.desc=Leaves from long ago.
-tile.leaves.shrub.name=Shrub Leaves
-tile.leaves.shrub.desc=Leaves from a shrub.
-tile.leaves.cherry.flowering.name=Flowering Cherry Leaves
-tile.leaves.cherry.flowering.desc=Leaves from a cherry tree that are budding with fruit.
-tile.leaves.cacao.name=Cacao Leaves
-tile.leaves.cacao.desc=Leaves from a cacao tree.
-
-tile.sapling.oak.name=Oak Sapling
-tile.sapling.oak.desc=Plant to grow an oak tree.
-tile.sapling.pine.name=Pine Sapling
-tile.sapling.pine.desc=Plant to grow a pine tree.
-tile.sapling.birch.name=Birch Sapling
-tile.sapling.birch.desc=Plant to grow a birch tree.
-tile.sapling.cherry.name=Cherry Sapling
-tile.sapling.cherry.desc=Plant to grow a cherry tree.
-tile.sapling.eucalyptus.name=Eucalyptus Sapling
-tile.sapling.eucalyptus.desc=Plant to grow a eucalyptus tree.
-tile.sapling.oak.retro.name=Retro Oak Sapling
-tile.sapling.oak.retro.desc=Plant to grow a tree from long ago.
-tile.sapling.shrub.name=Shrub Sapling
-tile.sapling.shrub.desc=Plant to grow a shrub.
-tile.sapling.cacao.name=Cacao Sapling
-tile.sapling.cacao.desc=Plant to grow a cacao tree.
-
-tile.tallgrass.name=Tall Grass
-tile.tallgrass.desc=Lush, growing grass.
-tile.tallgrass.fern.name=Fern
-tile.tallgrass.fern.desc=A fern plant.
-tile.deadbush.name=Dead Bush
-tile.deadbush.desc=A dried and withered plant.
-tile.spinifex.name=Spinifex
-tile.spinifex.desc=A spindly, thin grass from dry regions.
-tile.algae.name=Algae
-tile.algae.desc=Gooey vegetation that floats on the water's surface.
-
-tile.flower.yellow.name=Dandelion
-tile.flower.yellow.desc=A beautiful yellow flower.
-tile.flower.red.name=Rose
-tile.flower.red.desc=A beautiful red flower.
-
-tile.mushroom.red.name=Red Mushroom
-tile.mushroom.red.desc=A tasty red mushroom. Good for stew.
-tile.mushroom.brown.name=Brown Mushroom
-tile.mushroom.brown.desc=A tasty brown mushroom. Good for stew.
-
-tile.ore.coal.stone.name=Stone Coal Ore
-tile.ore.coal.stone.desc=A chunk of coal embedded in stone.
-tile.ore.coal.basalt.name=Basalt Coal Ore
-tile.ore.coal.basalt.desc=A chunk of coal embedded in basalt.
-tile.ore.coal.limestone.name=Limestone Coal Ore
-tile.ore.coal.limestone.desc=A chunk of coal embedded in limestone.
-tile.ore.coal.granite.name=Granite Coal Ore
-tile.ore.coal.granite.desc=A chunk of coal embedded in granite.
-
-tile.ore.iron.stone.name=Stone Iron Ore
-tile.ore.iron.stone.desc=Iron nuggets embedded in stone.
-tile.ore.iron.basalt.name=Basalt Iron Ore
-tile.ore.iron.basalt.desc=Iron nuggets embedded in basalt.
-tile.ore.iron.limestone.name=Limestone Iron Ore
-tile.ore.iron.limestone.desc=Iron nuggets embedded in limestone.
-tile.ore.iron.granite.name=Granite Iron Ore
-tile.ore.iron.granite.desc=Iron nuggets embedded in granite.
-
-tile.ore.gold.stone.name=Stone Gold Ore
-tile.ore.gold.stone.desc=Gold nuggets embedded in stone.
-tile.ore.gold.basalt.name=Basalt Gold Ore
-tile.ore.gold.basalt.desc=Gold nuggets embedded in basalt.
-tile.ore.gold.limestone.name=Limestone Gold Ore
-tile.ore.gold.limestone.desc=Gold nuggets embedded in limestone.
-tile.ore.gold.granite.name=Granite Gold Ore
-tile.ore.gold.granite.desc=Gold nuggets embedded in granite.
-
-tile.ore.lapis.stone.name=Stone Lapis Lazuli Ore
-tile.ore.lapis.stone.desc=Chunks of lapis lazuli embedded in stone.
-tile.ore.lapis.basalt.name=Basalt Lapis Lazuli Ore
-tile.ore.lapis.basalt.desc=Chunks of lapis lazuli embedded in basalt.
-tile.ore.lapis.limestone.name=Limestone Lapis Lazuli Ore
-tile.ore.lapis.limestone.desc=Chunks of lapis lazuli embedded in limestone.
-tile.ore.lapis.granite.name=Granite Lapis Lazuli Ore
-tile.ore.lapis.granite.desc=Chunks of lapis lazuli embedded in granite.
-
-tile.ore.redstone.stone.name=Stone Redstone Ore
-tile.ore.redstone.stone.desc=Red dust embedded in stone.
-tile.ore.redstone.basalt.name=Basalt Redstone Ore
-tile.ore.redstone.basalt.desc=Red dust embedded in basalt.
-tile.ore.redstone.limestone.name=Limestone Redstone Ore
-tile.ore.redstone.limestone.desc=Red dust embedded in limestone.
-tile.ore.redstone.granite.name=Granite Redstone Ore
-tile.ore.redstone.granite.desc=Red dust embedded in granite.
-tile.ore.redstone.glowing.stone.name=Glowing Stone Redstone Ore
-tile.ore.redstone.glowing.stone.desc=Red dust embedded in stone. Emits a faint light.
-tile.ore.redstone.glowing.basalt.name=Glowing Basalt Redstone Ore
-tile.ore.redstone.glowing.basalt.desc=Red dust embedded in basalt. Emits a faint light.
-tile.ore.redstone.glowing.limestone.name=Glowing Limestone Redstone Ore
-tile.ore.redstone.glowing.limestone.desc=Red dust embedded in limestone. Emits a faint light.
-tile.ore.redstone.glowing.granite.name=Glowing Granite Redstone Ore
-tile.ore.redstone.glowing.granite.desc=Red dust embedded in granite. Emits a faint light.
-
-tile.ore.diamond.stone.name=Stone Diamond Ore
-tile.ore.diamond.stone.desc=A chunk of diamond embedded in stone.
-tile.ore.diamond.basalt.name=Basalt Diamond Ore
-tile.ore.diamond.basalt.desc=A chunk of diamond embedded in basalt.
-tile.ore.diamond.limestone.name=Limestone Diamond Ore
-tile.ore.diamond.limestone.desc=A chunk of diamond embedded in limestone.
-tile.ore.diamond.granite.name=Granite Diamond Ore
-tile.ore.diamond.granite.desc=A chunk of diamond embedded in granite.
-
-tile.ore.nethercoal.netherrack.name=Nether Coal Ore
-tile.ore.nethercoal.netherrack.desc=A lump of Nether Coal embedded in netherrack.
-
-tile.block.coal.name=Block of Coal
-tile.block.coal.desc=A solid block of coal.
-tile.block.iron.name=Block of Iron
-tile.block.iron.desc=A solid block of iron. Heavy!
-tile.block.gold.name=Block of Gold
-tile.block.gold.desc=A solid block of gold, for flaunting your bling.
-tile.block.lapis.name=Block of Lapis Lazuli
-tile.block.lapis.desc=A solid block of lapis lazuli.
-tile.block.redstone.name=Block of Redstone
-tile.block.redstone.desc=A solid block of redstone.
-tile.block.diamond.name=Block of Diamond
-tile.block.diamond.desc=A solid block of diamond. Well done you.
-tile.block.nethercoal.name=Block of Nether Coal
-tile.block.nethercoal.desc=A solid block of Nether Coal.
-tile.block.steel.name=Block of Steel
-tile.block.steel.desc=A solid block of steel.
-tile.block.quartz.name=Block of Quartz
-tile.block.quartz.desc=A solid block of quartz.
-tile.block.olivine.name=Block of Olivine
-tile.block.olivine.desc=A solid block of olivine.
-tile.block.charcoal.name=Block of Charcoal
-tile.block.charcoal.desc=A solid block of charcoal.
-
-tile.wire.redstone.name=Redstone Wire
-tile.wire.redstone.desc=A strand of redstone dust laid on the ground.
-
-tile.torch.redstone.idle.name=Redstone Torch
-tile.torch.redstone.idle.desc=Emits a constant redstone signal.
-tile.torch.redstone.active.name=Redstone Torch
-tile.torch.redstone.active.desc=Emits a constant redstone signal.
-
-tile.button.stone.name=Stone Button
-tile.button.stone.desc=Emits a brief redstone signal when pressed.
-
-tile.lever.cobble.stone.name=Cobblestone Lever
-tile.lever.cobble.stone.desc=Allows turning a redstone signal on or off.
-
-tile.pressureplate.stone.name=Stone Pressure Plate
-tile.pressureplate.stone.desc=Emits a redstone signal when living creatures step on it.
-tile.pressureplate.planks.oak.name=Wooden Pressure Plate
-tile.pressureplate.planks.oak.desc=Emits a redstone signal when anything steps on it.
-tile.pressureplate.cobble.stone.name=Cobblestone Pressure Plate
-tile.pressureplate.cobble.stone.desc=Emits a redstone signal when players step on it.
-
-tile.motionsensor.idle.name=Motion Sensor
-tile.motionsensor.idle.desc=Emits a redstone signal when something moves past it.
-tile.motionsensor.active.name=Active Motion Sensor
-tile.motionsensor.active.desc=Emits a redstone signal when something moves past it.
-
-tile.repeater.idle.name=Redstone Repeater
-tile.repeater.idle.desc=Repeats redstone signals over a distance.
-tile.repeater.active.name=Redstone Repeater
-tile.repeater.active.desc=Repeats redstone signals over a distance.
-
-tile.piston.base.name=Piston
-tile.piston.base.desc=Pushes blocks but does not pull them.
-tile.piston.base.sticky.name=Sticky Piston
-tile.piston.base.sticky.desc=Pushes and pulls blocks.
-tile.piston.head.name=Piston Head
-tile.piston.head.desc=The pushy part of the piston.
-tile.piston.moving.name=Piston Mover
-tile.piston.moving.desc=The invisible moving part of the piston.
-
-tile.noteblock.name=Note Block
-tile.noteblock.desc=Plays a musical note when powered.
-
-tile.rail.name=Rail
-tile.rail.desc=For rapid horizontal movement via minecart.
-tile.rail.powered.name=Powered Rail
-tile.rail.powered.desc=Makes minecarts go faster when powered.
-tile.rail.detector.name=Detector Rail
-tile.rail.detector.desc=Emits a redstone signal when a minecart crosses it.
-
-tile.spikes.name=Spike Trap
-tile.spikes.desc=Deactivates when powered. Technically a war crime.
-
-tile.dispenser.cobble.stone.name=Dispenser
-tile.dispenser.cobble.stone.desc=Fires items out of the hole in the front.
-
-tile.trapdoor.planks.oak.name=Oak Trapdoor
-tile.trapdoor.planks.oak.desc=Like a door, but flat.
-tile.trapdoor.iron.name=Iron Trapdoor
-tile.trapdoor.iron.desc=Like a door, but flat and made of iron.
-tile.trapdoor.glass.name=Glass Trapdoor
-tile.trapdoor.glass.desc=Useless at its job.
-
-tile.tnt.name=TNT
-tile.tnt.desc=Goes off with a bang.
-
-tile.door.planks.oak.bottom.name=Bottom Wooden Door
-tile.door.planks.oak.bottom.desc=/give Honeydew 64 46
-tile.door.planks.oak.top.name=Top Wooden Door
-tile.door.planks.oak.top.desc=Oh, wait, that's not TNT, that's half a door.
-tile.door.iron.bottom.name=Bottom Iron Door
-tile.door.iron.bottom.desc=Not much good on its own.
-tile.door.iron.top.name=Top Iron Door
-tile.door.iron.top.desc=Could use a friend.
-
-tile.mesh.name=Mesh Block
-tile.mesh.desc=Allows items to pass through but nothing else.
-
-tile.bed.name=Bed
-tile.bed.desc=Bed!
-tile.seat.name=Seat
-tile.seat.desc=Sit down and relax.
-
-tile.cobweb.name=Cobweb
-tile.cobweb.desc=Sticky silky strands woven by spiders.
-
-tile.fire.name=Fire
-tile.fire.desc=Ouch, fire hot!
-
-tile.mobspawner.name=Mob Spawner
-tile.mobspawner.desc=A cage filled with horror.
-tile.mobspawner.deactivated.name=Deactivated Mob Spawner
-tile.mobspawner.deactivated.desc=A cage no longer filled with horror.
-
-tile.workbench.name=Workbench
-tile.workbench.desc=For bigger projects.
-
-tile.furnace.stone.idle.name=Furnace
-tile.furnace.stone.idle.desc=For melting, heating, and cooking blocks and items.
-tile.furnace.stone.active.name=Lit Furnace
-tile.furnace.stone.active.desc=For melting, heating, and cooking blocks and items.
-tile.furnace.blast.idle.name=Blast Furnace
-tile.furnace.blast.idle.desc=Burns hotter than a normal furnace.
-tile.furnace.blast.active.name=Lit Blast Furnace
-tile.furnace.blast.active.desc=Burns hotter than a normal furnace.
-
-tile.trommel.idle.name=Trommel
-tile.trommel.idle.desc=A machine that separates dirt from other useful items.
-tile.trommel.active.name=Lit Trommel
-tile.trommel.active.desc=A machine that separates dirt from other useful items.
-
-tile.chest.planks.oak.name=Wooden Chest
-tile.chest.planks.oak.desc=A place to store your items.
-tile.chest.planks.oak.painted.name=Mystery Wooden Chest
-tile.chest.planks.oak.painted.desc=How did you get this?!
-tile.chest.planks.oak.painted.black.name=Black Wooden Chest
-tile.chest.planks.oak.painted.black.desc=A place to store your items.
-tile.chest.planks.oak.painted.red.name=Red Wooden Chest
-tile.chest.planks.oak.painted.red.desc=A place to store your items.
-tile.chest.planks.oak.painted.green.name=Green Wooden Chest
-tile.chest.planks.oak.painted.green.desc=A place to store your items.
-tile.chest.planks.oak.painted.brown.name=Brown Wooden Chest
-tile.chest.planks.oak.painted.brown.desc=A place to store your items.
-tile.chest.planks.oak.painted.blue.name=Blue Wooden Chest
-tile.chest.planks.oak.painted.blue.desc=A place to store your items.
-tile.chest.planks.oak.painted.purple.name=Purple Wooden Chest
-tile.chest.planks.oak.painted.purple.desc=A place to store your items.
-tile.chest.planks.oak.painted.cyan.name=Cyan Wooden Chest
-tile.chest.planks.oak.painted.cyan.desc=A place to store your items.
-tile.chest.planks.oak.painted.silver.name=Light Gray Wooden Chest
-tile.chest.planks.oak.painted.silver.desc=A place to store your items.
-tile.chest.planks.oak.painted.gray.name=Gray Wooden Chest
-tile.chest.planks.oak.painted.gray.desc=A place to store your items.
-tile.chest.planks.oak.painted.pink.name=Pink Wooden Chest
-tile.chest.planks.oak.painted.pink.desc=A place to store your items.
-tile.chest.planks.oak.painted.lime.name=Lime Wooden Chest
-tile.chest.planks.oak.painted.lime.desc=A place to store your items.
-tile.chest.planks.oak.painted.yellow.name=Yellow Wooden Chest
-tile.chest.planks.oak.painted.yellow.desc=A place to store your items.
-tile.chest.planks.oak.painted.lightblue.name=Light Blue Wooden Chest
-tile.chest.planks.oak.painted.lightblue.desc=A place to store your items.
-tile.chest.planks.oak.painted.magenta.name=Magenta Wooden Chest
-tile.chest.planks.oak.painted.magenta.desc=A place to store your items.
-tile.chest.planks.oak.painted.orange.name=Orange Wooden Chest
-tile.chest.planks.oak.painted.orange.desc=A place to store your items.
-tile.chest.planks.oak.painted.white.name=White Wooden Chest
-tile.chest.planks.oak.painted.white.desc=A place to store your items.
-tile.chest.legacy.name=Legacy Chest
-
-tile.crops.wheat.name=Wheat Crops
-tile.crops.wheat.desc=Wheat, plucked from the ground.
-tile.crops.pumpkin.name=Pumpkin Crops
-tile.crops.pumpkin.desc=A ripening pumpkin, plucked from the ground.
-
-tile.farmland.dirt.name=Farmland
-tile.farmland.dirt.desc=Tilled soil for growing crops.
-
-tile.sign.post.planks.oak.name=Oak Signpost
-tile.sign.post.planks.oak.desc=A free-standing oak sign.
-tile.sign.wall.planks.oak.name=Oak Wall Sign
-tile.sign.wall.planks.oak.desc=An oak sign placed on a wall.
-
-tile.layer.snow.name=Snow Layer
-tile.layer.snow.desc=A flat layer of snow.
-tile.layer.leaves.oak.name=Leaf Pile
-tile.layer.leaves.oak.desc=A pile of leaves.
-tile.layer.slate.name=Slate Layer
-tile.layer.slate.desc=A flat sheet of slate.
-
-tile.ice.name=Ice
-tile.ice.desc=Slippery frozen water.
-tile.ice.perma.name=Perma-Ice
-tile.ice.perma.desc=Ice imbued with the essence of stone.
-
-tile.block.snow.name=Block of Snow
-tile.block.snow.desc=Lots of snow compacted into a block.
-
-tile.cactus.name=Cactus
-tile.cactus.desc=A spiky plant that grows in the desert.
-
-tile.block.clay.name=Block of Clay
-tile.block.clay.desc=A block of compacted clay.
-
-tile.sugarcane.name=Sugarcane
-tile.sugarcane.desc=Not as sweet as you.
-
-tile.block.sugarcane.name=Block of Sugarcane
-tile.block.sugarcane.desc=One very big sugar cube.
-tile.block.sugarcane.baked.name=Baked Block of Sugarcane
-tile.block.sugarcane.baked.desc=Smells absolutely delicious.
-
-tile.jukebox.name=Jukebox
-tile.jukebox.desc=Plays your favourite tunes, assuming you have the right record.
-
-tile.pumpkin.name=Pumpkin
-tile.pumpkin.desc=An orange squash that grows in the wild.
-tile.pumpkin.carved.idle.name=Carved Pumpkin
-tile.pumpkin.carved.idle.desc=An orange squash with a spooky face.
-tile.pumpkin.carved.active.name=Jack 'o' Lantern
-tile.pumpkin.carved.active.desc=An orange squash with a spooky face, lit by a torch.
-
-tile.netherrack.name=Netherrack
-tile.netherrack.desc=Dark red rock that burns forever.
-tile.netherrack.igneous.name=Igneous Netherrack
-tile.netherrack.igneous.desc=Extreme heat has made this rock glow from inside.
-
-tile.soulsand.name=Soul Sand
-tile.soulsand.desc=Squishy brown sand that's tough to walk through.
-
-tile.glowstone.name=Block of Glowstone
-tile.glowstone.desc=Constantly emits a strong yellowish light.
-
-tile.portal.nether.name=Nether Portal
-tile.portal.nether.desc=A portal to the Nether.
-tile.portal.paradise.name=Paradise Portal
-tile.portal.paradise.desc=A portal to Paradise.
-
-tile.cake.name=Cake
-tile.cake.desc=I just can't cake it any more.
-
-tile.lamp.idle.name=Lamp
-tile.lamp.idle.desc=How did you get this?!
-tile.lamp.idle.black.name=Black Lamp
-tile.lamp.idle.black.desc=A redstone lamp that can emit light. Tinted black.
-tile.lamp.idle.red.name=Red Lamp
-tile.lamp.idle.red.desc=A redstone lamp that can emit light. Tinted red.
-tile.lamp.idle.green.name=Green Lamp
-tile.lamp.idle.green.desc=A redstone lamp that can emit light. Tinted green.
-tile.lamp.idle.brown.name=Brown Lamp
-tile.lamp.idle.brown.desc=A redstone lamp that can emit light. Tinted brown.
-tile.lamp.idle.blue.name=Blue Lamp
-tile.lamp.idle.blue.desc=A redstone lamp that can emit light. Tinted blue.
-tile.lamp.idle.purple.name=Purple Lamp
-tile.lamp.idle.purple.desc=A redstone lamp that can emit light. Tinted purple.
-tile.lamp.idle.cyan.name=Cyan Lamp
-tile.lamp.idle.cyan.desc=A redstone lamp that can emit light. Tinted cyan.
-tile.lamp.idle.silver.name=Light Gray Lamp
-tile.lamp.idle.silver.desc=A redstone lamp that can emit light. Tinted light gray.
-tile.lamp.idle.gray.name=Gray Lamp
-tile.lamp.idle.gray.desc=A redstone lamp that can emit light. Tinted gray.
-tile.lamp.idle.pink.name=Pink Lamp
-tile.lamp.idle.pink.desc=A redstone lamp that can emit light. Tinted pink.
-tile.lamp.idle.lime.name=Lime Lamp
-tile.lamp.idle.lime.desc=A redstone lamp that can emit light. Tinted lime.
-tile.lamp.idle.yellow.name=Yellow Lamp
-tile.lamp.idle.yellow.desc=A redstone lamp that can emit light. Tinted yellow.
-tile.lamp.idle.lightblue.name=Light Blue Lamp
-tile.lamp.idle.lightblue.desc=A redstone lamp that can emit light. Tinted light blue.
-tile.lamp.idle.magenta.name=Magenta Lamp
-tile.lamp.idle.magenta.desc=A redstone lamp that can emit light. Tinted magenta.
-tile.lamp.idle.orange.name=Orange Lamp
-tile.lamp.idle.orange.desc=A redstone lamp that can emit light. Tinted orange.
-tile.lamp.idle.white.name=White Lamp
-tile.lamp.idle.white.desc=A redstone lamp that can emit light.
-
-tile.lamp.active.name=Lit Lamp
-tile.lamp.active.desc=How did you get this?!
-tile.lamp.active.black.name=Lit Black Lamp
-tile.lamp.active.black.desc=A redstone lamp that emits light. Tinted black.
-tile.lamp.active.red.name=Lit Red Lamp
-tile.lamp.active.red.desc=A redstone lamp that emits light. Tinted red.
-tile.lamp.active.green.name=Lit Green Lamp
-tile.lamp.active.green.desc=A redstone lamp that emits light. Tinted green.
-tile.lamp.active.brown.name=Lit Brown Lamp
-tile.lamp.active.brown.desc=A redstone lamp that emits light. Tinted brown.
-tile.lamp.active.blue.name=Lit Blue Lamp
-tile.lamp.active.blue.desc=A redstone lamp that emits light. Tinted blue.
-tile.lamp.active.purple.name=Lit Purple Lamp
-tile.lamp.active.purple.desc=A redstone lamp that emits light. Tinted purple.
-tile.lamp.active.cyan.name=Lit Cyan Lamp
-tile.lamp.active.cyan.desc=A redstone lamp that emits light. Tinted cyan.
-tile.lamp.active.silver.name=Lit Light Gray Lamp
-tile.lamp.active.silver.desc=A redstone lamp that emits light. Tinted light gray.
-tile.lamp.active.gray.name=Lit Gray Lamp
-tile.lamp.active.gray.desc=A redstone lamp that emits light. Tinted gray.
-tile.lamp.active.pink.name=Lit Pink Lamp
-tile.lamp.active.pink.desc=A redstone lamp that emits light. Tinted pink.
-tile.lamp.active.lime.name=Lit Lime Lamp
-tile.lamp.active.lime.desc=A redstone lamp that emits light. Tinted lime.
-tile.lamp.active.yellow.name=Yellow Lamp
-tile.lamp.active.yellow.desc=A redstone lamp that emits light. Tinted yellow.
-tile.lamp.active.lightblue.name=Light Blue Lamp
-tile.lamp.active.lightblue.desc=A redstone lamp that emits light. Tinted light blue.
-tile.lamp.active.magenta.name=Magenta Lamp
-tile.lamp.active.magenta.desc=A redstone lamp that emits light. Tinted magenta.
-tile.lamp.active.orange.name=Orange Lamp
-tile.lamp.active.orange.desc=A redstone lamp that emits light. Tinted orange.
-tile.lamp.active.white.name=White Lamp
-tile.lamp.active.white.desc=A redstone lamp that emits light.
-
-tile.stone.polished.name=Polished Stone
-tile.stone.polished.desc=A polished block of stone.
-tile.granite.polished.name=Polished Granite
-tile.granite.polished.desc=A polished block of granite.
-tile.limestone.polished.name=Polished Limestone
-tile.limestone.polished.desc=A polished block of limestone.
-tile.basalt.polished.name=Polished Basalt
-tile.basalt.polished.desc=A polished block of basalt.
-tile.slate.polished.name=Polished Slate
-tile.slate.polished.desc=A polished block of slate.
-
-tile.candle.wax.soul.name=Soul Wax Candle
-tile.candle.wax.soul.desc=A waxy brown candle that glows with an unnatural light.
-
-tile.basket.name=Basket
-tile.basket.desc=A wicker container for holding items.
-
-tile.overlay.pebbles.name=Pebbles
-tile.overlay.pebbles.desc=A cluster of pebbles.
-
-tile.fence.chainlink.name=Chainlink Fence
-tile.fence.chainlink.desc=A fence made of interconnected chain links. Can be climbed!
-tile.fence.paper_wall.name=Paper Wall Fence
-tile.fence.paper_wall.desc=A fence made of delicate paper. Be careful!
-
-tile.lantern.firefly.green.name=Green Firefly Lantern
-tile.lantern.firefly.green.desc=A glass jar containing a swarm of green fireflies.
-tile.lantern.firefly.orange.name=Orange Firefly Lantern
-tile.lantern.firefly.orange.desc=A glass jar containing a swarm of orange fireflies.
-tile.lantern.firefly.blue.name=Blue Firefly Lantern
-tile.lantern.firefly.blue.desc=A glass jar containing a swarm of blue fireflies.
-tile.lantern.firefly.red.name=Red Firefly Lantern
-tile.lantern.firefly.red.desc=A glass jar containing a swarm of red fireflies.
-
-tile.flag.name=Flag
-tile.flag.desc=A flag to mark your territory.
-
-tile.paper_wall.name=Paper Wall
-tile.paper_wall.desc=A wall made of delicate paper. Be careful!
\ No newline at end of file
+tile.stone.name=Stone
tile.stone.desc=A block of solid stone.
tile.basalt.name=Basalt
tile.basalt.desc=A block of solid basalt.
tile.limestone.name=Limestone
tile.limestone.desc=A block of solid limestone.
tile.granite.name=Granite
tile.granite.desc=A block of solid granite.
tile.marble.name=Marble
tile.marble.desc=A block of solid marble.
tile.slate.name=Slate
tile.slate.desc=A block of solid slate.
tile.permafrost.name=Permafrost
tile.permafrost.desc=A block of frozen stone.

tile.cobble.stone.name=Cobblestone
tile.cobble.stone.desc=Stone, smashed apart and reconstituted.
tile.cobble.stone.mossy.name=Mossy Cobblestone
tile.cobble.stone.mossy.desc=Cobblestone with added greenery.
tile.cobble.basalt.name=Cobbled Basalt
tile.cobble.basalt.desc=Basalt, smashed apart and reconstituted.
tile.cobble.limestone.name=Cobbled Limestone
tile.cobble.limestone.desc=Limestone, smashed apart and reconstituted.
tile.cobble.granite.name=Cobbled Granite
tile.cobble.granite.desc=Granite, smashed apart and reconstituted.
tile.cobble.permafrost.name=Cobbled Permafrost
tile.cobble.permafrost.desc=Permafrost, smashed apart and reconstituted.

tile.pillar.marble.name=Marble Pillar
tile.pillar.marble.desc=A block of marble engraved into a pillar.
tile.capstone.marble.name=Marble Capstone
tile.capstone.marble.desc=A pillar capstone made of solid marble.

tile.sandstone.name=Sandstone
tile.sandstone.desc=Compacted sand.

tile.stone.carved.name=Carved Stone
tile.stone.carved.desc=Polished Stone with lines hewn through the middle.
tile.granite.carved.name=Carved Granite
tile.granite.carved.desc=Polished Granite with lines hewn through the middle.
tile.limestone.carved.name=Carved Limestone
tile.limestone.carved.desc=Polished Limestone with lines hewn through the middle.
tile.basalt.carved.name=Carved Basalt
tile.basalt.carved.desc=Polished Basalt with lines hewn through the middle.

tile.planks.oak.name=Wooden Planks
tile.planks.oak.desc=Processed tree insides.
tile.planks.oak.painted.name=Mystery Planks
tile.planks.oak.painted.desc=How did you get this?!
tile.planks.oak.painted.black.name=Black Wooden Planks
tile.planks.oak.painted.black.desc=Wooden planks, stained black.
tile.planks.oak.painted.red.name=Red Wooden Planks
tile.planks.oak.painted.red.desc=Wooden planks, stained red.
tile.planks.oak.painted.green.name=Green Wooden Planks
tile.planks.oak.painted.green.desc=Wooden planks, stained green.
tile.planks.oak.painted.brown.name=Brown Wooden Planks
tile.planks.oak.painted.brown.desc=Wooden planks, stained brown.
tile.planks.oak.painted.blue.name=Blue Wooden Planks
tile.planks.oak.painted.blue.desc=Wooden planks, stained blue.
tile.planks.oak.painted.purple.name=Purple Wooden Planks
tile.planks.oak.painted.purple.desc=Wooden planks, stained purple.
tile.planks.oak.painted.cyan.name=Cyan Wooden Planks
tile.planks.oak.painted.cyan.desc=Wooden planks, stained cyan.
tile.planks.oak.painted.silver.name=Light Gray Wooden Planks
tile.planks.oak.painted.silver.desc=Wooden planks, stained light gray.
tile.planks.oak.painted.gray.name=Gray Wooden Planks
tile.planks.oak.painted.gray.desc=Wooden planks, stained gray.
tile.planks.oak.painted.pink.name=Pink Wooden Planks
tile.planks.oak.painted.pink.desc=Wooden planks, stained pink.
tile.planks.oak.painted.lime.name=Lime Wooden Planks
tile.planks.oak.painted.lime.desc=Wooden planks, stained lime.
tile.planks.oak.painted.yellow.name=Yellow Wooden Planks
tile.planks.oak.painted.yellow.desc=Wooden planks, stained yellow.
tile.planks.oak.painted.lightblue.name=Light Blue Wooden Planks
tile.planks.oak.painted.lightblue.desc=Wooden planks, stained light blue.
tile.planks.oak.painted.magenta.name=Magenta Wooden Planks
tile.planks.oak.painted.magenta.desc=Wooden planks, stained magenta.
tile.planks.oak.painted.orange.name=Orange Wooden Planks
tile.planks.oak.painted.orange.desc=Wooden planks, stained orange.
tile.planks.oak.painted.white.name=White Wooden Planks
tile.planks.oak.painted.white.desc=Wooden planks, stained white.

tile.torch.coal.name=Torch
tile.torch.coal.desc=Helps light the way.

tile.ladder.oak.name=Oak Ladder
tile.ladder.oak.desc=For very rapid vertical movement.

tile.fence.planks.oak.name=Oak Fence
tile.fence.planks.oak.desc=Too tall to jump over.

tile.fence.planks.oak.painted.name=Mystery Wooden Fence
tile.fence.planks.oak.painted.desc=How did you get this?!
tile.fence.planks.oak.painted.black.name=Black Wooden Fence
tile.fence.planks.oak.painted.black.desc=A wooden fence, stained black.
tile.fence.planks.oak.painted.red.name=Red Wooden Fence
tile.fence.planks.oak.painted.red.desc=A wooden fence, stained red.
tile.fence.planks.oak.painted.green.name=Green Wooden Fence
tile.fence.planks.oak.painted.green.desc=A wooden fence, stained green.
tile.fence.planks.oak.painted.brown.name=Brown Wooden Fence
tile.fence.planks.oak.painted.brown.desc=A wooden fence, stained brown.
tile.fence.planks.oak.painted.blue.name=Blue Wooden Fence
tile.fence.planks.oak.painted.blue.desc=A wooden fence, stained blue.
tile.fence.planks.oak.painted.purple.name=Purple Wooden Fence
tile.fence.planks.oak.painted.purple.desc=A wooden fence, stained purple.
tile.fence.planks.oak.painted.cyan.name=Cyan Wooden Fence
tile.fence.planks.oak.painted.cyan.desc=A wooden fence, stained cyan.
tile.fence.planks.oak.painted.silver.name=Light Gray Wooden Fence
tile.fence.planks.oak.painted.silver.desc=A wooden fence, stained light gray.
tile.fence.planks.oak.painted.gray.name=Gray Wooden Fence
tile.fence.planks.oak.painted.gray.desc=A wooden fence, stained gray.
tile.fence.planks.oak.painted.pink.name=Pink Wooden Fence
tile.fence.planks.oak.painted.pink.desc=A wooden fence, stained pink.
tile.fence.planks.oak.painted.lime.name=Lime Wooden Fence
tile.fence.planks.oak.painted.lime.desc=A wooden fence, stained lime.
tile.fence.planks.oak.painted.yellow.name=Yellow Wooden Fence
tile.fence.planks.oak.painted.yellow.desc=A wooden fence, stained yellow.
tile.fence.planks.oak.painted.lightblue.name=Light Blue Wooden Fence
tile.fence.planks.oak.painted.lightblue.desc=A wooden fence, stained light blue.
tile.fence.planks.oak.painted.magenta.name=Magenta Wooden Fence
tile.fence.planks.oak.painted.magenta.desc=A wooden fence, stained magenta.
tile.fence.planks.oak.painted.orange.name=Orange Wooden Fence
tile.fence.planks.oak.painted.orange.desc=A wooden fence, stained orange.
tile.fence.planks.oak.painted.white.name=White Wooden Fence
tile.fence.planks.oak.painted.white.desc=A wooden fence, stained white.

tile.fencegate.planks.oak.name=Wooden Fence Gate
tile.fencegate.planks.oak.desc=Like a door but for fences.

tile.fencegate.planks.oak.painted.name=Mystery Wooden Fence Gate
tile.fencegate.planks.oak.painted.desc=How did you get this?!
tile.fencegate.planks.oak.painted.black.name=Black Wooden Fence Gate
tile.fencegate.planks.oak.painted.black.desc=A wooden fence gate, stained black.
tile.fencegate.planks.oak.painted.red.name=Red Wooden Fence Gate
tile.fencegate.planks.oak.painted.red.desc=A wooden fence gate, stained red.
tile.fencegate.planks.oak.painted.green.name=Green Wooden Fence Gate
tile.fencegate.planks.oak.painted.green.desc=A wooden fence gate, stained green.
tile.fencegate.planks.oak.painted.brown.name=Brown Wooden Fence Gate
tile.fencegate.planks.oak.painted.brown.desc=A wooden fence gate, stained brown.
tile.fencegate.planks.oak.painted.blue.name=Blue Wooden Fence Gate
tile.fencegate.planks.oak.painted.blue.desc=A wooden fence gate, stained blue.
tile.fencegate.planks.oak.painted.purple.name=Purple Wooden Fence Gate
tile.fencegate.planks.oak.painted.purple.desc=A wooden fence gate, stained purple.
tile.fencegate.planks.oak.painted.cyan.name=Cyan Wooden Fence Gate
tile.fencegate.planks.oak.painted.cyan.desc=A wooden fence gate, stained cyan.
tile.fencegate.planks.oak.painted.silver.name=Light Gray Wooden Fence Gate
tile.fencegate.planks.oak.painted.silver.desc=A wooden fence gate, stained light gray.
tile.fencegate.planks.oak.painted.gray.name=Gray Wooden Fence Gate
tile.fencegate.planks.oak.painted.gray.desc=A wooden fence gate, stained gray.
tile.fencegate.planks.oak.painted.pink.name=Pink Wooden Fence Gate
tile.fencegate.planks.oak.painted.pink.desc=A wooden fence gate, stained pink.
tile.fencegate.planks.oak.painted.lime.name=Lime Wooden Fence Gate
tile.fencegate.planks.oak.painted.lime.desc=A wooden fence gate, stained lime.
tile.fencegate.planks.oak.painted.yellow.name=Yellow Wooden Fence Gate
tile.fencegate.planks.oak.painted.yellow.desc=A wooden fence gate, stained yellow.
tile.fencegate.planks.oak.painted.lightblue.name=Light Blue Wooden Fence Gate
tile.fencegate.planks.oak.painted.lightblue.desc=A wooden fence gate, stained light blue.
tile.fencegate.planks.oak.painted.magenta.name=Magenta Wooden Fence Gate
tile.fencegate.planks.oak.painted.magenta.desc=A wooden fence gate, stained magenta.
tile.fencegate.planks.oak.painted.orange.name=Orange Wooden Fence Gate
tile.fencegate.planks.oak.painted.orange.desc=A wooden fence gate, stained orange.
tile.fencegate.planks.oak.painted.white.name=White Wooden Fence Gate
tile.fencegate.planks.oak.painted.white.desc=A wooden fence gate, stained white.

tile.bookshelf.planks.oak.name=Bookshelf
tile.bookshelf.planks.oak.desc=A repository of knowledge.

tile.wool.name=Wool
tile.wool.desc=How did you get this?!
tile.wool.black.name=Black Wool
tile.wool.black.desc=Sheep's wool, dyed black.
tile.wool.red.name=Red Wool
tile.wool.red.desc=Sheep's wool, dyed red.
tile.wool.green.name=Green Wool
tile.wool.green.desc=Sheep's wool, dyed green.
tile.wool.brown.name=Brown Wool
tile.wool.brown.desc=Sheep's wool, dyed brown.
tile.wool.blue.name=Blue Wool
tile.wool.blue.desc=Sheep's wool, dyed blue.
tile.wool.purple.name=Purple Wool
tile.wool.purple.desc=Sheep's wool, dyed purple.
tile.wool.cyan.name=Cyan Wool
tile.wool.cyan.desc=Sheep's wool, dyed cyan.
tile.wool.silver.name=Light Gray Wool
tile.wool.silver.desc=Sheep's wool, dyed light gray.
tile.wool.gray.name=Gray Wool
tile.wool.gray.desc=Sheep's wool, dyed gray.
tile.wool.pink.name=Pink Wool
tile.wool.pink.desc=Sheep's wool, dyed pink.
tile.wool.lime.name=Lime Wool
tile.wool.lime.desc=Sheep's wool, dyed lime.
tile.wool.yellow.name=Yellow Wool
tile.wool.yellow.desc=Sheep's wool, dyed yellow.
tile.wool.lightblue.name=Light Blue Wool
tile.wool.lightblue.desc=Sheep's wool, dyed light blue.
tile.wool.magenta.name=Magenta Wool
tile.wool.magenta.desc=Sheep's wool, dyed magenta.
tile.wool.orange.name=Orange Wool
tile.wool.orange.desc=Sheep's wool, dyed orange.
tile.wool.white.name=White Wool
tile.wool.white.desc=Sheep's wool, dyed white.

tile.brick.clay.name=Clay Bricks
tile.brick.clay.desc=Stacked bricks of baked clay.
tile.brick.stone.polished.name=Polished Stone Bricks
tile.brick.stone.polished.desc=Stacked bricks of polished stone.
tile.brick.stone.polished.mossy.name=Mossy Polished Stone Bricks
tile.brick.stone.polished.mossy.desc=Stacked bricks of polished stone with added greenery.
tile.brick.sandstone.name=Sandstone Bricks
tile.brick.sandstone.desc=Stacked bricks of sandstone.
tile.brick.gold.name=Gold Bricks
tile.brick.gold.desc=Stacked bricks of gold.
tile.brick.lapis.name=Lapis Lazuli Bricks
tile.brick.lapis.desc=Stacked bricks of lapis lazuli.
tile.brick.basalt.name=Basalt Bricks
tile.brick.basalt.desc=Stacked bricks of basalt.
tile.brick.limestone.name=Limestone Bricks
tile.brick.limestone.desc=Stacked bricks of limestone.
tile.brick.granite.name=Granite Bricks
tile.brick.granite.desc=Stacked bricks of granite.
tile.brick.marble.name=Marble Bricks
tile.brick.marble.desc=Stacked bricks of marble.
tile.brick.slate.name=Slate Bricks
tile.brick.slate.desc=Stacked bricks of slate.
tile.brick.stone.name=Stone Bricks
tile.brick.stone.desc=Stacked bricks of stone.
tile.brick.permafrost.name=Permafrost Bricks
tile.brick.permafrost.desc=Stacked bricks of permafrost.
tile.brick.iron.name=Iron Bricks
tile.brick.iron.desc=Stacked bricks of iron.

tile.slab.planks.oak.name=Wooden Slab
tile.slab.planks.oak.desc=A slab of wooden planks.
tile.slab.cobble.stone.name=Cobblestone Slab
tile.slab.cobble.stone.desc=A slab of cobblestone.
tile.slab.sandstone.name=Sandstone Slab
tile.slab.sandstone.desc=A slab of sandstone.
tile.slab.brick.stone.polished.name=Polished Stone Brick Slab
tile.slab.brick.stone.polished.desc=A slab of polished stone bricks.
tile.slab.stone.carved.name=Polished Stone Slab
tile.slab.stone.carved.desc=A slab of polished stone.
tile.slab.brick.marble.name=Marble Brick Slab
tile.slab.brick.marble.desc=A slab of marble bricks.
tile.slab.brick.clay.name=Clay Brick Slab
tile.slab.brick.clay.desc=A slab of clay bricks.
tile.slab.capstone.marble.name=Marble Capstone Slab
tile.slab.capstone.marble.desc=Marble sculpted into a capstone.
tile.slab.cobble.basalt.name=Cobbled Basalt Slab
tile.slab.cobble.basalt.desc=A slab of cobbled basalt.
tile.slab.cobble.limestone.name=Cobbled Limestone Slab
tile.slab.cobble.limestone.desc=A slab of cobbled limestone.
tile.slab.cobble.granite.name=Cobbled Granite Slab
tile.slab.cobble.granite.desc=A slab of cobbled granite.
tile.slab.brick.basalt.name=Basalt Brick Slab
tile.slab.brick.basalt.desc=A slab of basalt bricks.
tile.slab.brick.limestone.name=Limestone Brick Slab
tile.slab.brick.limestone.desc=A slab of limestone bricks.
tile.slab.brick.granite.name=Granite Brick Slab
tile.slab.brick.granite.desc=A slab of granite bricks.
tile.slab.brick.slate.name=Slate Brick Slab
tile.slab.brick.slate.desc=A slab of slate bricks.
tile.slab.brick.stone.name=Stone Brick Slab
tile.slab.brick.stone.desc=A slab of stone bricks.
tile.slab.granite.carved.name=Polished Granite Slab
tile.slab.granite.carved.desc=A slab of polished granite.
tile.slab.limestone.carved.name=Polished Limestone Slab
tile.slab.limestone.carved.desc=A slab of polished limestone.
tile.slab.basalt.carved.name=Polished Basalt Slab
tile.slab.basalt.carved.desc=A slab of polished basalt.

tile.slab.planks.oak.painted.name=Mystery Wooden Slab
tile.slab.planks.oak.painted.desc=How did you get this?!
tile.slab.planks.oak.painted.black.name=Black Wooden Slab
tile.slab.planks.oak.painted.black.desc=A slab of wooden planks, stained black.
tile.slab.planks.oak.painted.red.name=Red Wooden Slab
tile.slab.planks.oak.painted.red.desc=A slab of wooden planks, stained red.
tile.slab.planks.oak.painted.green.name=Green Wooden Slab
tile.slab.planks.oak.painted.green.desc=A slab of wooden planks, stained green.
tile.slab.planks.oak.painted.brown.name=Brown Wooden Slab
tile.slab.planks.oak.painted.brown.desc=A slab of wooden planks, stained brown.
tile.slab.planks.oak.painted.blue.name=Blue Wooden Slab
tile.slab.planks.oak.painted.blue.desc=A slab of wooden planks, stained blue.
tile.slab.planks.oak.painted.purple.name=Purple Wooden Slab
tile.slab.planks.oak.painted.purple.desc=A slab of wooden planks, stained purple.
tile.slab.planks.oak.painted.cyan.name=Cyan Wooden Slab
tile.slab.planks.oak.painted.cyan.desc=A slab of wooden planks, stained cyan.
tile.slab.planks.oak.painted.silver.name=Light Gray Wooden Slab
tile.slab.planks.oak.painted.silver.desc=A slab of wooden planks, stained light gray.
tile.slab.planks.oak.painted.gray.name=Gray Wooden Slab
tile.slab.planks.oak.painted.gray.desc=A slab of wooden planks, stained gray.
tile.slab.planks.oak.painted.pink.name=Pink Wooden Slab
tile.slab.planks.oak.painted.pink.desc=A slab of wooden planks, stained pink.
tile.slab.planks.oak.painted.lime.name=Lime Wooden Slab
tile.slab.planks.oak.painted.lime.desc=A slab of wooden planks, stained lime.
tile.slab.planks.oak.painted.yellow.name=Yellow Wooden Slab
tile.slab.planks.oak.painted.yellow.desc=A slab of wooden planks, stained yellow.
tile.slab.planks.oak.painted.lightblue.name=Light Blue Wooden Slab
tile.slab.planks.oak.painted.lightblue.desc=A slab of wooden planks, stained light blue.
tile.slab.planks.oak.painted.magenta.name=Magenta Wooden Slab
tile.slab.planks.oak.painted.magenta.desc=A slab of wooden planks, stained magenta.
tile.slab.planks.oak.painted.orange.name=Orange Wooden Slab
tile.slab.planks.oak.painted.orange.desc=A slab of wooden planks, stained orange.
tile.slab.planks.oak.painted.white.name=White Wooden Slab
tile.slab.planks.oak.painted.white.desc=A slab of wooden planks, stained white.

tile.stairs.planks.oak.name=Wooden Stairs
tile.stairs.planks.oak.desc=Wooden block used for rapid vertical movement.
tile.stairs.cobble.stone.name=Cobblestone Stairs
tile.stairs.cobble.stone.desc=Cobblestone block used for rapid vertical movement.
tile.stairs.brick.stone.polished.name=Polished Stone Brick Stairs
tile.stairs.brick.stone.polished.desc=Polished stone brick block used for rapid vertical movement.
tile.stairs.brick.marble.name=Marble Brick Stairs
tile.stairs.brick.marble.desc=Marble brick block used for rapid vertical movement.
tile.stairs.cobble.basalt.name=Cobbled Basalt Stairs
tile.stairs.cobble.basalt.desc=Cobbled basalt block used for rapid vertical movement.
tile.stairs.cobble.limestone.name=Cobbled Limestone Stairs
tile.stairs.cobble.limestone.desc=Cobbled limestone block used for rapid vertical movement.
tile.stairs.cobble.granite.name=Cobbled Granite Stairs
tile.stairs.cobble.granite.desc=Cobbled granite block used for rapid vertical movement.
tile.stairs.brick.basalt.name=Basalt Brick Stairs
tile.stairs.brick.basalt.desc=Basalt brick block used for rapid vertical movement.
tile.stairs.brick.limestone.name=Limestone Brick Stairs
tile.stairs.brick.limestone.desc=Limestone brick block used for rapid vertical movement.
tile.stairs.brick.granite.name=Granite Brick Stairs
tile.stairs.brick.granite.desc=Granite brick block used for rapid vertical movement.
tile.stairs.brick.clay.name=Clay Brick Stairs
tile.stairs.brick.clay.desc=Clay brick block used for rapid vertical movement.
tile.stairs.brick.slate.name=Slate Brick Stairs
tile.stairs.brick.slate.desc=Slate brick block used for rapid vertical movement.
tile.stairs.brick.stone.name=Stone Brick Stairs
tile.stairs.brick.stone.desc=Stone brick block used for rapid vertical movement.

tile.stairs.planks.oak.painted.name=Mystery Wooden Stairs
tile.stairs.planks.oak.painted.desc=How did you get this?!
tile.stairs.planks.oak.painted.black.name=Black Wooden Stairs
tile.stairs.planks.oak.painted.black.desc=Wooden steps, stained black.
tile.stairs.planks.oak.painted.red.name=Red Wooden Stairs
tile.stairs.planks.oak.painted.red.desc=Wooden steps, stained red.
tile.stairs.planks.oak.painted.green.name=Green Wooden Stairs
tile.stairs.planks.oak.painted.green.desc=Wooden steps, stained green.
tile.stairs.planks.oak.painted.brown.name=Brown Wooden Stairs
tile.stairs.planks.oak.painted.brown.desc=Wooden steps, stained brown.
tile.stairs.planks.oak.painted.blue.name=Blue Wooden Stairs
tile.stairs.planks.oak.painted.blue.desc=Wooden steps, stained blue.
tile.stairs.planks.oak.painted.purple.name=Purple Wooden Stairs
tile.stairs.planks.oak.painted.purple.desc=Wooden steps, stained purple.
tile.stairs.planks.oak.painted.cyan.name=Cyan Wooden Stairs
tile.stairs.planks.oak.painted.cyan.desc=Wooden steps, stained cyan.
tile.stairs.planks.oak.painted.silver.name=Light Gray Wooden Stairs
tile.stairs.planks.oak.painted.silver.desc=Wooden steps, stained light gray.
tile.stairs.planks.oak.painted.gray.name=Gray Wooden Stairs
tile.stairs.planks.oak.painted.gray.desc=Wooden steps, stained gray.
tile.stairs.planks.oak.painted.pink.name=Pink Wooden Stairs
tile.stairs.planks.oak.painted.pink.desc=Wooden steps, stained pink.
tile.stairs.planks.oak.painted.lime.name=Lime Wooden Stairs
tile.stairs.planks.oak.painted.lime.desc=Wooden steps, stained lime.
tile.stairs.planks.oak.painted.yellow.name=Yellow Wooden Stairs
tile.stairs.planks.oak.painted.yellow.desc=Wooden steps, stained yellow.
tile.stairs.planks.oak.painted.lightblue.name=Light Blue Wooden Stairs
tile.stairs.planks.oak.painted.lightblue.desc=Wooden steps, stained light blue.
tile.stairs.planks.oak.painted.magenta.name=Magenta Wooden Stairs
tile.stairs.planks.oak.painted.magenta.desc=Wooden steps, stained magenta.
tile.stairs.planks.oak.painted.orange.name=Orange Wooden Stairs
tile.stairs.planks.oak.painted.orange.desc=Wooden steps, stained orange.
tile.stairs.planks.oak.painted.white.name=White Wooden Stairs
tile.stairs.planks.oak.painted.white.desc=Wooden steps, stained white.

tile.obsidian.name=Obsidian
tile.obsidian.desc=Rapidly cooled volcanic rock.

tile.glass.name=Glass
tile.glass.desc=Sand heated until it becomes translucent.
tile.glass.tinted.name=Tinted Glass
tile.glass.tinted.desc=Darkened glass that blocks light.

tile.grass.name=Grass
tile.grass.desc=Crisp, crunchy grass.
tile.grass.retro.name=Retro Grass
tile.grass.retro.desc=Crisp, crunchy grass. Smells old.
tile.grass.scorched.name=Scorched Grass
tile.grass.scorched.desc=Grass that has baked in the sun.

tile.path.dirt.name=Dirt Path
tile.path.dirt.desc=Dirt worn down by frequent travelling.

tile.dirt.name=Dirt
tile.dirt.desc=Crumbly brown dirt.
tile.dirt.scorched.name=Scorched Dirt
tile.dirt.scorched.desc=Dirt that has baked in the sun.
tile.dirt.scorched.rich.name=Rich Scorched Dirt
tile.dirt.scorched.rich.desc=Dirt that has baked in the sun, searing in minerals.

tile.mud.name=Mud
tile.mud.desc=Mud sodden to its core.
tile.mud.baked.name=Baked Mud
tile.mud.baked.desc=Mud that's been dried out and cracked.

tile.sponge.dry.name=Sponge
tile.sponge.dry.desc=A dry sponge, good for soaking up water.
tile.sponge.wet.name=Wet Sponge
tile.sponge.wet.desc=A sponge full of water.

tile.moss.stone.name=Mossy Stone
tile.moss.stone.desc=Moss covering a block of stone.
tile.moss.basalt.name=Mossy Basalt
tile.moss.basalt.desc=Moss covering a block of basalt.
tile.moss.limestone.name=Mossy Limestone
tile.moss.limestone.desc=Moss covering a block of limestone.
tile.moss.granite.name=Mossy Granite
tile.moss.granite.desc=Moss covering a block of granite.

tile.sand.name=Sand
tile.sand.desc=Gets everywhere.
tile.gravel.name=Gravel
tile.gravel.desc=A loose collection of pebbles.

tile.bedrock.name=Bedrock
tile.bedrock.desc=The toughest substance known to man.

tile.fluid.water.flowing.name=Flowing Water
tile.fluid.water.flowing.desc=Water that flows when placed.
tile.fluid.water.still.name=Still Water
tile.fluid.water.still.desc=Water that does not flow when placed.
tile.fluid.lava.flowing.name=Flowing Lava
tile.fluid.lava.flowing.desc=Lava that flows when placed.
tile.fluid.lava.still.name=Still Lava
tile.fluid.lava.still.desc=Lava that does not flow when placed.

tile.log.oak.name=Oak Log
tile.log.oak.desc=A log from an oak tree.
tile.log.pine.name=Pine Log
tile.log.pine.desc=A log from a pine tree.
tile.log.birch.name=Birch Log
tile.log.birch.desc=A log from a birch tree.
tile.log.cherry.name=Cherry Log
tile.log.cherry.desc=A log from a cherry tree.
tile.log.eucalyptus.name=Eucalyptus Log
tile.log.eucalyptus.desc=A log from a eucalyptus tree.
tile.log.oak.mossy.name=Mossy Oak Log
tile.log.oak.mossy.desc=A log from a mossy oak tree.

tile.leaves.oak.name=Oak Leaves
tile.leaves.oak.desc=Leaves from an oak tree.
tile.leaves.pine.name=Pine Leaves
tile.leaves.pine.desc=Leaves from a pine tree.
tile.leaves.birch.name=Birch Leaves
tile.leaves.birch.desc=Leaves from a birch tree.
tile.leaves.cherry.name=Cherry Leaves
tile.leaves.cherry.desc=Leaves from a cherry tree.
tile.leaves.eucalyptus.name=Eucalyptus Leaves
tile.leaves.eucalyptus.desc=Leaves from a eucalyptus tree.
tile.leaves.oak.retro.name=Retro Leaves
tile.leaves.oak.retro.desc=Leaves from long ago.
tile.leaves.shrub.name=Shrub Leaves
tile.leaves.shrub.desc=Leaves from a shrub.
tile.leaves.cherry.flowering.name=Flowering Cherry Leaves
tile.leaves.cherry.flowering.desc=Leaves from a cherry tree that are budding with fruit.
tile.leaves.cacao.name=Cacao Leaves
tile.leaves.cacao.desc=Leaves from a cacao tree.
tile.leaves.caatinga.name=Caatinga Leaves
tile.leaves.caatinga.desc=Leaves from a caatinga tree.

tile.sapling.oak.name=Oak Sapling
tile.sapling.oak.desc=Plant to grow an oak tree.
tile.sapling.pine.name=Pine Sapling
tile.sapling.pine.desc=Plant to grow a pine tree.
tile.sapling.birch.name=Birch Sapling
tile.sapling.birch.desc=Plant to grow a birch tree.
tile.sapling.cherry.name=Cherry Sapling
tile.sapling.cherry.desc=Plant to grow a cherry tree.
tile.sapling.eucalyptus.name=Eucalyptus Sapling
tile.sapling.eucalyptus.desc=Plant to grow a eucalyptus tree.
tile.sapling.oak.retro.name=Retro Oak Sapling
tile.sapling.oak.retro.desc=Plant to grow a tree from long ago.
tile.sapling.shrub.name=Shrub Sapling
tile.sapling.shrub.desc=Plant to grow a shrub.
tile.sapling.cacao.name=Cacao Sapling
tile.sapling.cacao.desc=Plant to grow a cacao tree.

tile.tallgrass.name=Tall Grass
tile.tallgrass.desc=Lush, growing grass.
tile.tallgrass.fern.name=Fern
tile.tallgrass.fern.desc=A fern plant.
tile.deadbush.name=Dead Bush
tile.deadbush.desc=A dried and withered plant.
tile.spinifex.name=Spinifex
tile.spinifex.desc=A spindly, thin grass from dry regions.
tile.algae.name=Algae
tile.algae.desc=Gooey vegetation that floats on the water's surface.

tile.flower.yellow.name=Dandelion
tile.flower.yellow.desc=A beautiful yellow flower.
tile.flower.red.name=Rose
tile.flower.red.desc=A beautiful red flower.

tile.mushroom.red.name=Red Mushroom
tile.mushroom.red.desc=A tasty red mushroom. Good for stew.
tile.mushroom.brown.name=Brown Mushroom
tile.mushroom.brown.desc=A tasty brown mushroom. Good for stew.

tile.ore.coal.stone.name=Stone Coal Ore
tile.ore.coal.stone.desc=A chunk of coal embedded in stone.
tile.ore.coal.basalt.name=Basalt Coal Ore
tile.ore.coal.basalt.desc=A chunk of coal embedded in basalt.
tile.ore.coal.limestone.name=Limestone Coal Ore
tile.ore.coal.limestone.desc=A chunk of coal embedded in limestone.
tile.ore.coal.granite.name=Granite Coal Ore
tile.ore.coal.granite.desc=A chunk of coal embedded in granite.

tile.ore.iron.stone.name=Stone Iron Ore
tile.ore.iron.stone.desc=Iron nuggets embedded in stone.
tile.ore.iron.basalt.name=Basalt Iron Ore
tile.ore.iron.basalt.desc=Iron nuggets embedded in basalt.
tile.ore.iron.limestone.name=Limestone Iron Ore
tile.ore.iron.limestone.desc=Iron nuggets embedded in limestone.
tile.ore.iron.granite.name=Granite Iron Ore
tile.ore.iron.granite.desc=Iron nuggets embedded in granite.

tile.ore.gold.stone.name=Stone Gold Ore
tile.ore.gold.stone.desc=Gold nuggets embedded in stone.
tile.ore.gold.basalt.name=Basalt Gold Ore
tile.ore.gold.basalt.desc=Gold nuggets embedded in basalt.
tile.ore.gold.limestone.name=Limestone Gold Ore
tile.ore.gold.limestone.desc=Gold nuggets embedded in limestone.
tile.ore.gold.granite.name=Granite Gold Ore
tile.ore.gold.granite.desc=Gold nuggets embedded in granite.

tile.ore.lapis.stone.name=Stone Lapis Lazuli Ore
tile.ore.lapis.stone.desc=Chunks of lapis lazuli embedded in stone.
tile.ore.lapis.basalt.name=Basalt Lapis Lazuli Ore
tile.ore.lapis.basalt.desc=Chunks of lapis lazuli embedded in basalt.
tile.ore.lapis.limestone.name=Limestone Lapis Lazuli Ore
tile.ore.lapis.limestone.desc=Chunks of lapis lazuli embedded in limestone.
tile.ore.lapis.granite.name=Granite Lapis Lazuli Ore
tile.ore.lapis.granite.desc=Chunks of lapis lazuli embedded in granite.

tile.ore.redstone.stone.name=Stone Redstone Ore
tile.ore.redstone.stone.desc=Red dust embedded in stone.
tile.ore.redstone.basalt.name=Basalt Redstone Ore
tile.ore.redstone.basalt.desc=Red dust embedded in basalt.
tile.ore.redstone.limestone.name=Limestone Redstone Ore
tile.ore.redstone.limestone.desc=Red dust embedded in limestone.
tile.ore.redstone.granite.name=Granite Redstone Ore
tile.ore.redstone.granite.desc=Red dust embedded in granite.
tile.ore.redstone.glowing.stone.name=Glowing Stone Redstone Ore
tile.ore.redstone.glowing.stone.desc=Red dust embedded in stone. Emits a faint light.
tile.ore.redstone.glowing.basalt.name=Glowing Basalt Redstone Ore
tile.ore.redstone.glowing.basalt.desc=Red dust embedded in basalt. Emits a faint light.
tile.ore.redstone.glowing.limestone.name=Glowing Limestone Redstone Ore
tile.ore.redstone.glowing.limestone.desc=Red dust embedded in limestone. Emits a faint light.
tile.ore.redstone.glowing.granite.name=Glowing Granite Redstone Ore
tile.ore.redstone.glowing.granite.desc=Red dust embedded in granite. Emits a faint light.

tile.ore.diamond.stone.name=Stone Diamond Ore
tile.ore.diamond.stone.desc=A chunk of diamond embedded in stone.
tile.ore.diamond.basalt.name=Basalt Diamond Ore
tile.ore.diamond.basalt.desc=A chunk of diamond embedded in basalt.
tile.ore.diamond.limestone.name=Limestone Diamond Ore
tile.ore.diamond.limestone.desc=A chunk of diamond embedded in limestone.
tile.ore.diamond.granite.name=Granite Diamond Ore
tile.ore.diamond.granite.desc=A chunk of diamond embedded in granite.

tile.ore.nethercoal.netherrack.name=Nether Coal Ore
tile.ore.nethercoal.netherrack.desc=A lump of Nether Coal embedded in netherrack.

tile.block.coal.name=Block of Coal
tile.block.coal.desc=A solid block of coal.
tile.block.iron.name=Block of Iron
tile.block.iron.desc=A solid block of iron. Heavy!
tile.block.gold.name=Block of Gold
tile.block.gold.desc=A solid block of gold, for flaunting your bling.
tile.block.lapis.name=Block of Lapis Lazuli
tile.block.lapis.desc=A solid block of lapis lazuli.
tile.block.redstone.name=Block of Redstone
tile.block.redstone.desc=A solid block of redstone.
tile.block.diamond.name=Block of Diamond
tile.block.diamond.desc=A solid block of diamond. Well done you.
tile.block.nethercoal.name=Block of Nether Coal
tile.block.nethercoal.desc=A solid block of Nether Coal.
tile.block.steel.name=Block of Steel
tile.block.steel.desc=A solid block of steel.
tile.block.quartz.name=Block of Quartz
tile.block.quartz.desc=A solid block of quartz.
tile.block.olivine.name=Block of Olivine
tile.block.olivine.desc=A solid block of olivine.
tile.block.charcoal.name=Block of Charcoal
tile.block.charcoal.desc=A solid block of charcoal.

tile.wire.redstone.name=Redstone Wire
tile.wire.redstone.desc=A strand of redstone dust laid on the ground.

tile.torch.redstone.idle.name=Redstone Torch
tile.torch.redstone.idle.desc=Emits a constant redstone signal.
tile.torch.redstone.active.name=Redstone Torch
tile.torch.redstone.active.desc=Emits a constant redstone signal.

tile.button.stone.name=Stone Button
tile.button.stone.desc=Emits a brief redstone signal when pressed.

tile.lever.cobble.stone.name=Cobblestone Lever
tile.lever.cobble.stone.desc=Allows turning a redstone signal on or off.

tile.pressureplate.stone.name=Stone Pressure Plate
tile.pressureplate.stone.desc=Emits a redstone signal when living creatures step on it.
tile.pressureplate.planks.oak.name=Wooden Pressure Plate
tile.pressureplate.planks.oak.desc=Emits a redstone signal when anything steps on it.
tile.pressureplate.cobble.stone.name=Cobblestone Pressure Plate
tile.pressureplate.cobble.stone.desc=Emits a redstone signal when players step on it.

tile.motionsensor.idle.name=Motion Sensor
tile.motionsensor.idle.desc=Emits a redstone signal when something moves past it.
tile.motionsensor.active.name=Active Motion Sensor
tile.motionsensor.active.desc=Emits a redstone signal when something moves past it.

tile.repeater.idle.name=Redstone Repeater
tile.repeater.idle.desc=Repeats redstone signals over a distance.
tile.repeater.active.name=Redstone Repeater
tile.repeater.active.desc=Repeats redstone signals over a distance.

tile.piston.base.name=Piston
tile.piston.base.desc=Pushes blocks but does not pull them.
tile.piston.base.sticky.name=Sticky Piston
tile.piston.base.sticky.desc=Pushes and pulls blocks.
tile.piston.head.name=Piston Head
tile.piston.head.desc=The pushy part of the piston.
tile.piston.moving.name=Piston Mover
tile.piston.moving.desc=The invisible moving part of the piston.

tile.noteblock.name=Note Block
tile.noteblock.desc=Plays a musical note when powered.

tile.rail.name=Rail
tile.rail.desc=For rapid horizontal movement via minecart.
tile.rail.powered.name=Powered Rail
tile.rail.powered.desc=Makes minecarts go faster when powered.
tile.rail.detector.name=Detector Rail
tile.rail.detector.desc=Emits a redstone signal when a minecart crosses it.

tile.spikes.name=Spike Trap
tile.spikes.desc=Deactivates when powered. Technically a war crime.

tile.dispenser.cobble.stone.name=Dispenser
tile.dispenser.cobble.stone.desc=Fires items out of the hole in the front.

tile.trapdoor.planks.oak.name=Oak Trapdoor
tile.trapdoor.planks.oak.desc=Like a door, but flat.
tile.trapdoor.iron.name=Iron Trapdoor
tile.trapdoor.iron.desc=Like a door, but flat and made of iron.
tile.trapdoor.glass.name=Glass Trapdoor
tile.trapdoor.glass.desc=Useless at its job.

tile.tnt.name=TNT
tile.tnt.desc=Goes off with a bang.

tile.door.planks.oak.bottom.name=Bottom Wooden Door
tile.door.planks.oak.bottom.desc=/give Honeydew 64 46
tile.door.planks.oak.top.name=Top Wooden Door
tile.door.planks.oak.top.desc=Oh, wait, that's not TNT, that's half a door.
tile.door.iron.bottom.name=Bottom Iron Door
tile.door.iron.bottom.desc=Not much good on its own.
tile.door.iron.top.name=Top Iron Door
tile.door.iron.top.desc=Could use a friend.

tile.mesh.name=Mesh Block
tile.mesh.desc=Allows items to pass through but nothing else.
tile.mesh.gold.name=Gold Mesh Block
tile.mesh.gold.desc=Allows a specified item to pass through but nothing else.

tile.bed.name=Bed
tile.bed.desc=Bed!
tile.seat.name=Seat
tile.seat.desc=Sit down and relax.

tile.cobweb.name=Cobweb
tile.cobweb.desc=Sticky silky strands woven by spiders.

tile.fire.name=Fire
tile.fire.desc=Ouch, fire hot!
tile.brazier.inactive.name=Brazier
tile.brazier.inactive.desc=A safe place to keep a fire.
tile.brazier.active.name=Lit Brazier
tile.brazier.active.desc=A safe place to keep a fire.

tile.mobspawner.name=Mob Spawner
tile.mobspawner.desc=A cage filled with horror.
tile.mobspawner.deactivated.name=Deactivated Mob Spawner
tile.mobspawner.deactivated.desc=A cage no longer filled with horror.

tile.workbench.name=Workbench
tile.workbench.desc=For bigger projects.

tile.furnace.stone.idle.name=Furnace
tile.furnace.stone.idle.desc=For melting, heating, and cooking blocks and items.
tile.furnace.stone.active.name=Lit Furnace
tile.furnace.stone.active.desc=For melting, heating, and cooking blocks and items.
tile.furnace.blast.idle.name=Blast Furnace
tile.furnace.blast.idle.desc=Burns hotter than a normal furnace.
tile.furnace.blast.active.name=Lit Blast Furnace
tile.furnace.blast.active.desc=Burns hotter than a normal furnace.

tile.trommel.idle.name=Trommel
tile.trommel.idle.desc=A machine that separates dirt from other useful items.
tile.trommel.active.name=Lit Trommel
tile.trommel.active.desc=A machine that separates dirt from other useful items.

tile.chest.planks.oak.name=Wooden Chest
tile.chest.planks.oak.desc=A place to store your items.
tile.chest.planks.oak.painted.name=Mystery Wooden Chest
tile.chest.planks.oak.painted.desc=How did you get this?!
tile.chest.planks.oak.painted.black.name=Black Wooden Chest
tile.chest.planks.oak.painted.black.desc=A place to store your items.
tile.chest.planks.oak.painted.red.name=Red Wooden Chest
tile.chest.planks.oak.painted.red.desc=A place to store your items.
tile.chest.planks.oak.painted.green.name=Green Wooden Chest
tile.chest.planks.oak.painted.green.desc=A place to store your items.
tile.chest.planks.oak.painted.brown.name=Brown Wooden Chest
tile.chest.planks.oak.painted.brown.desc=A place to store your items.
tile.chest.planks.oak.painted.blue.name=Blue Wooden Chest
tile.chest.planks.oak.painted.blue.desc=A place to store your items.
tile.chest.planks.oak.painted.purple.name=Purple Wooden Chest
tile.chest.planks.oak.painted.purple.desc=A place to store your items.
tile.chest.planks.oak.painted.cyan.name=Cyan Wooden Chest
tile.chest.planks.oak.painted.cyan.desc=A place to store your items.
tile.chest.planks.oak.painted.silver.name=Light Gray Wooden Chest
tile.chest.planks.oak.painted.silver.desc=A place to store your items.
tile.chest.planks.oak.painted.gray.name=Gray Wooden Chest
tile.chest.planks.oak.painted.gray.desc=A place to store your items.
tile.chest.planks.oak.painted.pink.name=Pink Wooden Chest
tile.chest.planks.oak.painted.pink.desc=A place to store your items.
tile.chest.planks.oak.painted.lime.name=Lime Wooden Chest
tile.chest.planks.oak.painted.lime.desc=A place to store your items.
tile.chest.planks.oak.painted.yellow.name=Yellow Wooden Chest
tile.chest.planks.oak.painted.yellow.desc=A place to store your items.
tile.chest.planks.oak.painted.lightblue.name=Light Blue Wooden Chest
tile.chest.planks.oak.painted.lightblue.desc=A place to store your items.
tile.chest.planks.oak.painted.magenta.name=Magenta Wooden Chest
tile.chest.planks.oak.painted.magenta.desc=A place to store your items.
tile.chest.planks.oak.painted.orange.name=Orange Wooden Chest
tile.chest.planks.oak.painted.orange.desc=A place to store your items.
tile.chest.planks.oak.painted.white.name=White Wooden Chest
tile.chest.planks.oak.painted.white.desc=A place to store your items.
tile.chest.legacy.name=Legacy Chest

tile.crops.wheat.name=Wheat Crops
tile.crops.wheat.desc=Wheat, plucked from the ground.
tile.crops.pumpkin.name=Pumpkin Crops
tile.crops.pumpkin.desc=A ripening pumpkin, plucked from the ground.

tile.farmland.dirt.name=Farmland
tile.farmland.dirt.desc=Tilled soil for growing crops.

tile.sign.post.planks.oak.name=Oak Signpost
tile.sign.post.planks.oak.desc=A free-standing oak sign.
tile.sign.wall.planks.oak.name=Oak Wall Sign
tile.sign.wall.planks.oak.desc=An oak sign placed on a wall.

tile.layer.snow.name=Snow Layer
tile.layer.snow.desc=A flat layer of snow.
tile.layer.leaves.oak.name=Leaf Pile
tile.layer.leaves.oak.desc=A pile of leaves.
tile.layer.slate.name=Slate Layer
tile.layer.slate.desc=A flat sheet of slate.

tile.ice.name=Ice
tile.ice.desc=Slippery frozen water.
tile.ice.perma.name=Perma-Ice
tile.ice.perma.desc=Ice imbued with the essence of stone.

tile.block.snow.name=Block of Snow
tile.block.snow.desc=Lots of snow compacted into a block.

tile.cactus.name=Cactus
tile.cactus.desc=A spiky plant that grows in the desert.

tile.block.clay.name=Block of Clay
tile.block.clay.desc=A block of compacted clay.

tile.sugarcane.name=Sugarcane
tile.sugarcane.desc=Not as sweet as you.

tile.block.sugarcane.name=Block of Sugarcane
tile.block.sugarcane.desc=One very big sugar cube.
tile.block.sugarcane.baked.name=Baked Block of Sugarcane
tile.block.sugarcane.baked.desc=Smells absolutely delicious.

tile.jukebox.name=Jukebox
tile.jukebox.desc=Plays your favourite tunes, assuming you have the right record.

tile.pumpkin.name=Pumpkin
tile.pumpkin.desc=An orange squash that grows in the wild.
tile.pumpkin.carved.idle.name=Carved Pumpkin
tile.pumpkin.carved.idle.desc=An orange squash with a spooky face.
tile.pumpkin.carved.active.name=Jack 'o' Lantern
tile.pumpkin.carved.active.desc=An orange squash with a spooky face, lit by a torch.

tile.netherrack.name=Netherrack
tile.netherrack.desc=Dark red rock that burns forever.
tile.netherrack.igneous.name=Igneous Netherrack
tile.netherrack.igneous.desc=Extreme heat has made this rock glow from inside.

tile.soulsand.name=Soul Sand
tile.soulsand.desc=Squishy brown sand that's tough to walk through.

tile.glowstone.name=Block of Glowstone
tile.glowstone.desc=Constantly emits a strong yellowish light.

tile.portal.nether.name=Nether Portal
tile.portal.nether.desc=A portal to the Nether.
tile.portal.paradise.name=Paradise Portal
tile.portal.paradise.desc=A portal to Paradise.

tile.cake.name=Cake
tile.cake.desc=I just can't cake it any more.

tile.lamp.idle.name=Lamp
tile.lamp.idle.desc=How did you get this?!
tile.lamp.idle.black.name=Black Lamp
tile.lamp.idle.black.desc=A redstone lamp that can emit light. Tinted black.
tile.lamp.idle.red.name=Red Lamp
tile.lamp.idle.red.desc=A redstone lamp that can emit light. Tinted red.
tile.lamp.idle.green.name=Green Lamp
tile.lamp.idle.green.desc=A redstone lamp that can emit light. Tinted green.
tile.lamp.idle.brown.name=Brown Lamp
tile.lamp.idle.brown.desc=A redstone lamp that can emit light. Tinted brown.
tile.lamp.idle.blue.name=Blue Lamp
tile.lamp.idle.blue.desc=A redstone lamp that can emit light. Tinted blue.
tile.lamp.idle.purple.name=Purple Lamp
tile.lamp.idle.purple.desc=A redstone lamp that can emit light. Tinted purple.
tile.lamp.idle.cyan.name=Cyan Lamp
tile.lamp.idle.cyan.desc=A redstone lamp that can emit light. Tinted cyan.
tile.lamp.idle.silver.name=Light Gray Lamp
tile.lamp.idle.silver.desc=A redstone lamp that can emit light. Tinted light gray.
tile.lamp.idle.gray.name=Gray Lamp
tile.lamp.idle.gray.desc=A redstone lamp that can emit light. Tinted gray.
tile.lamp.idle.pink.name=Pink Lamp
tile.lamp.idle.pink.desc=A redstone lamp that can emit light. Tinted pink.
tile.lamp.idle.lime.name=Lime Lamp
tile.lamp.idle.lime.desc=A redstone lamp that can emit light. Tinted lime.
tile.lamp.idle.yellow.name=Yellow Lamp
tile.lamp.idle.yellow.desc=A redstone lamp that can emit light. Tinted yellow.
tile.lamp.idle.lightblue.name=Light Blue Lamp
tile.lamp.idle.lightblue.desc=A redstone lamp that can emit light. Tinted light blue.
tile.lamp.idle.magenta.name=Magenta Lamp
tile.lamp.idle.magenta.desc=A redstone lamp that can emit light. Tinted magenta.
tile.lamp.idle.orange.name=Orange Lamp
tile.lamp.idle.orange.desc=A redstone lamp that can emit light. Tinted orange.
tile.lamp.idle.white.name=White Lamp
tile.lamp.idle.white.desc=A redstone lamp that can emit light.

tile.lamp.active.name=Lit Lamp
tile.lamp.active.desc=How did you get this?!
tile.lamp.active.black.name=Lit Black Lamp
tile.lamp.active.black.desc=A redstone lamp that emits light. Tinted black.
tile.lamp.active.red.name=Lit Red Lamp
tile.lamp.active.red.desc=A redstone lamp that emits light. Tinted red.
tile.lamp.active.green.name=Lit Green Lamp
tile.lamp.active.green.desc=A redstone lamp that emits light. Tinted green.
tile.lamp.active.brown.name=Lit Brown Lamp
tile.lamp.active.brown.desc=A redstone lamp that emits light. Tinted brown.
tile.lamp.active.blue.name=Lit Blue Lamp
tile.lamp.active.blue.desc=A redstone lamp that emits light. Tinted blue.
tile.lamp.active.purple.name=Lit Purple Lamp
tile.lamp.active.purple.desc=A redstone lamp that emits light. Tinted purple.
tile.lamp.active.cyan.name=Lit Cyan Lamp
tile.lamp.active.cyan.desc=A redstone lamp that emits light. Tinted cyan.
tile.lamp.active.silver.name=Lit Light Gray Lamp
tile.lamp.active.silver.desc=A redstone lamp that emits light. Tinted light gray.
tile.lamp.active.gray.name=Lit Gray Lamp
tile.lamp.active.gray.desc=A redstone lamp that emits light. Tinted gray.
tile.lamp.active.pink.name=Lit Pink Lamp
tile.lamp.active.pink.desc=A redstone lamp that emits light. Tinted pink.
tile.lamp.active.lime.name=Lit Lime Lamp
tile.lamp.active.lime.desc=A redstone lamp that emits light. Tinted lime.
tile.lamp.active.yellow.name=Yellow Lamp
tile.lamp.active.yellow.desc=A redstone lamp that emits light. Tinted yellow.
tile.lamp.active.lightblue.name=Light Blue Lamp
tile.lamp.active.lightblue.desc=A redstone lamp that emits light. Tinted light blue.
tile.lamp.active.magenta.name=Magenta Lamp
tile.lamp.active.magenta.desc=A redstone lamp that emits light. Tinted magenta.
tile.lamp.active.orange.name=Orange Lamp
tile.lamp.active.orange.desc=A redstone lamp that emits light. Tinted orange.
tile.lamp.active.white.name=White Lamp
tile.lamp.active.white.desc=A redstone lamp that emits light.

tile.stone.polished.name=Polished Stone
tile.stone.polished.desc=A polished block of stone.
tile.granite.polished.name=Polished Granite
tile.granite.polished.desc=A polished block of granite.
tile.limestone.polished.name=Polished Limestone
tile.limestone.polished.desc=A polished block of limestone.
tile.basalt.polished.name=Polished Basalt
tile.basalt.polished.desc=A polished block of basalt.
tile.slate.polished.name=Polished Slate
tile.slate.polished.desc=A polished block of slate.

tile.candle.wax.soul.name=Soul Wax Candle
tile.candle.wax.soul.desc=A waxy brown candle that glows with an unnatural light.

tile.basket.name=Basket
tile.basket.desc=A wicker container for holding items.

tile.overlay.pebbles.name=Pebbles
tile.overlay.pebbles.desc=A cluster of pebbles.

tile.fence.chainlink.name=Chainlink Fence
tile.fence.chainlink.desc=A fence made of interconnected chain links. Can be climbed!
tile.fence.paper_wall.name=Paper Wall Fence
tile.fence.paper_wall.desc=A fence made of delicate paper. Be careful!

tile.lantern.firefly.green.name=Green Firefly Lantern
tile.lantern.firefly.green.desc=A glass jar containing a swarm of green fireflies.
tile.lantern.firefly.orange.name=Orange Firefly Lantern
tile.lantern.firefly.orange.desc=A glass jar containing a swarm of orange fireflies.
tile.lantern.firefly.blue.name=Blue Firefly Lantern
tile.lantern.firefly.blue.desc=A glass jar containing a swarm of blue fireflies.
tile.lantern.firefly.red.name=Red Firefly Lantern
tile.lantern.firefly.red.desc=A glass jar containing a swarm of red fireflies.

tile.flag.name=Flag
tile.flag.desc=A flag to mark your territory.

tile.paper_wall.name=Paper Wall
tile.paper_wall.desc=A wall made of delicate paper. Be careful!

tile.trapdoor.planks.oak.painted.name=Painted Trapdoor
tile.trapdoor.planks.oak.painted.desc=How did you get this?!
tile.trapdoor.planks.oak.painted.black.name=Black Oak Trapdoor
tile.trapdoor.planks.oak.painted.black.desc=Like a door, but flat and painted black.
tile.trapdoor.planks.oak.painted.red.name=Red Oak Trapdoor
tile.trapdoor.planks.oak.painted.red.desc=Like a door, but flat and painted red.
tile.trapdoor.planks.oak.painted.green.name=Green Oak Trapdoor
tile.trapdoor.planks.oak.painted.green.desc=Like a door, but flat and painted green.
tile.trapdoor.planks.oak.painted.brown.name=Brown Oak Trapdoor
tile.trapdoor.planks.oak.painted.brown.desc=Like a door, but flat and painted brown.
tile.trapdoor.planks.oak.painted.blue.name=Blue Oak Trapdoor
tile.trapdoor.planks.oak.painted.blue.desc=Like a door, but flat and painted blue.
tile.trapdoor.planks.oak.painted.purple.name=Purple Oak Trapdoor
tile.trapdoor.planks.oak.painted.purple.desc=Like a door, but flat and painted purple.
tile.trapdoor.planks.oak.painted.cyan.name=Cyan Oak Trapdoor
tile.trapdoor.planks.oak.painted.cyan.desc=Like a door, but flat and painted cyan.
tile.trapdoor.planks.oak.painted.silver.name=Light Gray Oak Trapdoor
tile.trapdoor.planks.oak.painted.silver.desc=Like a door, but flat and painted light gray.
tile.trapdoor.planks.oak.painted.gray.name=Gray Oak Trapdoor
tile.trapdoor.planks.oak.painted.gray.desc=Like a door, but flat and painted gray.
tile.trapdoor.planks.oak.painted.pink.name=Pink Oak Trapdoor
tile.trapdoor.planks.oak.painted.pink.desc=Like a door, but flat and painted pink.
tile.trapdoor.planks.oak.painted.lime.name=Lime Oak Trapdoor
tile.trapdoor.planks.oak.painted.lime.desc=Like a door, but flat and painted lime.
tile.trapdoor.planks.oak.painted.yellow.name=Yellow Oak Trapdoor
tile.trapdoor.planks.oak.painted.yellow.desc=Like a door, but flat and painted yellow.
tile.trapdoor.planks.oak.painted.lightblue.name=Light Blue Oak Trapdoor
tile.trapdoor.planks.oak.painted.lightblue.desc=Like a door, but flat and painted light blue.
tile.trapdoor.planks.oak.painted.magenta.name=Magenta Oak Trapdoor
tile.trapdoor.planks.oak.painted.magenta.desc=Like a door, but flat and painted magenta.
tile.trapdoor.planks.oak.painted.orange.name=Orange Oak Trapdoor
tile.trapdoor.planks.oak.painted.orange.desc=Like a door, but flat and painted orange.
tile.trapdoor.planks.oak.painted.white.name=White Oak Trapdoor
tile.trapdoor.planks.oak.painted.white.desc=Like a door, but flat and painted white.

tile.door.planks.oak.painted.bottom.name=Bottom Painted Wooden Door
tile.door.planks.oak.painted.bottom.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.black.name=Black Bottom Wooden Door
tile.door.planks.oak.painted.bottom.black.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.red.name=Red Bottom Wooden Door
tile.door.planks.oak.painted.bottom.red.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.green.name=Green Bottom Wooden Door
tile.door.planks.oak.painted.bottom.green.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.brown.name=Brown Bottom Wooden Door
tile.door.planks.oak.painted.bottom.brown.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.blue.name=Blue Bottom Wooden Door
tile.door.planks.oak.painted.bottom.blue.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.purple.name=Purple Bottom Wooden Door
tile.door.planks.oak.painted.bottom.purple.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.cyan.name=Cyan Bottom Wooden Door
tile.door.planks.oak.painted.bottom.cyan.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.silver.name=Light Gray Bottom Wooden Door
tile.door.planks.oak.painted.bottom.silver.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.gray.name=Gray Bottom Wooden Door
tile.door.planks.oak.painted.bottom.gray.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.pink.name=Pink Bottom Wooden Door
tile.door.planks.oak.painted.bottom.pink.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.lime.name=Lime Bottom Wooden Door
tile.door.planks.oak.painted.bottom.lime.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.yellow.name=Yellow Bottom Wooden Door
tile.door.planks.oak.painted.bottom.yellow.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.lightblue.name=Light Blue Bottom Wooden Door
tile.door.planks.oak.painted.bottom.lightblue.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.magenta.name=Magenta Bottom Wooden Door
tile.door.planks.oak.painted.bottom.magenta.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.orange.name=Orange Bottom Wooden Door
tile.door.planks.oak.painted.bottom.orange.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.white.name=White Bottom Wooden Door
tile.door.planks.oak.painted.bottom.white.desc=How did you get this?!

tile.door.planks.oak.painted.top.name=Top Painted Wooden Door
tile.door.planks.oak.painted.top.desc=How did you get this?!
tile.door.planks.oak.painted.top.black.name=Black Top Wooden Door
tile.door.planks.oak.painted.top.black.desc=How did you get this?!
tile.door.planks.oak.painted.top.red.name=Red Top Wooden Door
tile.door.planks.oak.painted.top.red.desc=How did you get this?!
tile.door.planks.oak.painted.top.green.name=Green Top Wooden Door
tile.door.planks.oak.painted.top.green.desc=How did you get this?!
tile.door.planks.oak.painted.top.brown.name=Brown Top Wooden Door
tile.door.planks.oak.painted.top.brown.desc=How did you get this?!
tile.door.planks.oak.painted.top.blue.name=Blue Top Wooden Door
tile.door.planks.oak.painted.top.blue.desc=How did you get this?!
tile.door.planks.oak.painted.top.purple.name=Purple Top Wooden Door
tile.door.planks.oak.painted.top.purple.desc=How did you get this?!
tile.door.planks.oak.painted.top.cyan.name=Cyan Top Wooden Door
tile.door.planks.oak.painted.top.cyan.desc=How did you get this?!
tile.door.planks.oak.painted.top.silver.name=Light Gray Top Wooden Door
tile.door.planks.oak.painted.top.silver.desc=How did you get this?!
tile.door.planks.oak.painted.top.gray.name=Gray Top Wooden Door
tile.door.planks.oak.painted.top.gray.desc=How did you get this?!
tile.door.planks.oak.painted.top.pink.name=Pink Top Wooden Door
tile.door.planks.oak.painted.top.pink.desc=How did you get this?!
tile.door.planks.oak.painted.top.lime.name=Lime Top Wooden Door
tile.door.planks.oak.painted.top.lime.desc=How did you get this?!
tile.door.planks.oak.painted.top.yellow.name=Yellow Top Wooden Door
tile.door.planks.oak.painted.top.yellow.desc=How did you get this?!
tile.door.planks.oak.painted.top.lightblue.name=Light Blue Top Wooden Door
tile.door.planks.oak.painted.top.lightblue.desc=How did you get this?!
tile.door.planks.oak.painted.top.magenta.name=Magenta Top Wooden Door
tile.door.planks.oak.painted.top.magenta.desc=How did you get this?!
tile.door.planks.oak.painted.top.orange.name=Orange Top Wooden Door
tile.door.planks.oak.painted.top.orange.desc=How did you get this?!
tile.door.planks.oak.painted.top.white.name=White Top Wooden Door
tile.door.planks.oak.painted.top.white.desc=How did you get this?!

tile.door.glass.top.name=Glass Top Door
tile.door.glass.top.desc=You shouldn't be seeing this.
tile.door.glass.bottom.name=Glass Bottom Door
tile.door.glass.bottom.desc=And that's not just because it's glass.

tile.rope.name=Rope
tile.rope.desc=Rope, rope, rope your boat.
\ No newline at end of file
diff --git a/src/common/resources/recipes/workbench.json b/src/common/resources/recipes/workbench.json
index 353211ba8..2fb44f5c9 100644
--- a/src/common/resources/recipes/workbench.json
+++ b/src/common/resources/recipes/workbench.json
@@ -6652,6 +6652,31 @@
     },
     "consumeContainers": true
   },
+  {
+    "name": "minecraft:workbench/mesh_gold",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "# #",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 16394,
+          "amount": 1,
+          "meta": 0
+        }
+      }
+    ],
+    "result": {
+      "id": 601,
+      "amount": 8,
+      "meta": 0
+    },
+    "consumeContainers": true
+  },
   {
     "name": "minecraft:workbench/cobweb",
     "type": "minecraft:crafting/shaped",
@@ -10303,5 +10328,881 @@
       "meta": 15
     },
     "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/white_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 0
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 15
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/orange_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 1
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 14
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/magenta_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 2
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 13
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/light_blue_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 3
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 12
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/yellow_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 4
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 11
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/lime_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 5
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 10
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/pink_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 6
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 9
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/gray_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 7
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 8
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/silver_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 8
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 7
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/cyan_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 9
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 6
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/purple_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 10
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 5
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/blue_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 11
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 4
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/brown_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 12
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 3
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/green_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 13
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 2
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/red_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 14,
+          "meta": 14
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 1
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/black_wooden_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 15
+        }
+      }
+    ],
+    "result": {
+      "id": 16532,
+      "amount": 2,
+      "meta": 0
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/white_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 0
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 0
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/orange_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 1
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 16
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/magenta_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 2
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 32
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/light_blue_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 3
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 48
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/yellow_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 4
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 64
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/lime_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 5
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 80
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/pink_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 6
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 96
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/gray_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 7
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 112
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/silver_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 8
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 128
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/cyan_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 9
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 144
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/purple_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 10
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 160
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/blue_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 11
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 176
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/brown_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 12
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 192
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/green_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 13
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 208
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/red_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 14,
+          "meta": 14
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 224
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/black_trap_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "###",
+      "###"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 51,
+          "amount": 1,
+          "meta": 15
+        }
+      }
+    ],
+    "result": {
+      "id": 573,
+      "amount": 6,
+      "meta": 240
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/glass_door",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "##",
+      "##",
+      "##"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 190,
+          "amount": 1,
+          "meta": 2
+        }
+      }
+    ],
+    "result": {
+      "id": 16533,
+      "amount": 2,
+      "meta": 13
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/brazier",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X X",
+      "X#X"
+    ],
+    "symbols": [
+      {
+        "symbol": "X",
+        "stack": {
+          "id": 16393,
+          "amount": 1,
+          "meta": 0
+        }
+      },
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 800,
+          "amount": 1,
+          "meta": 0
+        }
+      }
+    ],
+    "result": {
+      "id": 631,
+      "amount": 1,
+      "meta": 0
+    },
+    "consumeContainers": true
+  },
+  {
+    "name": "minecraft:workbench/rope",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "X#X",
+      "X#X",
+      "X#X"
+    ],
+    "symbols": [
+      {
+        "symbol": "#",
+        "stack": {
+          "id": 16469,
+          "amount": 1,
+          "meta": 0
+        }
+      },
+      {
+        "symbol": "X",
+        "stack": {
+          "id": 16415,
+          "amount": 1,
+          "meta": 0
+        }
+      }
+    ],
+    "result": {
+      "id": 16534,
+      "amount": 16,
+      "meta": 0
+    },
+    "consumeContainers": true
   }
+
+
 ]
\ No newline at end of file
diff --git a/src/main/java/net/betterthanadventure/utils/BiomeFinder.java b/src/main/java/net/betterthanadventure/utils/BiomeFinder.java
index fdf808e1d..9e60e6c09 100644
--- a/src/main/java/net/betterthanadventure/utils/BiomeFinder.java
+++ b/src/main/java/net/betterthanadventure/utils/BiomeFinder.java
@@ -45,6 +45,7 @@ public class BiomeFinder implements MinecraftAccessor {
 	public static int posX = 0;
 	public static int posY = 128;
 	public static int posZ = 0;
+
 	public static boolean highlightLoaded = false;
 	private Color bg;
 	private final Set<Biome> allBiomes = new HashSet<>();
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index 80b48f760..18a77b08b 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -350,7 +350,7 @@ public class Minecraft
 		resolution.getSetGuiScale();
 		resolution.update();
 		
-		Display.setVSyncEnabled(gameSettings.limitFramerate.value == 3);
+		Display.setVSyncEnabled(gameSettings.enableVsync.value);
 		if (!gameSettings.disableResize.value) {
 			gameWindow.setResizable(true);
 		}
@@ -1420,7 +1420,7 @@ public class Minecraft
                         else if (Keyboard.getEventKey() == Keyboard.KEY_F7) {
                             render.reload();
                         }
-                        else if ((isMultiplayerWorld() || theWorld.getLevelData().getCheatsEnabled()) && gameSettings.keyCommand.isPressed())
+                        else if (gameSettings.keyCommand.isPressed())
                         {
                             displayGuiScreen(new GuiChat("/"));
                         }
@@ -1588,7 +1588,7 @@ public class Minecraft
         }
 
         // Open chat
-        if ((isMultiplayerWorld() || theWorld.getLevelData().getCheatsEnabled()) && gameSettings.keyChat.isPressEvent(currentInputDevice)) {
+        if (gameSettings.keyChat.isPressEvent(currentInputDevice)) {
             displayGuiScreen(new GuiChat());
             return true;
         }
@@ -2208,7 +2208,7 @@ public class Minecraft
         thePlayer = (EntityPlayerSP)playerController.createPlayer(theWorld);
         thePlayer.dimension = i;
         thePlayer.setGamemode(playerGamemode);
-        thePlayer.messages = previousPlayer.messages;
+        thePlayer.messageHistory = previousPlayer.messageHistory;
         activeCamera = new EntityCameraFirstPerson(this, thePlayer);
         thePlayer.resetPos();
         
diff --git a/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java b/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
index 0c15d5cb5..7eaa8b089 100644
--- a/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
+++ b/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
@@ -56,6 +56,7 @@ public class RichPresenceHandlerThread extends Thread
         biomeNamesMap.put(Biomes.OVERWORLD_HELL, "a ruined world");
         biomeNamesMap.put(Biomes.OVERWORLD_SWAMPLAND_MUDDY, "the swamplands");
         biomeNamesMap.put(Biomes.OVERWORLD_OUTBACK_GRASSY, "the outback");
+        biomeNamesMap.put(Biomes.OVERWORLD_CAATINGA, "the caatinga");
     }
     private static Map<Weather, String> weatherNamesMap = new HashMap<>();
     static
diff --git a/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java b/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java
index 2928640f2..4a7ef626d 100644
--- a/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java
+++ b/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java
@@ -172,7 +172,7 @@ public class EntityClientPlayerMP extends EntityPlayerSP
 	public void sendChatMessage(String s)
     {
         sendQueue.addToSendQueue(new Packet3Chat(s, AES.clientKeyChain));
-        mc.thePlayer.messages.add(s);
+    	addToSendHistory(s);
     }
     
     @Override
diff --git a/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java b/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java
index 0f18bce45..0fc8b0427 100644
--- a/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java
+++ b/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java
@@ -341,7 +341,7 @@ public class EntityPlayerSP extends EntityPlayer
     }
 
     public void sendChatMessage(String s) {
-        mc.thePlayer.messages.add(s);
+    	addToSendHistory(s);
         if (s.startsWith("/")) {
             try{
                 String[] args = s.substring(1).split(" ");
@@ -376,6 +376,21 @@ public class EntityPlayerSP extends EntityPlayer
         }
     }
     
+    public void addToSendHistory(String msg) {
+    	if(msg == null || msg.isEmpty()) {
+    		return;
+    	}
+    	for(int i=0; i < messageHistory.size(); i++) {
+    		if(messageHistory.get(i).equals(msg)) {
+    			messageHistory.remove(i--);
+    		}
+    	}
+        messageHistory.add(msg);
+        if(messageHistory.size() > 100) {
+        	messageHistory.remove(0);
+        }
+    }
+    
     @Override
     public boolean isSneaking()
     {
diff --git a/src/main/java/net/minecraft/client/gui/GuiChat.java b/src/main/java/net/minecraft/client/gui/GuiChat.java
index 218e3e4e8..7961affb1 100644
--- a/src/main/java/net/minecraft/client/gui/GuiChat.java
+++ b/src/main/java/net/minecraft/client/gui/GuiChat.java
@@ -60,12 +60,12 @@ public class GuiChat extends GuiScreen implements ITextField {
 
 	@Override
 	public void keyTyped(char c, int key, int mouseX, int mouseY) {
-		if (key == Keyboard.KEY_UP && mc.thePlayer.messages.size() > 0) {
+		if (key == Keyboard.KEY_UP && mc.thePlayer.messageHistory.size() > 0) {
 			if (currentIndex == 0)
 			{
 				originalMessage = getText();
 			}
-			if (currentIndex < mc.thePlayer.messages.size())
+			if (currentIndex < mc.thePlayer.messageHistory.size())
 			{
 				currentIndex++;
 				setText(getMessage(currentIndex));
@@ -179,6 +179,6 @@ public class GuiChat extends GuiScreen implements ITextField {
 
 	private String getMessage(int currentIndex)
 	{
-		return mc.thePlayer.messages.get(mc.thePlayer.messages.size()-currentIndex);
+		return mc.thePlayer.messageHistory.get(mc.thePlayer.messageHistory.size()-currentIndex);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/gui/GuiConnectToIP.java b/src/main/java/net/minecraft/client/gui/GuiConnectToIP.java
index a53a38433..468a8d6f1 100644
--- a/src/main/java/net/minecraft/client/gui/GuiConnectToIP.java
+++ b/src/main/java/net/minecraft/client/gui/GuiConnectToIP.java
@@ -1,6 +1,7 @@
 package net.minecraft.client.gui;
 
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.net.ServerAddress;
 import org.lwjgl.input.Keyboard;
 
 // Referenced classes of package net.minecraft.src:
@@ -55,48 +56,11 @@ public class GuiConnectToIP extends GuiScreen
         } else
         if(button.id == 0)
         {
-            String s = field_22111_h.getText().trim();
-            mc.gameSettings.lastServer.value = s.replaceAll(":", "_");
+            String serverUrl = field_22111_h.getText().trim();
+            mc.gameSettings.lastServer.value = serverUrl.replaceAll(":", "_");
             mc.gameSettings.saveOptions();
-            String as[] = s.split(":");
-            if(s.startsWith("["))
-            {
-                int i = s.indexOf("]");
-                if(i > 0)
-                {
-                    String s1 = s.substring(1, i);
-                    String s2 = s.substring(i + 1).trim();
-                    if(s2.startsWith(":") && s2.length() > 0)
-                    {
-                        s2 = s2.substring(1);
-                        as = new String[2];
-                        as[0] = s1;
-                        as[1] = s2;
-                    } else
-                    {
-                        as = new String[1];
-                        as[0] = s1;
-                    }
-                }
-            }
-            if(as.length > 2)
-            {
-                as = new String[1];
-                as[0] = s;
-            }
-            mc.displayGuiScreen(new GuiConnecting(mc, as[0], as.length <= 1 ? 25565 : parseIntWithDefault(as[1], 25565)));
-        }
-    }
-
-    private int parseIntWithDefault(String s, int i)
-    {
-        try
-        {
-            return Integer.parseInt(s.trim());
-        }
-        catch(Exception exception)
-        {
-            return i;
+            ServerAddress address = ServerAddress.resolveServerIP(serverUrl);
+            mc.displayGuiScreen(new GuiConnecting(mc, address.getIP(), address.getPort()));
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/GuiIngame.java b/src/main/java/net/minecraft/client/gui/GuiIngame.java
index 989fbdf29..ea0dc51f9 100644
--- a/src/main/java/net/minecraft/client/gui/GuiIngame.java
+++ b/src/main/java/net/minecraft/client/gui/GuiIngame.java
@@ -20,6 +20,7 @@ import net.minecraft.core.data.tag.Tag;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemFood;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.ChatLine;
diff --git a/src/main/java/net/minecraft/client/gui/GuiInventoryCreative.java b/src/main/java/net/minecraft/client/gui/GuiInventoryCreative.java
index 12335d781..cbb72b334 100644
--- a/src/main/java/net/minecraft/client/gui/GuiInventoryCreative.java
+++ b/src/main/java/net/minecraft/client/gui/GuiInventoryCreative.java
@@ -180,9 +180,7 @@ public class GuiInventoryCreative extends GuiInventory implements ITextChangeLis
         clearSearchButton.yPosition = k + 6;
         searchField.xPosition = j + 173;
         searchField.yPosition = k + 7;
-        drawTexturedModalRect(j, k, 0, 0, 169, ySize);
-        drawTexturedModalRect(j + 169, k, 0, 166, 119, 90);
-        drawTexturedModalRect(j + 169, k + 90, 119, 166, 119, 76);
+        drawTexturedModalRect((double)j, (double)k, 0, 0, xSize, ySize, xSize / 2, ySize / 2);
         GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
         GL11.glEnable(2903 /*GL_COLOR_MATERIAL*/);
         GL11.glEnable(GL11.GL_DEPTH_TEST);
diff --git a/src/main/java/net/minecraft/client/gui/GuiSelectServer.java b/src/main/java/net/minecraft/client/gui/GuiSelectServer.java
index 2fdbb1da4..753d91a59 100644
--- a/src/main/java/net/minecraft/client/gui/GuiSelectServer.java
+++ b/src/main/java/net/minecraft/client/gui/GuiSelectServer.java
@@ -7,6 +7,7 @@ import net.minecraft.client.render.tessalator.TessellatorStandard;
 import net.minecraft.core.Global;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.SavedServerList;
+import net.minecraft.core.net.ServerAddress;
 import net.minecraft.core.net.ServerData;
 import net.minecraft.core.util.helper.MathHelper;
 
@@ -194,7 +195,8 @@ public class GuiSelectServer extends GuiScreen {
 		}
 		selected = true;
 		ServerData server = savedServerList.servers.get(selectedServer);
-		mc.displayGuiScreen(new GuiConnecting(mc, server.getHostName(), server.getPort()));
+		ServerAddress address = server.getServerAddress();
+		mc.displayGuiScreen(new GuiConnecting(mc, address.getIP(), address.getPort()));
 	}
 
 	public void deleteWorld(boolean flag, int i) {
diff --git a/src/main/java/net/minecraft/client/gui/GuiTooltip.java b/src/main/java/net/minecraft/client/gui/GuiTooltip.java
index 204842989..6a93bb25e 100644
--- a/src/main/java/net/minecraft/client/gui/GuiTooltip.java
+++ b/src/main/java/net/minecraft/client/gui/GuiTooltip.java
@@ -274,7 +274,7 @@ public class GuiTooltip extends Gui
 				}
 			}
 		} else {
-			String translatedName = trans.translateKey(itemStack.getItemName());
+			String translatedName = trans.translateNameKey(itemStack.getItemName());
 			for(char c : translatedName.toCharArray()) {
 				if(Character.isLetterOrDigit(c))
 					text.append("?");
diff --git a/src/main/java/net/minecraft/client/gui/options/components/FramerateOptionComponent.java b/src/main/java/net/minecraft/client/gui/options/components/FramerateOptionComponent.java
new file mode 100644
index 000000000..407bde2c9
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/options/components/FramerateOptionComponent.java
@@ -0,0 +1,42 @@
+package net.minecraft.client.gui.options.components;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.option.RangeOption;
+import net.minecraft.client.render.window.GameWindowLWJGL2;
+
+public class FramerateOptionComponent extends ToggleableOptionComponent<Integer>{
+    public FramerateOptionComponent(RangeOption option) {
+        super(option);
+    }
+    @Override
+    protected void renderButton(int x, int y, int relativeButtonX, int relativeButtonY, int buttonWidth, int buttonHeight, int relativeMouseX, int relativeMouseY)
+    {
+        if (mc.gameSettings.enableVsync.value && mc.gameWindow instanceof GameWindowLWJGL2){
+            slider.sliderValue = ((GameWindowLWJGL2) mc.gameWindow).defaultDisplayMode.getFrequency();
+            slider.displayString = this.option.getDisplayStringValue();
+            slider.enabled = false;
+        }else {
+            slider.sliderValue = option.value;
+            slider.displayString = this.option.getDisplayStringValue();
+            slider.enabled = true;
+        }
+
+        super.renderButton(x, y, relativeButtonX, relativeButtonY, buttonWidth, buttonHeight, relativeMouseX, relativeMouseY);
+
+        this.slider.xPosition = x + relativeButtonX;
+        this.slider.yPosition = y + relativeButtonY;
+        this.slider.width = buttonWidth;
+        this.slider.height = buttonHeight;
+
+        this.slider.drawButton(mc, x + relativeMouseX, y + relativeMouseY);
+    }
+    @Override
+    public void init(Minecraft mc){
+        slider.sliderValue = option.getValueIndex();
+        if (mc.gameSettings.enableVsync.value && mc.gameWindow instanceof GameWindowLWJGL2){
+            slider.sliderValue = ((GameWindowLWJGL2) mc.gameWindow).defaultDisplayMode.getFrequency();
+            slider.enabled = false;
+        }
+        this.slider.displayString = this.option.getDisplayStringValue();
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/options/components/ToggleableOptionComponent.java b/src/main/java/net/minecraft/client/gui/options/components/ToggleableOptionComponent.java
index 0825c94dc..3e5b789a0 100644
--- a/src/main/java/net/minecraft/client/gui/options/components/ToggleableOptionComponent.java
+++ b/src/main/java/net/minecraft/client/gui/options/components/ToggleableOptionComponent.java
@@ -8,7 +8,7 @@ public class ToggleableOptionComponent<E>
         extends ButtonComponent
 {
     protected final ToggleableOption<E> option;
-    private final GuiSliderInteger slider;
+    protected final GuiSliderInteger slider;
 
     public ToggleableOptionComponent(ToggleableOption<E> option)
     {
diff --git a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index 31ad8a28b..1b75daccd 100644
--- a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -72,8 +72,8 @@ public abstract class OptionsPages
             .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.colorblindnessFix))
         )
         .withComponent(new OptionsCategory("gui.options.page.video.category.performance")
-            .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.limitFramerate))
-            .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.customFpsLimit))
+            .withComponent(new BooleanOptionComponent(mc.gameSettings.enableVsync))
+            .withComponent(new FramerateOptionComponent(mc.gameSettings.customFpsLimit))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.advancedOpenGL))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.enableVbos))
         )
diff --git a/src/main/java/net/minecraft/client/gui/paged/GuiPaged.java b/src/main/java/net/minecraft/client/gui/paged/GuiPaged.java
new file mode 100644
index 000000000..3ab1e68cb
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/paged/GuiPaged.java
@@ -0,0 +1,472 @@
+package net.minecraft.client.gui.paged;
+
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.GuiRenderItem;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.render.Scissor;
+import net.minecraft.client.render.tessalator.TessellatorStandard;
+import net.minecraft.core.lang.I18n;
+import net.minecraft.core.sound.SoundCategory;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+
+import static org.lwjgl.opengl.GL11.*;
+import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
+
+public class GuiPaged
+    extends GuiScreen {
+    private static final int TOP_SPACING = 24;
+    private static final int BUTTON_SPACING = 4;
+    private static final int SEPARATOR_WIDTH = 8;
+    private static final int PADDING = 8;
+    private static final int PAGE_BUTTON_HEIGHT = 20;
+
+    private float rightScrollAmount = 0.0f;
+    private float leftScrollAmount = 0.0f;
+    private int top, bottom, rightScrollRegionHeight, leftScrollRegionHeight, pageWidth, leftWidth;
+
+    private Float oldRightScrollAmount;
+    private Float oldLeftScrollAmount;
+    private Integer clickX, clickY;
+    private Page selectedPage;
+    private PageComponent clickedComponent;
+    private int clickedComponentY;
+    private GuiRenderItem renderItem = null;
+
+    private final PageRegistry pageRegistry;
+
+    public GuiPaged(GuiScreen parent, PageRegistry pageRegistry, Page selectedPage)
+    {
+        super(parent);
+        this.pageRegistry = pageRegistry;
+        this.selectedPage = selectedPage;
+    }
+
+    @Override
+    public void init()
+    {
+        super.init();
+
+        controlList.add(new GuiButton(0, width / 2 - 100, height - (BUTTON_SPACING + 20), 200, 20, I18n.getInstance().translateKey("gui.options.button.done")));
+
+        top = TOP_SPACING;
+        bottom = height - (BUTTON_SPACING + 20 + BUTTON_SPACING);
+
+        rightScrollRegionHeight = bottom - top;
+        leftScrollRegionHeight = bottom - top;
+
+        this.renderItem = new GuiRenderItem(mc);
+
+        this.selectedPage.initComponents(mc);
+    }
+
+    @Override
+    public void keyTyped(char c, int key, int mouseX, int mouseY) {
+        if (key == Keyboard.KEY_ESCAPE)
+        {
+            mc.displayGuiScreen(getParentScreen());
+        }
+        else
+        {
+            for (PageComponent component : selectedPage.getComponents())
+            {
+                component.onKeyPress(key, c);
+            }
+        }
+    }
+
+    private void drawPageItems(int x, int y, int width, int mouseX, int mouseY)
+    {
+        int y2 = y;
+        for (PageComponent component : selectedPage.getComponents())
+        {
+            component.render(x, y2, width, mouseX - x, mouseY - y2);
+            y2 += component.getHeight();
+        }
+    }
+
+    private void drawPagesListItems(int x, int y, int width, int mouseX, int mouseY) {
+        int y2 = y;
+        for(Page page : pageRegistry.getPages()) {
+            String translated = I18n.getInstance().translateKey(page.getTranslationKey());
+            int textColor = 0xFF7F7F7F;
+            if (page == selectedPage) {
+                textColor = 0xFFFFFFFF;
+            }
+            if (mouseX >= x && mouseX < x + width && mouseY >= y2 && mouseY < y2 + PAGE_BUTTON_HEIGHT) {
+                textColor = 0xFFFFFFA0;
+            }
+            renderItem.render(page.getIcon(), x, y2 + (PAGE_BUTTON_HEIGHT / 2) - 9);
+            mc.fontRenderer.drawStringWithShadow(translated, x + 19, y2 + (PAGE_BUTTON_HEIGHT / 2) - 4, textColor);
+            y2 += PAGE_BUTTON_HEIGHT;
+        }
+    }
+
+    @Override
+    public void tick() {
+        for (PageComponent component : selectedPage.getComponents())
+        {
+            component.tick();
+        }
+    }
+
+    @Override
+    protected void buttonPressed(GuiButton guibutton) {
+        super.buttonPressed(guibutton);
+
+        if (guibutton.id == 0)
+        {
+            mc.displayGuiScreen(getParentScreen());
+            mc.texturePackList.refreshIfReady(); // Sets the texturepacks on menu close
+        }
+    }
+
+    @Override
+    public void onClosed() {
+        super.onClosed();
+        mc.gameSettings.saveOptions();
+    }
+
+    private void scrollOptions(float amount) {
+        if(amount == 0.0f) return;
+
+        rightScrollAmount += amount;
+        onScrollOptions();
+    }
+
+    private void onScrollOptions() {
+        int totalPageHeight = getTotalPageHeight();
+        if (rightScrollAmount < 0 || rightScrollRegionHeight > totalPageHeight) rightScrollAmount = 0;
+        else if (rightScrollAmount > totalPageHeight - rightScrollRegionHeight) rightScrollAmount = totalPageHeight - rightScrollRegionHeight;
+    }
+
+    private void scrollPagesList(float amount) {
+        if(amount == 0.0f) return;
+
+        leftScrollAmount += amount;
+        onScrollPagesList();
+    }
+
+    private void onScrollPagesList() {
+        int totalPagesListHeight = getTotalPagesListHeight();
+        if (leftScrollAmount < 0 || leftScrollRegionHeight > totalPagesListHeight) leftScrollAmount = 0;
+        else if (leftScrollAmount > totalPagesListHeight - leftScrollRegionHeight) leftScrollAmount = totalPagesListHeight - leftScrollRegionHeight;
+    }
+
+    private int getTotalPageHeight()
+    {
+        int totalPageHeight = 0;
+        for (PageComponent component : selectedPage.getComponents())
+        {
+            totalPageHeight += component.getHeight();
+        }
+        return totalPageHeight;
+    }
+
+    private int getTotalPagesListHeight() {
+        return PAGE_BUTTON_HEIGHT * pageRegistry.getPages().size();
+    }
+
+    @Override
+    public void drawScreen(int mouseX, int mouseY, float renderPartialTicks)
+    {
+        if (mouseX > leftWidth + SEPARATOR_WIDTH + PADDING && mouseX < width) {
+            if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
+                scrollOptions(Mouse.getDWheel() * -1.0f);
+            } else {
+                scrollOptions(Mouse.getDWheel() / -5.0f);
+            }
+            onScrollOptions();
+        } else if (mouseX >= 0 && mouseX <= leftWidth) {
+            if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
+                scrollPagesList(Mouse.getDWheel() * -1.0f);
+            } else {
+                scrollPagesList(Mouse.getDWheel() / -5.0f);
+            }
+            onScrollPagesList();
+        }
+
+        leftWidth = (int)(width * 0.25f);
+        pageWidth = width - (leftWidth + SEPARATOR_WIDTH + (PADDING * 2));
+        I18n i18n = I18n.getInstance();
+
+        drawDefaultBackground();
+        overlayBackground(0, width, 0, top);
+        overlayBackground(0, width, bottom, height);
+
+        Scissor.enable(0, top, width, bottom - top);
+        if (mouseY >= top && mouseY <= bottom) {
+            drawPageItems(leftWidth + SEPARATOR_WIDTH + PADDING, top - (int) rightScrollAmount, pageWidth - 8, mouseX, mouseY);
+        } else {
+            drawPageItems(leftWidth + SEPARATOR_WIDTH + PADDING, top - (int) rightScrollAmount, pageWidth - 8, -1, -1);
+        }
+        Scissor.disable();
+
+        Scissor.enable(0, top, leftWidth, bottom - top);
+        int pagesListHeight = getTotalPagesListHeight();
+        int pagesListY = top - (int) leftScrollAmount;
+        if (pagesListHeight < bottom - top) {
+            pagesListY = top + (bottom - top - pagesListHeight) / 2;
+        }
+        if (mouseY >= top && mouseY <= bottom) {
+            drawPagesListItems(PADDING - 4, pagesListY, leftWidth - PADDING, mouseX, mouseY);
+        } else {
+            drawPagesListItems(PADDING - 4, pagesListY, leftWidth - PADDING, -1, -1);
+        }
+        Scissor.disable();
+
+        // Draw shadows
+        if (mc.theWorld == null)
+        {
+            TessellatorStandard tessellator = TessellatorStandard.instance;
+            GL11.glDisable(GL_DEPTH_TEST);
+            int shadowSize = 4;
+            GL11.glEnable(GL_BLEND);
+            GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            GL11.glDisable(GL_ALPHA_TEST);
+            GL11.glShadeModel(GL_SMOOTH);
+            GL11.glDisable(GL_TEXTURE_2D);
+
+            tessellator.startDrawingQuads();
+            tessellator.setColorRGBA_I(0, 0);
+            tessellator.addVertexWithUV(0, top + shadowSize, 0.0D, 0.0D, 1.0D);
+            tessellator.addVertexWithUV(width, top + shadowSize, 0.0D, 1.0D, 1.0D);
+            tessellator.setColorRGBA_I(0, 255);
+            tessellator.addVertexWithUV(width, top, 0.0D, 1.0D, 0.0D);
+            tessellator.addVertexWithUV(0, top, 0.0D, 0.0D, 0.0D);
+            tessellator.draw();
+
+            tessellator.startDrawingQuads();
+            tessellator.setColorRGBA_I(0, 255);
+            tessellator.addVertexWithUV(0, bottom, 0.0D, 0.0D, 1.0D);
+            tessellator.addVertexWithUV(width, bottom, 0.0D, 1.0D, 1.0D);
+            tessellator.setColorRGBA_I(0, 0);
+            tessellator.addVertexWithUV(width, bottom - shadowSize, 0.0D, 1.0D, 0.0D);
+            tessellator.addVertexWithUV(0, bottom - shadowSize, 0.0D, 0.0D, 0.0D);
+            tessellator.draw();
+
+            GL11.glEnable(GL_TEXTURE_2D);
+            GL11.glShadeModel(GL_FLAT);
+            GL11.glEnable(GL_ALPHA_TEST);
+            GL11.glDisable(GL_BLEND);
+        }
+
+        overlayBackground(leftWidth, leftWidth + SEPARATOR_WIDTH, top, bottom);
+
+        String titleLanguageKey = "gui.options.title";
+        drawStringCentered(fontRenderer, i18n.translateKey(titleLanguageKey), width / 2, 5, 0xffffff);
+
+        drawOptionsScrollBar(mouseX, mouseY);
+        drawPagesListScrollBar(mouseX, mouseY);
+
+        super.drawScreen(mouseX, mouseY, renderPartialTicks);
+    }
+
+    protected void drawOptionsScrollBar(int mouseX, int mouseY) {
+        float totalPageHeight = getTotalPageHeight();
+        float scrollBarHeightPercent = rightScrollRegionHeight / totalPageHeight;
+
+        if(scrollBarHeightPercent > 1.0f) return;
+
+        glDisable(GL_TEXTURE_2D);
+
+        int scrollBarX = width - 6;
+
+        int scrollBarHeightPx = (int) (scrollBarHeightPercent * rightScrollRegionHeight);
+        if(scrollBarHeightPx < 32) {
+            scrollBarHeightPx = 32;
+        }
+
+        float scrollPercent = rightScrollAmount / (totalPageHeight - rightScrollRegionHeight);
+
+        int scrollBarY = (int) (top + (rightScrollRegionHeight - scrollBarHeightPx) * scrollPercent);
+
+        TessellatorStandard t = TessellatorStandard.instance;
+
+        t.startDrawingQuads();
+        t.setColorOpaque(0, 0, 0);
+        t.drawRectangle(scrollBarX, top, 6, rightScrollRegionHeight);
+        t.setColorRGBA_I(0x808080, 255);
+        t.drawRectangle(scrollBarX, scrollBarY, 6, scrollBarHeightPx);
+        t.setColorRGBA_I(0xc0c0c0, 255);
+        t.drawRectangle(scrollBarX + 1, scrollBarY, 5, scrollBarHeightPx - 1);
+        t.draw();
+
+        glEnable(GL_TEXTURE_2D);
+
+        if(clickX != null && clickY != null) {
+            if(clickX >= scrollBarX && clickY >= top && clickX <= scrollBarX + 6 && clickY < bottom) {
+                if(oldRightScrollAmount == null) {
+                    oldRightScrollAmount = rightScrollAmount;
+                }
+                rightScrollAmount = oldRightScrollAmount + (clickY - mouseY) * (1.0f / scrollBarHeightPercent) * -1.0f;
+                onScrollOptions();
+            }
+        }else {
+            oldRightScrollAmount = null;
+        }
+    }
+
+    protected void drawPagesListScrollBar(int mouseX, int mouseY) {
+        float totalPagesListHeight = getTotalPagesListHeight();
+        float scrollBarHeightPercent = leftScrollRegionHeight / totalPagesListHeight;
+
+        if(scrollBarHeightPercent > 1.0f) return;
+
+        glDisable(GL_TEXTURE_2D);
+
+        int scrollBarX = leftWidth - 6;
+
+        int scrollBarHeightPx = (int) (scrollBarHeightPercent * leftScrollRegionHeight);
+        if(scrollBarHeightPx < 32) {
+            scrollBarHeightPx = 32;
+        }
+
+        float scrollPercent = leftScrollAmount / (totalPagesListHeight - leftScrollRegionHeight);
+
+        int scrollBarY = (int) (top + (leftScrollRegionHeight - scrollBarHeightPx) * scrollPercent);
+
+        TessellatorStandard t = TessellatorStandard.instance;
+
+        t.startDrawingQuads();
+        t.setColorOpaque(0, 0, 0);
+        t.drawRectangle(scrollBarX, top, 6, leftScrollRegionHeight);
+        t.setColorRGBA_I(0x808080, 255);
+        t.drawRectangle(scrollBarX, scrollBarY, 6, scrollBarHeightPx);
+        t.setColorRGBA_I(0xc0c0c0, 255);
+        t.drawRectangle(scrollBarX + 1, scrollBarY, 5, scrollBarHeightPx - 1);
+        t.draw();
+
+        glEnable(GL_TEXTURE_2D);
+
+        if(clickX != null && clickY != null) {
+            if(clickX >= scrollBarX && clickY >= top && clickX <= scrollBarX + 6 && clickY < bottom) {
+                if(oldLeftScrollAmount == null) {
+                    oldLeftScrollAmount = leftScrollAmount;
+                }
+                leftScrollAmount = oldLeftScrollAmount + (clickY - mouseY) * (1.0f / scrollBarHeightPercent) * -1.0f;
+                onScrollOptions();
+            }
+        }else {
+            oldLeftScrollAmount = null;
+        }
+    }
+
+    @Override
+    public void mouseClicked(int mouseX, int mouseY, int mouseButton)
+    {
+        super.mouseClicked(mouseX, mouseY, mouseButton);
+
+        int left = leftWidth + SEPARATOR_WIDTH + PADDING;
+
+        if (mouseX >= leftWidth + SEPARATOR_WIDTH && mouseY >= top && mouseY <= bottom) {
+            int componentY = top - (int) rightScrollAmount;
+            for (PageComponent component : selectedPage.getComponents())
+            {
+                if (mouseX >= left && mouseX <= left + pageWidth - PADDING && mouseY >= componentY && mouseY <= componentY + component.getHeight()) {
+                    component.onMouseClick(mouseButton, left, componentY, pageWidth - PADDING, mouseX - left, mouseY - componentY);
+                    clickedComponent = component;
+                    clickedComponentY = componentY;
+                    break;
+                }
+                componentY += component.getHeight();
+            }
+        } else if (mouseX >= 0 && mouseX <= leftWidth && mouseY >= top && mouseY <= bottom) {
+            int pagesListHeight = getTotalPagesListHeight();
+            int pagesListY = top - (int) leftScrollAmount;
+            if (pagesListHeight < bottom - top) {
+                pagesListY = top + (bottom - top - pagesListHeight) / 2;
+            }
+            for(Page page : pageRegistry.getPages()) {
+                if (mouseX >= 0 && mouseX <= leftWidth && mouseY >= pagesListY && mouseY <= pagesListY + PAGE_BUTTON_HEIGHT) {
+                    rightScrollAmount = 0;
+                    selectedPage = page;
+                    this.selectedPage.initComponents(mc);
+                    mc.sndManager.playSound("random.click", SoundCategory.GUI_SOUNDS, 1.0F, 1.0F);
+                    mc.texturePackList.refreshIfReady();
+                    break;
+                }
+                pagesListY += PAGE_BUTTON_HEIGHT;
+            }
+        }
+
+        clickX = mouseX;
+        clickY = mouseY;
+    }
+
+    @Override
+    public void mouseMovedOrButtonReleased(int mouseX, int mouseY, int mouseButton) {
+        super.mouseMovedOrButtonReleased(mouseX, mouseY, mouseButton);
+
+        int left = leftWidth + SEPARATOR_WIDTH + PADDING;
+        if (mouseY >= top && mouseY <= bottom) {
+            if (clickedComponent != null) {
+                if (mouseButton >= 0) {
+                    clickedComponent.onMouseRelease(mouseButton, left, clickedComponentY, pageWidth, mouseX - left, mouseY - clickedComponentY);
+                    clickedComponent = null;
+                } else {
+                    clickedComponent.onMouseMove(left, clickedComponentY, pageWidth, mouseX - left, mouseY - clickedComponentY);
+                }
+            }
+        }
+
+        if(mouseButton >= 0) {
+            clickX = null;
+            clickY = null;
+        }
+    }
+
+    @Override
+    public void drawDefaultBackground() {
+        super.drawDefaultBackground();
+
+        if (mc.theWorld == null)
+        {
+            TessellatorStandard tessellator = TessellatorStandard.instance;
+            GL11.glBindTexture(GL_TEXTURE_2D, mc.renderEngine.getTexture("/gui/background.png"));
+            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+            float scale = 32F;
+            tessellator.startDrawingQuads();
+            tessellator.setColorOpaque_I(0x202020);
+
+            tessellator.addVertexWithUV(0, bottom, 0.0D, 0, (float)(bottom + (int) rightScrollAmount) / scale);
+            tessellator.addVertexWithUV(width, bottom, 0.0D, (float)width / scale, (float)(bottom + (int) rightScrollAmount) / scale);
+            tessellator.addVertexWithUV(width, top, 0.0D, (float)width / scale, (float)(top + (int) rightScrollAmount) / scale);
+            tessellator.addVertexWithUV(0, top, 0.0D, 0, (float)(top + (int) rightScrollAmount) / scale);
+
+            tessellator.addVertexWithUV(0, bottom, 0.0D, 0, (float)(bottom + (int) leftScrollAmount) / scale);
+            tessellator.addVertexWithUV(leftWidth, bottom, 0.0D, (float) leftWidth / scale, (float)(bottom + (int) leftScrollAmount) / scale);
+            tessellator.addVertexWithUV(leftWidth, top, 0.0D, (float) leftWidth / scale, (float)(top + (int) leftScrollAmount) / scale);
+            tessellator.addVertexWithUV(0, top, 0.0D, 0, (float)(top + (int) leftScrollAmount) / scale);
+
+            tessellator.draw();
+        }
+        else
+        {
+            drawRect(0, 0, width, top, 0x5F000000);
+            drawRect(0, bottom, width, height, 0x5F000000);
+            drawRect(leftWidth, top, leftWidth + SEPARATOR_WIDTH, bottom, 0x5F000000);
+        }
+    }
+
+    private void overlayBackground(int minX, int maxX, int minY, int maxY)
+    {
+        if (mc.theWorld == null)
+        {
+            TessellatorStandard tessellator = TessellatorStandard.instance;
+            GL11.glBindTexture(GL_TEXTURE_2D, mc.renderEngine.getTexture("/gui/background.png"));
+            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+            float scale = 32F;
+            tessellator.startDrawingQuads();
+            tessellator.setColorOpaque_I(0x404040);
+            tessellator.addVertexWithUV(minX, maxY, 0.0D, (float) minX / scale, (float) maxY / scale);
+            tessellator.addVertexWithUV(maxX, maxY, 0.0D, (float) maxX / scale, (float) maxY / scale);
+            tessellator.setColorOpaque_I(0x404040);
+            tessellator.addVertexWithUV(maxX, minY, 0.0D, (float) maxX / scale, (float) minY / scale);
+            tessellator.addVertexWithUV(minX, minY, 0.0D, (float) minX / scale, (float) minY / scale);
+            tessellator.draw();
+        }
+    }
+
+}
diff --git a/src/main/java/net/minecraft/client/gui/paged/Page.java b/src/main/java/net/minecraft/client/gui/paged/Page.java
new file mode 100644
index 000000000..f2fa2f343
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/paged/Page.java
@@ -0,0 +1,59 @@
+package net.minecraft.client.gui.paged;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.options.components.OptionsComponent;
+import net.minecraft.client.gui.options.data.OptionsPage;
+import net.minecraft.core.item.ItemStack;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Page {
+    private static final int COMPONENT_SPACING = 4;
+    private final String translationKey;
+    private final List<PageComponent> components = new ArrayList<>();
+    private final ItemStack icon;
+
+    public Page(String translationKey, ItemStack icon) {
+        this.translationKey = translationKey;
+        this.icon = icon;
+    }
+
+    public Page withComponent(PageComponent component)
+    {
+        components.add(component);
+        return this;
+    }
+
+    public String getTranslationKey()
+    {
+        return translationKey;
+    }
+
+    public List<PageComponent> getComponents()
+    {
+        return components;
+    }
+
+    public void initComponents(Minecraft mc) {
+        for (PageComponent component : components) {
+            component.init(mc);
+        }
+    }
+
+    public int getHeight()
+    {
+        int height = 0;
+        for (PageComponent component : components)
+        {
+            height += component.getHeight() + COMPONENT_SPACING;
+        }
+        height -= COMPONENT_SPACING;
+        return height;
+    }
+
+    public ItemStack getIcon()
+    {
+        return icon;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/paged/PageComponent.java b/src/main/java/net/minecraft/client/gui/paged/PageComponent.java
new file mode 100644
index 000000000..8301b293e
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/paged/PageComponent.java
@@ -0,0 +1,23 @@
+package net.minecraft.client.gui.paged;
+
+import net.minecraft.client.Minecraft;
+
+public interface PageComponent {
+    default void init(Minecraft mc) { }
+
+    int getHeight();
+
+    void render(int x, int y, int width, int relativeMouseX, int relativeMouseY);
+
+    default void tick() { }
+
+    void onMouseClick(int mouseButton, int x, int y, int width, int relativeMouseX, int relativeMouseY);
+
+    void onMouseMove(int x, int y, int width, int relativeMouseX, int relativeMouseY);
+
+    void onMouseRelease(int mouseButton, int x, int y, int width, int relativeMouseX, int relativeMouseY);
+
+    void onKeyPress(int keyCode, char character);
+
+    boolean matchesSearchTerm(String term);
+}
diff --git a/src/main/java/net/minecraft/client/gui/paged/PageRegistry.java b/src/main/java/net/minecraft/client/gui/paged/PageRegistry.java
new file mode 100644
index 000000000..c38e82dcf
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/paged/PageRegistry.java
@@ -0,0 +1,23 @@
+package net.minecraft.client.gui.paged;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class PageRegistry {
+    private final List<Page> pages = new ArrayList<>();
+
+    public void register(Page page) {
+        if (!pages.contains(page)) {
+            pages.add(page);
+        }
+    }
+
+    public int getPageIndex(Page page) {
+        return pages.indexOf(page);
+    }
+
+    public List<Page> getPages() {
+        return Collections.unmodifiableList(pages);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/net/handler/NetPingHandler.java b/src/main/java/net/minecraft/client/net/handler/NetPingHandler.java
index d03cd5491..810b0601d 100644
--- a/src/main/java/net/minecraft/client/net/handler/NetPingHandler.java
+++ b/src/main/java/net/minecraft/client/net/handler/NetPingHandler.java
@@ -2,6 +2,7 @@ package net.minecraft.client.net.handler;
 
 import net.minecraft.client.gui.GuiSelectServer;
 import net.minecraft.core.net.NetworkManager;
+import net.minecraft.core.net.ServerAddress;
 import net.minecraft.core.net.ServerData;
 import net.minecraft.core.net.handler.NetHandler;
 import net.minecraft.core.net.packet.Packet;
@@ -24,7 +25,8 @@ public class NetPingHandler
         throws IOException {
         this.gui = gui;
         this.server = server;
-        Socket socket = new Socket(InetAddress.getByName(server.getHostName()), server.getPort());
+        ServerAddress address = server.getServerAddress();
+        Socket socket = new Socket(InetAddress.getByName(address.getIP()), address.getPort());
         netManager = new NetworkManager(socket, "Ping", this, true);
     }
 
diff --git a/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java b/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java
index 7530c497c..4e7b5fe75 100644
--- a/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java
+++ b/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java
@@ -3,6 +3,7 @@ package net.minecraft.client.net.thread;
 import net.minecraft.client.gui.GuiSelectServer;
 import net.minecraft.client.net.handler.NetPingHandler;
 import net.minecraft.core.Global;
+import net.minecraft.core.net.ServerAddress;
 import net.minecraft.core.net.ServerData;
 import net.minecraft.core.net.handler.NetHandler;
 import net.minecraft.core.net.packet.Packet254PingHandshake;
@@ -18,7 +19,8 @@ public class ThreadPingServer
     public ThreadPingServer(GuiSelectServer gui, ServerData server) {
         this.gui = gui;
         this.server = server;
-        this.setName("ThreadPingServer - " + server.getHostName() + ":" + server.getPort());
+        ServerAddress address = server.getServerAddress();
+        this.setName("ThreadPingServer - " + address.getIP() + ":" + address.getPort());
     }
 
     public ServerData getServer() {
@@ -39,8 +41,9 @@ public class ThreadPingServer
 
     @Override
     public void run() {
-        String hostName = server.getHostName();
-        int port = server.getPort();
+        ServerAddress address = this.server.getServerAddress();
+        String hostName = address.getIP();
+        int port = address.getPort();
 
         try {
             netHandler = new NetPingHandler(gui, server);
diff --git a/src/main/java/net/minecraft/client/option/GameSettings.java b/src/main/java/net/minecraft/client/option/GameSettings.java
index b5ee6a146..dbce20936 100644
--- a/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -107,7 +107,7 @@ public class GameSettings {
 	public EnumOption<Difficulty> difficulty = new EnumOption<>(this, "difficulty", Difficulty.class, Difficulty.NORMAL);
 	public IntegerOption thirdPersonView = new IntegerOption(this, "thirdPersonView", 0);
 	public EnumOption<RenderDistance> renderDistance = new EnumOption<>(this, "renderDistance", RenderDistance.class, RenderDistance.FAR);
-	public RangeOption limitFramerate = new RangeOption(this, "limitFramerate", 1, 4);
+	public BooleanOption enableVsync = new BooleanOption(this, "enableVsync", false);
 	public RangeOption customFpsLimit = new RangeOption(this,"customFpsLimit",0,241);
 	public IntegerOption guiScale = new IntegerOption(this, "guiScale", 0);
 	public IntegerOption overlayMode = new IntegerOption(this, "overlayMode", 0);
@@ -293,27 +293,14 @@ public class GameSettings {
 				return guiScale.value + "x";
 			}
 		}
-		if (option == limitFramerate) {
-			return trans.translateKey(LIMIT_FRAMERATES[limitFramerate.value]);
-		}
 		if(option == customFpsLimit){
 			Option<Integer> limit = (Option<Integer>) option;
 			int value = limit.value;
 			int maxValue = 240;
-			switch (limitFramerate.value) {
-				case 0:
-					break;
-				case 1:
-					maxValue = 120;
-					break;
-				case 2:
-					maxValue = 40;
-					break;
-				case 3:
-					if(mc.gameWindow instanceof GameWindowLWJGL2){
-						maxValue = ((GameWindowLWJGL2) mc.gameWindow).defaultDisplayMode.getFrequency();
-					}
-					break;
+			if (enableVsync.value){
+				if(mc.gameWindow instanceof GameWindowLWJGL2){
+					return String.valueOf(((GameWindowLWJGL2) mc.gameWindow).defaultDisplayMode.getFrequency());
+				}
 			}
 			if(value > maxValue){
 				limit.set(maxValue);
@@ -369,7 +356,7 @@ public class GameSettings {
 	}
 
 	public void optionChanged(Option<?> option) {
-		if(option == limitFramerate) Display.setVSyncEnabled(limitFramerate.value == 3);
+		if(option == enableVsync) Display.setVSyncEnabled(enableVsync.value);
 		if(option == fancyGraphics) mc.renderGlobal.loadRenderers();
 		if(option == ambientOcclusion) mc.renderGlobal.loadRenderers();
 		if(option == advancedOpenGL) mc.renderGlobal.loadRenderers();
diff --git a/src/main/java/net/minecraft/client/player/controller/PlayerController.java b/src/main/java/net/minecraft/client/player/controller/PlayerController.java
index c6f09f4ca..d03fcf2b3 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerController.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerController.java
@@ -36,7 +36,7 @@ public abstract class PlayerController {
 			swingItem(true);
 			
 			ItemStack heldItem = mc.thePlayer.getCurrentEquippedItem();
-			if(heldItem != null && heldItem.getItem().hasTag(ItemTags.preventCreativeMining)) {
+			if(heldItem != null && heldItem.getItem().hasTag(ItemTags.PREVENT_CREATIVE_MINING)) {
 				return;
 			}
 			
diff --git a/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java b/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java
index 74ee6bf42..8a72d7ce2 100644
--- a/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java
@@ -22,6 +22,7 @@ public class TileEntityRenderDispatcher
         renderers.put(TileEntityMobSpawner.class, new TileEntityRendererMobSpawner());
         renderers.put(TileEntityPistonMoving.class, new TileEntityRendererPiston());
         renderers.put(TileEntityFlowerJar.class, new TileEntityRendererFlowerJar());
+        renderers.put(TileEntityMeshGold.class, new TileEntityRendererMesh());
 
         for (TileEntityRenderer<?> tileEntityRenderer : renderers.values())
         {
diff --git a/src/main/java/net/minecraft/client/render/WorldRenderer.java b/src/main/java/net/minecraft/client/render/WorldRenderer.java
index 664a29451..b33707119 100644
--- a/src/main/java/net/minecraft/client/render/WorldRenderer.java
+++ b/src/main/java/net/minecraft/client/render/WorldRenderer.java
@@ -489,21 +489,12 @@ public class WorldRenderer
         int mouseX = (Mouse.getX() * width) / mc.resolution.width;
         int mouseY = height - (Mouse.getY() * height) / mc.resolution.height - 1;
         int c = 200;
-        if(mc.gameSettings.limitFramerate.value == 1) // Balanced
-        {
-            c = 120;
-        }
-        if(mc.gameSettings.limitFramerate.value == 2) // Power saver
-        {
-            c = 40;
-        }
-        if(mc.gameSettings.limitFramerate.value == 3) // VSync
+        if(mc.gameSettings.enableVsync.value) // VSync
         {
             if(mc.gameWindow instanceof GameWindowLWJGL2){
-                c = ((GameWindowLWJGL2) mc.gameWindow).defaultDisplayMode.getFrequency();
+                c = ((GameWindowLWJGL2) mc.gameWindow).defaultDisplayMode.getFrequency() + 20; // Cap fps when minimized
             }
-        }
-        if(mc.gameSettings.limitFramerate.value == 0 && mc.gameSettings.customFpsLimit.value > 0){
+        } else {
             c = mc.gameSettings.customFpsLimit.value;
         }
         GL11.glViewport(0, 0, mc.resolution.width, mc.resolution.height);
@@ -513,7 +504,7 @@ public class WorldRenderer
             mc.render.beginRenderWorld(partialTick);
             
             Debug.change("world");
-            if(mc.gameSettings.limitFramerate.value == 0 && mc.gameSettings.customFpsLimit.value == 0) // Max FPS
+            if(!mc.gameSettings.enableVsync.value && mc.gameSettings.customFpsLimit.value == 0) // Max FPS
             {
                 renderWorld(partialTick, 0);
             }
@@ -522,7 +513,7 @@ public class WorldRenderer
                 renderWorld(partialTick, systemTime + (nsPerSecond / c));
             }
             Debug.change("misc");
-            if(mc.gameSettings.limitFramerate.value != 0 || mc.gameSettings.customFpsLimit.value > 0) // Power saver
+            if(mc.gameSettings.enableVsync.value || mc.gameSettings.customFpsLimit.value > 0) // Power saver
             {
                 Debug.change("sleep");
                 long l1 = ((systemTime + (nsPerSecond / c)) - System.nanoTime()) / 1_000_000;
@@ -553,7 +544,7 @@ public class WorldRenderer
             GL11.glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
             GL11.glLoadIdentity();
             setupScaledResolution();
-            if(mc.gameSettings.limitFramerate.value != 0 || mc.gameSettings.customFpsLimit.value > 0)
+            if(mc.gameSettings.enableVsync.value || mc.gameSettings.customFpsLimit.value > 0)
             {
                 Debug.change("sleep");
                 long l2 = ((systemTime + (long)(0x3b9aca00 / c)) - System.nanoTime()) / 0xf4240L;
diff --git a/src/main/java/net/minecraft/client/render/block/color/BlockColorDispatcher.java b/src/main/java/net/minecraft/client/render/block/color/BlockColorDispatcher.java
index b8cc99440..9ec82367d 100644
--- a/src/main/java/net/minecraft/client/render/block/color/BlockColorDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/block/color/BlockColorDispatcher.java
@@ -29,6 +29,7 @@ public final class BlockColorDispatcher
         addDispatch(Block.leavesOak, new BlockColorLeavesOak());
         addDispatch(Block.leavesPine, new BlockColorLeaves("pine"));
         addDispatch(Block.leavesShrub, new BlockColorLeaves("shrub"));
+        addDispatch(Block.leavesCaatinga, new BlockColorLeaves("caatinga"));
         addDispatch(Block.mossStone, new BlockColorGrass());
         addDispatch(Block.mossBasalt, new BlockColorGrass());
         addDispatch(Block.mossLimestone, new BlockColorGrass());
diff --git a/src/main/java/net/minecraft/client/render/block/color/BlockColorTallGrass.java b/src/main/java/net/minecraft/client/render/block/color/BlockColorTallGrass.java
index f13169366..901165a44 100644
--- a/src/main/java/net/minecraft/client/render/block/color/BlockColorTallGrass.java
+++ b/src/main/java/net/minecraft/client/render/block/color/BlockColorTallGrass.java
@@ -3,7 +3,7 @@ package net.minecraft.client.render.block.color;
 import net.minecraft.core.block.Block;
 import net.minecraft.client.render.colorizer.ColorizerGrass;
 import net.minecraft.core.world.World;
-import net.minecraft.core.world.noise.ImprovedNoise;
+import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.season.Season;
 import net.minecraft.core.world.season.Seasons;
 import org.lwjgl.Sys;
@@ -35,7 +35,25 @@ public class BlockColorTallGrass
         int baseGrassColor = ColorizerGrass.getGrassColor(localTemperature, localHumidity);
         if (world != null)
         {
-        	int blockBelow = world.getBlockId(x, y -1, z);
+            if(world.getBlockBiome(x, y - 1, z) == Biomes.OVERWORLD_CAATINGA){
+
+                Season season = world.seasonManager.getCurrentSeason();
+                if (season != null)
+                {
+                    boolean ishumid = (season == Seasons.OVERWORLD_WINTER || season == Seasons.OVERWORLD_WINTER_ENDLESS || season == Seasons.OVERWORLD_FALL);
+                    float progress = world.seasonManager.getSeasonProgress();
+
+                    if(ishumid){
+                        baseGrassColor = ColorizerGrass.getGrassColor(1.0, 1.0);
+                    } else {
+                        baseGrassColor = ColorizerGrass.getGrassColor(1.0, 0.0);
+                    }
+                    baseGrassColor = season.modifyGrassColorizer(baseGrassColor, progress > 0.5f ? world.seasonManager.getNextSeason() : world.seasonManager.getPreviousSeason(), Math.abs(progress - 0.5f));
+                }
+                return baseGrassColor;
+            }
+
+        	int blockBelow = world.getBlockId(x, y - 1, z);
             if(blockBelow == Block.grassScorched.id || blockBelow == Block.dirtScorched.id || blockBelow == Block.dirtScorchedRich.id ){
 
                 return 0xffcc58;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelBrazier.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelBrazier.java
new file mode 100644
index 000000000..9cc068533
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelBrazier.java
@@ -0,0 +1,112 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.block.color.BlockColorDispatcher;
+import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessalator.Tessellator;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockBrazier;
+import net.minecraft.core.block.BlockFire;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.WorldSource;
+import org.lwjgl.opengl.GL11;
+
+public class BlockModelBrazier<T extends BlockBrazier>
+    extends BlockModelStandard<T> {
+    protected IconCoordinate sideTexture = TextureRegistry.getTexture("minecraft:block/brazier_side");
+    protected IconCoordinate baseTexture = TextureRegistry.getTexture("minecraft:block/brazier_base");
+    protected BlockModelStandard<Block> fireModel = new BlockModelFire<>(Block.fire, true).withTextures("minecraft:block/fire");
+
+    public BlockModelBrazier(Block block) {
+        super(block);
+    }
+
+    @Override
+    public boolean render(Tessellator tessellator, int x, int y, int z) {
+        tessellator.setColorOpaque_I(0xFFFFFF);
+
+        renderBlocks.enableAO = true;
+        renderBlocks.cache.setupCache(block, renderBlocks.blockAccess, x, y, z);
+        renderSide(tessellator, block, x, y, z, Side.NORTH, 0);
+        renderSide(tessellator, block, x, y, z + 1, Side.NORTH, 0);
+        renderSide(tessellator, block, x, y, z, Side.SOUTH, 0);
+        renderSide(tessellator, block, x, y, z - 1, Side.SOUTH, 0);
+        renderSide(tessellator, block, x, y, z, Side.EAST, 0);
+        renderSide(tessellator, block, x - 1, y, z, Side.EAST, 0);
+        renderSide(tessellator, block, x, y, z, Side.WEST, 0);
+        renderSide(tessellator, block, x + 1, y, z, Side.WEST, 0);
+        renderSide(tessellator, block, x, y, z, Side.BOTTOM, 0);
+        renderSide(tessellator, block, x, y - 1, z, Side.TOP, 0);
+        renderBlocks.enableAO = false;
+
+        if (block.isBurning()) {
+            fireModel.render(tessellator, x, y, z);
+        }
+
+        return true;
+    }
+
+    @Override
+    public void renderBlockOnInventory(Tessellator tessellator, int metadata, float brightness, float alpha) {
+        GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+
+        GL11.glColor4f(brightness, brightness, brightness, alpha);
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, -1F, 0.0F);
+        renderBottomFace(tessellator, block, 0.0D, 0.0D, 0.0D, baseTexture);
+        tessellator.draw();
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, 1.0F, 0.0F);
+        renderTopFace(tessellator, block, 0.0D, -1.0D, 0.0D, baseTexture);
+        tessellator.draw();
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, 0.0F, -1F);
+        renderNorthFace(tessellator, block, 0.0D, 0.0D, 0.0D, sideTexture);
+        tessellator.draw();
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, 0.0F, -1F);
+        renderNorthFace(tessellator, block, 0.0D, 0.0D, 1.0D, sideTexture);
+        tessellator.draw();
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, 0.0F, 1.0F);
+        renderSouthFace(tessellator, block, 0.0D, 0.0D, 0.0D, sideTexture);
+        tessellator.draw();
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, 0.0F, 1.0F);
+        renderSouthFace(tessellator, block, 0.0D, 0.0D, -1.0D, sideTexture);
+        tessellator.draw();
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(-1F, 0.0F, 0.0F);
+        renderWestFace(tessellator, block, 0.0D, 0.0D, 0.0D, sideTexture);
+        tessellator.draw();
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(-1F, 0.0F, 0.0F);
+        renderWestFace(tessellator, block, 1.0D, 0.0D, 0.0D, sideTexture);
+        tessellator.draw();
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(1.0F, 0.0F, 0.0F);
+        renderEastFace(tessellator, block, 0.0D, 0.0D, 0.0D, sideTexture);
+        tessellator.draw();
+
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(1.0F, 0.0F, 0.0F);
+        renderEastFace(tessellator, block, -1.0D, 0.0D, 0.0D, sideTexture);
+        tessellator.draw();
+
+        GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+    }
+
+    @Override
+    public boolean shouldSideBeRendered(WorldSource blockAccess, int x, int y, int z, int side) {
+        return true;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
index beedcc733..de5da1b0b 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
@@ -80,6 +80,7 @@ public class BlockModelDispatcher
         addDispatch(new BlockModelStandard<>(Block.bookshelfPlanksOak).withTextures("minecraft:block/planks_oak", "minecraft:block/bookshelf_side"));
 
         addDispatch(new BlockModelWool<>(Block.wool));
+        addDispatch(new BlockModelRope<>(Block.rope).withTextures("minecraft:block/rope"));
 
         addDispatch(new BlockModelStandard<>(Block.brickClay).withTextures("minecraft:block/brick_clay"));
         addDispatch(new BlockModelStandard<>(Block.brickStonePolished).withTextures("minecraft:block/brick_polished_stone"));
@@ -185,6 +186,7 @@ public class BlockModelDispatcher
         addDispatch(new BlockModelLeaves<>(Block.leavesShrub, "minecraft:block/leaves_shrub"));
         addDispatch(new BlockModelCherryLeavesBloom<>(Block.leavesCherryFlowering));
         addDispatch(new BlockModelCacaoLeaves<>(Block.leavesCacao));
+        addDispatch(new BlockModelLeaves<>(Block.leavesCaatinga, "minecraft:block/leaves_caatinga"));
 
         addDispatch(new BlockModelCrossedSquares<>(Block.saplingOak).withTextures("minecraft:block/sapling_oak"));
         addDispatch(new BlockModelCrossedSquares<>(Block.saplingOakRetro).withTextures("minecraft:block/sapling_oak_retro"));
@@ -293,6 +295,7 @@ public class BlockModelDispatcher
         addDispatch(new BlockModelTrapDoor<>(Block.trapdoorPlanksOak).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/trapdoor_planks_oak_side"));
         addDispatch(new BlockModelTrapDoor<>(Block.trapdoorIron).withTextures("minecraft:block/trapdoor_iron_top", "minecraft:block/trapdoor_iron_side"));
         addDispatch(new BlockModelTrapDoor<>(Block.trapdoorGlass).withTextures("minecraft:block/glass", "minecraft:block/trapdoor_glass_side"));
+        addDispatch(new BlockModelTrapDoorPainted<>(Block.trapdoorPlanksOakPainted));
 
         addDispatch(new BlockModelStandard<>(Block.tnt).withTextures("minecraft:block/tnt_top", "minecraft:block/tnt_bottom", "minecraft:block/tnt_side"));
 
@@ -300,14 +303,21 @@ public class BlockModelDispatcher
         addDispatch(new BlockModelDoor<>(Block.doorPlanksOakTop).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/door_planks_oak_top"));
         addDispatch(new BlockModelDoor<>(Block.doorIronBottom).withTextures("minecraft:block/trapdoor_iron_top", "minecraft:block/door_iron_bottom"));
         addDispatch(new BlockModelDoor<>(Block.doorIronTop).withTextures("minecraft:block/trapdoor_iron_top", "minecraft:block/door_iron_top"));
+        addDispatch(new BlockModelDoorPainted<>(Block.doorPlanksOakPaintedBottom, false).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/door_planks_oak_bottom"));
+        addDispatch(new BlockModelDoorPainted<>(Block.doorPlanksOakPaintedTop, true).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/door_planks_oak_top"));
+        addDispatch(new BlockModelDoorGlass<>(Block.doorGlassBottom).withTextures("minecraft:block/glass", "minecraft:block/door_glass_bottom"));
+        addDispatch(new BlockModelDoorGlass<>(Block.doorGlassTop).withTextures("minecraft:block/glass", "minecraft:block/door_glass_top"));
 
         addDispatch(new BlockModelTransparent<>(Block.mesh, true).withTextures("minecraft:block/mesh"));
+        addDispatch(new BlockModelTransparent<>(Block.meshGold, true).withTextures("minecraft:block/mesh_gold"));
 
         addDispatch(new BlockModelBed<>(Block.bed));
         addDispatch(new BlockModelSeat<>(Block.seat).withTextures("minecraft:block/seat_top", "minecraft:block/planks_oak", "minecraft:block/seat_side"));
 
         addDispatch(new BlockModelCrossedSquares<>(Block.cobweb).withTextures("minecraft:block/cobweb"));
         addDispatch(new BlockModelFire<>(Block.fire).withTextures("minecraft:block/fire"));
+        addDispatch(new BlockModelBrazier<>(Block.brazierInactive).withTextures("minecraft:block/brazier_base", "minecraft:block/brazier_side"));
+        addDispatch(new BlockModelBrazier<>(Block.brazierActive).withTextures("minecraft:block/brazier_base", "minecraft:block/brazier_side"));
 
         addDispatch(new BlockModelStandard<>(Block.mobspawner).withTextures("minecraft:block/mobspawner"));
         addDispatch(new BlockModelTransparent<>(Block.mobspawnerDeactivated, true).withTextures("minecraft:block/mobspawner"));
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelDoorGlass.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelDoorGlass.java
new file mode 100644
index 000000000..d52dce33a
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelDoorGlass.java
@@ -0,0 +1,15 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockDoor;
+import net.minecraft.core.util.helper.Side;
+
+public class BlockModelDoorGlass<T extends BlockDoor> extends BlockModelDoor<T>{
+    public BlockModelDoorGlass(Block block) {
+        super(block);
+    }
+    @Override
+    protected boolean shouldFlipTexture(Side side, int meta){
+        return false;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelDoorPainted.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelDoorPainted.java
new file mode 100644
index 000000000..f2e521150
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelDoorPainted.java
@@ -0,0 +1,37 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockDoor;
+import net.minecraft.core.item.ItemDye;
+import net.minecraft.core.util.helper.Side;
+
+public class BlockModelDoorPainted<T extends BlockDoor> extends BlockModelDoor<T> {
+    public static final IconCoordinate[] doorBottomTextures = new IconCoordinate[16];
+    public static final IconCoordinate[] doorTopTextures = new IconCoordinate[16];
+
+    static {
+        for(int i = 0; i < 16; i++) {
+            doorTopTextures[i] = TextureRegistry.getTexture("minecraft:block/door_planks_oak_" + ItemDye.dyeColors[15 - i] + "_top");
+            doorBottomTextures[i] = TextureRegistry.getTexture("minecraft:block/door_planks_oak_" + ItemDye.dyeColors[15 - i] + "_bottom");
+        }
+    }
+    private final boolean isTop;
+    public BlockModelDoorPainted(Block block, boolean isTop) {
+        super(block);
+        this.isTop = isTop;
+    }
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
+    {
+        int sideId = side.getId();
+        int color = (data >> 4) & 0xF;
+        if (sideId < 2){
+            return BlockModelTrapDoorPainted.topTextures[color];
+        } else if (isTop){
+            return doorTopTextures[color];
+        }
+        return doorBottomTextures[color];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
index 15bc3f123..4c2a7e16d 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
@@ -7,8 +7,14 @@ import net.minecraft.core.block.BlockFire;
 import net.minecraft.core.util.helper.Side;
 
 public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
+    private final boolean overrideRender;
     public BlockModelFire(Block block) {
+        this(block, false);
+    }
+
+    public BlockModelFire(Block block, boolean overrideRender) {
         super(block);
+        this.overrideRender = overrideRender;
     }
 
     @Override
@@ -26,7 +32,7 @@ public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
         double vMin = tex.getIconVMin();
         double vMax = tex.getIconVMax();
         final float yOffset = 1.4F;
-        if(renderBlocks.blockAccess.isBlockNormalCube(x, y - 1, z) || ((BlockFire)Block.fire).canBlockCatchFire(renderBlocks.blockAccess, x, y - 1, z))
+        if(overrideRender || renderBlocks.blockAccess.isBlockNormalCube(x, y - 1, z) || ((BlockFire)Block.fire).canBlockCatchFire(renderBlocks.blockAccess, x, y - 1, z))
         {
             double d8 = (double)x + 0.5D + 0.2D;
             double d9 = ((double)x + 0.5D) - 0.2D;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelLayer.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelLayer.java
index 8580d94a6..a39b8256c 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelLayer.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelLayer.java
@@ -1,13 +1,20 @@
 package net.minecraft.client.render.block.model;
 
+import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.world.WorldSource;
+import org.lwjgl.opengl.GL11;
 
 public class BlockModelLayer<T extends Block> extends BlockModelStandard<T> {
     public BlockModelLayer(Block block) {
         super(block);
         withCustomItemBounds(0.0f, 0.0f, 0.0f, 1.0f, 2 / 16F, 1.0f);
     }
+    @Override
+    public void renderBlockOnInventory(Tessellator tessellator, int metadata, float brightness, float alpha) {
+        GL11.glTranslatef(0, 0.25f, 0);
+        super.renderBlockOnInventory(tessellator, metadata, brightness, alpha);
+    }
 
     @Override
     public boolean shouldSideBeRendered(WorldSource blockAccess, int x, int y, int z, int side, int meta)
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelRope.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelRope.java
new file mode 100644
index 000000000..a7d363cd2
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelRope.java
@@ -0,0 +1,74 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessalator.Tessellator;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockRope;
+import net.minecraft.core.world.World;
+
+public class BlockModelRope<T extends BlockRope>
+extends BlockModelStandard<T> {
+    public BlockModelRope(Block block) {
+        super(block);
+    }
+
+    @Override
+    public boolean render(Tessellator tessellator, int x, int y, int z) {
+        World world = renderBlocks.world;
+        boolean hasBlockNegX = world.getBlockId(x - 1, y, z) == block.id;
+        boolean hasBlockPosX = world.getBlockId(x + 1, y, z) == block.id;
+        boolean hasBlockNegY = world.getBlockId(x, y - 1, z) == block.id;
+        boolean hasBlockPosY = world.getBlockId(x, y + 1, z) == block.id || world.isBlockOpaqueCube(x, y + 1, z);
+        boolean hasBlockNegZ = world.getBlockId(x, y, z - 1) == block.id;
+        boolean hasBlockPosZ = world.getBlockId(x, y, z + 1) == block.id;
+
+        boolean drawKnot =  !(hasBlockNegX && hasBlockPosX && !hasBlockNegY && !hasBlockPosY && !hasBlockNegZ && !hasBlockPosZ) &&
+            !(!hasBlockNegX && !hasBlockPosX && hasBlockNegY && hasBlockPosY && !hasBlockNegZ && !hasBlockPosZ) &&
+            !(!hasBlockNegX && !hasBlockPosX && !hasBlockNegY && !hasBlockPosY && hasBlockNegZ && hasBlockPosZ);
+
+        block.setBlockBounds(0, 0, 0, 1, 1, 1);
+
+        if (drawKnot)
+        {
+            block.setBlockBounds(0.5f - (2 / 16f), 0.5f - (2 / 16f), 0.5f - (2 / 16f), 0.5f + (2 / 16f), 0.5f + (2 / 16f), 0.5f + (2 / 16f));
+            renderStandardBlock(tessellator, block, x, y, z);
+        }
+
+        if (hasBlockPosY)
+        {
+            block.setBlockBounds(0.5f - (1 / 16f), 0.5f, 0.5f - (1 / 16f), 0.5f + (1 / 16f), 1, 0.5f + (1 / 16f));
+            renderStandardBlock(tessellator, block, x, y, z);
+        }
+        if (hasBlockNegY)
+        {
+            block.setBlockBounds(0.5f - (1 / 16f), 0, 0.5f - (1 / 16f), 0.5f + (1 / 16f), 0.5f, 0.5f + (1 / 16f));
+            renderStandardBlock(tessellator, block, x, y, z);
+        }
+        if (hasBlockPosX)
+        {
+            block.setBlockBounds(0.5f, 0.5f - (1 / 16f), 0.5f - (1 / 16f), 1, 0.5f + (1 / 16f), 0.5f + (1 / 16f));
+            renderStandardBlock(tessellator, block, x, y, z);
+        }
+        if (hasBlockNegX)
+        {
+            block.setBlockBounds(0, 0.5f - (1 / 16f), 0.5f - (1 / 16f), 0.5f, 0.5f + (1 / 16f), 0.5f + (1 / 16f));
+            renderStandardBlock(tessellator, block, x, y, z);
+        }
+        if (hasBlockPosZ)
+        {
+            block.setBlockBounds(0.5f - (1 / 16f), 0.5f - (1 / 16f), 0.5f, 0.5f + (1 / 16f), 0.5f + (1 / 16f), 1);
+            renderStandardBlock(tessellator, block, x, y, z);
+        }
+        if (hasBlockNegZ)
+        {
+            block.setBlockBounds(0.5f - (1 / 16f), 0.5f - (1 / 16f), 0f, 0.5f + (1 / 16f), 0.5f + (1 / 16f), 0.5f);
+            renderStandardBlock(tessellator, block, x, y, z);
+        }
+
+        block.setBlockBounds(0, 0, 0, 1, 1, 1);
+
+
+        return true;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelTrapDoorPainted.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelTrapDoorPainted.java
new file mode 100644
index 000000000..f690e2511
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelTrapDoorPainted.java
@@ -0,0 +1,43 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockTrapDoor;
+import net.minecraft.core.item.ItemDye;
+import net.minecraft.core.util.helper.Axis;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.util.helper.Sides;
+
+public class BlockModelTrapDoorPainted<T extends Block> extends BlockModelTrapDoor<T> {
+    public static final IconCoordinate[] topTextures = new IconCoordinate[16];
+    public static final IconCoordinate[] sideTextures = new IconCoordinate[16];
+
+    static {
+        for(int i = 0; i < 16; i++) {
+            topTextures[i] = TextureRegistry.getTexture("minecraft:block/trapdoor_planks_oak_" + ItemDye.dyeColors[15 - i] + "_top");
+            sideTextures[i] = TextureRegistry.getTexture("minecraft:block/trapdoor_planks_oak_" + ItemDye.dyeColors[15 - i] + "_side");
+        }
+    }
+    public BlockModelTrapDoorPainted(Block block) {
+        super(block);
+    }
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
+    {
+        int color = (data >> 4) & 0xF;
+        int orientation = data & 3;
+        if(BlockTrapDoor.isTrapdoorOpen(data)) {
+            int index = Sides.orientationLookUpTrapdoorOpen[6 * orientation + side.getId()];
+            if (index < 2) return topTextures[color];
+            return sideTextures[color];
+        } else {
+            if(side.getAxis() == Axis.Y) {
+                return topTextures[color];
+            }else {
+                return sideTextures[color];
+            }
+        }
+
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/colorizer/ColorProperties.java b/src/main/java/net/minecraft/client/render/colorizer/ColorProperties.java
index 704ad407c..10a68cb6e 100644
--- a/src/main/java/net/minecraft/client/render/colorizer/ColorProperties.java
+++ b/src/main/java/net/minecraft/client/render/colorizer/ColorProperties.java
@@ -24,6 +24,7 @@ public class ColorProperties
         registerLeavesColor("cherry", prop);
         registerLeavesColor("eucalyptus", prop);
         registerLeavesColor("shrub", prop);
+        registerLeavesColor("caatinga", prop);
         registerLeavesColor("cocoa", prop);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/entity/BobberRenderer.java b/src/main/java/net/minecraft/client/render/entity/BobberRenderer.java
index 864b6ad21..52b258a1b 100644
--- a/src/main/java/net/minecraft/client/render/entity/BobberRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/BobberRenderer.java
@@ -49,29 +49,29 @@ public class BobberRenderer extends EntityRenderer<EntityBobber>
         tessellator.draw();
         GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
         GL11.glPopMatrix();
-        if(entity.angler != null)
+        if(entity.player != null)
         {
-            float f9 = ((entity.angler.yRotO + (entity.angler.yRot - entity.angler.yRotO) * f1) * MathHelper.PI) / 180F;
+            float f9 = ((entity.player.yRotO + (entity.player.yRot - entity.player.yRotO) * f1) * MathHelper.PI) / 180F;
             double d3 = MathHelper.sin(f9);
             double d5 = MathHelper.cos(f9);
-            float f11 = entity.angler.getSwingProgress(f1);
+            float f11 = entity.player.getSwingProgress(f1);
             float f12 = MathHelper.sin(MathHelper.sqrt_float(f11) * MathHelper.PI);
             Vec3d vec3d = Vec3d.createVector(-0.5D, 0.03D, 0.8D);
-            vec3d.rotateAroundX((-(entity.angler.xRotO + (entity.angler.xRot - entity.angler.xRotO) * f1) * MathHelper.PI) / 180F);
-            vec3d.rotateAroundY((-(entity.angler.yRotO + (entity.angler.yRot - entity.angler.yRotO) * f1) * MathHelper.PI) / 180F);
+            vec3d.rotateAroundX((-(entity.player.xRotO + (entity.player.xRot - entity.player.xRotO) * f1) * MathHelper.PI) / 180F);
+            vec3d.rotateAroundY((-(entity.player.yRotO + (entity.player.yRot - entity.player.yRotO) * f1) * MathHelper.PI) / 180F);
             vec3d.rotateAroundY(f12 * 0.5F);
             vec3d.rotateAroundX(-f12 * 0.7F);
-            double d7 = entity.angler.xo + (entity.angler.x - entity.angler.xo) * (double)f1 + vec3d.xCoord;
-            double d8 = entity.angler.yo + (entity.angler.y - entity.angler.yo) * (double)f1 + vec3d.yCoord;
-            double d9 = entity.angler.zo + (entity.angler.z - entity.angler.zo) * (double)f1 + vec3d.zCoord;
+            double d7 = entity.player.xo + (entity.player.x - entity.player.xo) * (double)f1 + vec3d.xCoord;
+            double d8 = entity.player.yo + (entity.player.y - entity.player.yo) * (double)f1 + vec3d.yCoord;
+            double d9 = entity.player.zo + (entity.player.z - entity.player.zo) * (double)f1 + vec3d.zCoord;
             if(renderDispatcher.gameSettings.thirdPersonView.value > 0)
             {
-                float f10 = ((entity.angler.prevRenderYawOffset + (entity.angler.renderYawOffset - entity.angler.prevRenderYawOffset) * f1) * MathHelper.PI) / 180F;
+                float f10 = ((entity.player.prevRenderYawOffset + (entity.player.renderYawOffset - entity.player.prevRenderYawOffset) * f1) * MathHelper.PI) / 180F;
                 double d4 = MathHelper.sin(f10);
                 double d6 = MathHelper.cos(f10);
-                d7 = (entity.angler.xo + (entity.angler.x - entity.angler.xo) * (double)f1) - d6 * 0.35D - d4 * 0.85D;
-                d8 = (entity.angler.yo + (entity.angler.y - entity.angler.yo) * (double)f1) - 0.45D;
-                d9 = ((entity.angler.zo + (entity.angler.z - entity.angler.zo) * (double)f1) - d4 * 0.35D) + d6 * 0.85D;
+                d7 = (entity.player.xo + (entity.player.x - entity.player.xo) * (double)f1) - d6 * 0.35D - d4 * 0.85D;
+                d8 = (entity.player.yo + (entity.player.y - entity.player.yo) * (double)f1) - 0.45D;
+                d9 = ((entity.player.zo + (entity.player.z - entity.player.zo) * (double)f1) - d4 * 0.35D) + d6 * 0.85D;
             }
             double d10 = entity.xo + (entity.x - entity.xo) * (double)f1;
             double d11 = entity.yo + (entity.y - entity.yo) * (double)f1 + 0.25D;
diff --git a/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java b/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java
index 247f66636..45e614f14 100644
--- a/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java
@@ -1,5 +1,6 @@
 package net.minecraft.client.render.entity;
 
+import net.minecraft.client.Minecraft;
 import java.util.Random;
 
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
@@ -8,6 +9,7 @@ import org.lwjgl.opengl.GL11;
 
 import net.minecraft.core.block.Block;
 import net.minecraft.client.render.RenderBlocks;
+import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.tessalator.TessellatorStandard;
@@ -25,7 +27,7 @@ import static org.lwjgl.opengl.GL11.glPushMatrix;
 
 public class ItemEntityRenderer extends EntityRenderer<EntityItem>
 {
-	private final RenderBlocks renderBlocks;
+	public final RenderBlocks renderBlocks;
 	private final Random random;
 	public boolean useColor;
 
@@ -46,6 +48,8 @@ public class ItemEntityRenderer extends EntityRenderer<EntityItem>
 	}
 
 	public void doRender(Tessellator tessellator, final EntityItem entity, final double x, final double y, final double z, final float yaw, final float partialTick) {
+		final Minecraft mc = Minecraft.getMinecraft(this);
+		float brightness = entity.getBrightness(partialTick);
 		random.setSeed(187L);
 		final ItemStack itemstack = entity.item;
 		if(itemstack == null) {
@@ -56,8 +60,8 @@ public class ItemEntityRenderer extends EntityRenderer<EntityItem>
 			return;
 		}
 		glPushMatrix();
-		final float bobbingOffset = MathHelper.sin((entity.age + partialTick) / 10F + entity.field_804_d) * 0.1F + 0.1F;
-		final float f3 = (float) Math.toDegrees(((entity.age + partialTick) / 20F + entity.field_804_d));
+		final float bobbingOffset = MathHelper.sin((entity.age + partialTick) / 10F + entity.initialRotation) * 0.1F + 0.1F;
+		final float f3 = (float) Math.toDegrees(((entity.age + partialTick) / 20F + entity.initialRotation));
 		byte renderCount = 1;
 		if (entity.item.stackSize > 1) {
 			renderCount = 2;
@@ -70,7 +74,8 @@ public class ItemEntityRenderer extends EntityRenderer<EntityItem>
 		}
 		GL11.glTranslatef((float) x, (float) y + bobbingOffset, (float) z);
 		GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
-		ItemModelDispatcher.getInstance().getDispatch(item).renderAsItemEntity(TessellatorStandard.instance, entity, renderBlocks, random, itemstack, renderCount, f3, partialTick);
+		BlockModel.setRenderBlocks(renderBlocks);
+		ItemModelDispatcher.getInstance().getDispatch(item).renderAsItemEntity(TessellatorStandard.instance, entity, random, itemstack, renderCount, f3, brightness, partialTick);
 		GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
 		GL11.glPopMatrix();
 	}
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModel.java b/src/main/java/net/minecraft/client/render/item/model/ItemModel.java
index a136b6bd8..e73add089 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModel.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModel.java
@@ -1,17 +1,17 @@
 package net.minecraft.client.render.item.model;
 
+import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
-import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -22,9 +22,11 @@ public abstract class ItemModel {
     }
     public abstract void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, EntityPlayer player, ItemStack stack, float partialTick);
     public void renderItem(Tessellator tessellator, ItemRenderer renderer, EntityLiving entityLiving, ItemStack itemStack){
-        renderItem(tessellator, renderer, entityLiving, itemStack, true);
+        final Minecraft mc = Minecraft.getMinecraft(this);
+        float brightness = entityLiving.getBrightness(1.0f);
+        renderItem(tessellator, renderer, itemStack, entityLiving, brightness, true);
     }
-    public abstract void renderItem(Tessellator tessellator, ItemRenderer renderer, Entity entity, ItemStack itemstack, boolean handheldTransform);
+    public abstract void renderItem(Tessellator tessellator, ItemRenderer renderer, ItemStack itemstack, @Nullable Entity entity, float brightness, boolean handheldTransform);
     public abstract void renderItemThirdPerson(Tessellator tessellator, ItemRenderer renderer, Entity entity, ItemStack itemstack, boolean handheldTransform);
     public void renderItemIntoGui(Tessellator tessellator, FontRenderer fontrenderer, RenderEngine renderengine, ItemStack itemstack, int x, int y, float alpha) {
         renderItemIntoGui(tessellator, fontrenderer, renderengine, itemstack, x, y, 1.0f, alpha);
@@ -35,6 +37,7 @@ public abstract class ItemModel {
     }
 
     public abstract void renderItemOverlayIntoGUI(Tessellator tessellator, FontRenderer fontrenderer, RenderEngine renderengine, ItemStack itemstack, int x, int y, String override, float alpha);
-    public abstract void renderAsItemEntity(Tessellator tessellator, EntityItem entity, RenderBlocks renderBlocks, Random random, ItemStack itemstack, int renderCount, float yaw, float partialTick);
-    public abstract IconCoordinate getIcon(Entity entity, ItemStack itemStack);
+    public abstract void renderAsItemEntity(Tessellator tessellator, @Nullable Entity entity, Random random, ItemStack itemstack, int renderCount, float yaw, float brightness, float partialTick);
+    public abstract void renderItemInWorld(Tessellator tessellator, Entity entity, ItemStack itemStack, float brightness, float alpha, boolean worldTransform);
+    public abstract IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack);
 }
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
index e05cca6d1..772fbd1e0 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
@@ -3,7 +3,6 @@ package net.minecraft.client.render.item.model;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
-import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.RenderEngine;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.client.render.block.model.BlockModel;
@@ -12,12 +11,12 @@ import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.block.ItemBlock;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
+import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
 import java.util.Random;
@@ -35,6 +34,10 @@ public class ItemModelBlock extends ItemModelStandard {
     }
     @Override
     public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, EntityPlayer player, ItemStack stack, float partialTick) {
+        final Minecraft mc = Minecraft.getMinecraft(this);
+        float brightness = player.getBrightness(1.0f);
+        if (mc.fullbright || itemfullBright) brightness = 1.0f;
+
         final float distanceScale = 0.8F; // Relates to how close the held item renders from the camera
         final float swingProgress = player.getSwingProgress(partialTick);
         final float animationProgress2 = MathHelper.sin(swingProgress * MathHelper.PI);
@@ -57,22 +60,19 @@ public class ItemModelBlock extends ItemModelStandard {
         {
             GL11.glRotatef(-90F, 0.0F, 1.0F, 0.0F);
         }
-        renderItem(tessellator, renderer,player, stack, true);
+        renderItem(tessellator, renderer, stack, player, brightness, true);
     }
     @Override
-    public void renderItem(Tessellator tessellator, ItemRenderer renderer, Entity entity, ItemStack itemstack, boolean handheldTransform) {
+    public void renderItem(Tessellator tessellator, ItemRenderer renderer, ItemStack itemstack, @Nullable Entity entity, float brightness, boolean handheldTransform) {
         if(BlockModelDispatcher.getInstance().getDispatch(Block.blocksList[itemstack.itemID]).shouldItemRender3d())
         {
-            Minecraft mc = Minecraft.getMinecraft(this);
             GL11.glEnable(GL_BLEND);
             GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
             TextureRegistry.blockAtlas.bindTexture();
-            float brightness = entity.getBrightness(1.0f);
-            if (mc.fullbright || itemfullBright) brightness = 1.0f;
             BlockModelDispatcher.getInstance().getDispatch(Block.blocksList[itemstack.itemID]).renderBlockOnInventory(tessellator, itemstack.getMetadata(), brightness);
             GL11.glDisable(GL_BLEND);
         } else {
-            super.renderItem(tessellator, renderer, entity, itemstack, handheldTransform);
+            super.renderItem(tessellator, renderer, itemstack, entity, brightness, handheldTransform);
         }
     }
     @Override
@@ -124,11 +124,10 @@ public class ItemModelBlock extends ItemModelStandard {
         GL11.glDisable(GL_BLEND);
     }
     @Override
-    public void renderAsItemEntity(Tessellator tessellator, EntityItem entity, RenderBlocks renderBlocks, Random random, ItemStack itemstack, int renderCount, float yaw, float partialTick) {
+    public void renderAsItemEntity(Tessellator tessellator, @Nullable Entity entity, Random random, ItemStack itemstack, int renderCount, float yaw, float brightness, float partialTick) {
         if (Block.blocksList[itemstack.itemID] != null && BlockModelDispatcher.getInstance().getDispatch(Block.blocksList[itemstack.itemID]).shouldItemRender3d()) {
             GL11.glRotatef(yaw, 0.0F, 1.0F, 0.0F);
             TextureRegistry.blockAtlas.bindTexture();
-            BlockModel.setRenderBlocks(renderBlocks);
             final float itemSize = blockModel.getItemRenderScale();
             GL11.glScalef(itemSize, itemSize, itemSize);
             for (int i = 0; i < renderCount; i++) {
@@ -139,14 +138,41 @@ public class ItemModelBlock extends ItemModelStandard {
                     final float rOffZ = ((random.nextFloat() * 2.0F - 1.0F) * 0.2F) / itemSize;
                     GL11.glTranslatef(rOffX, rOffY, rOffZ);
                 }
-                float brightness = entity.getBrightness(partialTick);
                 if (Minecraft.getMinecraft(this).fullbright || itemfullBright) brightness = 1.0f;
                 blockModel.renderBlockOnInventory(tessellator, itemstack.getMetadata(), brightness);
                 GL11.glPopMatrix();
             }
         } else {
-            super.renderAsItemEntity(tessellator, entity, renderBlocks, random, itemstack, renderCount, yaw, partialTick);
+            super.renderAsItemEntity(tessellator, entity, random, itemstack, renderCount, yaw, brightness, partialTick);
+        }
+    }
+    @Override
+    public void renderItemInWorld(Tessellator tessellator, Entity entity, ItemStack itemStack, float brightness, float alpha, boolean worldTransform) {
+        if (itemStack == null) return;
+        GL11.glEnable(GL_BLEND);
+        GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        GL11.glEnable(GL_CULL_FACE);
+        if (BlockModelDispatcher.getInstance().getDispatch(Block.blocksList[itemStack.itemID]).shouldItemRender3d()) {
+            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+            TextureRegistry.blockAtlas.bindTexture();
+            if (useColor) {
+                final int color = getColor(itemStack);
+                final float r = (color >> 16 & 0xff) / 255F;
+                final float g = (color >> 8 & 0xff) / 255F;
+                final float b = (color & 0xff) / 255F;
+                GL11.glColor4f(r * brightness, g * brightness, b * brightness, alpha);
+            } else {
+                GL11.glColor4f(brightness, brightness, brightness, alpha);
+            }
+            GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F);
+            BlockModel.renderBlocks.useInventoryTint = useColor;
+            BlockModelDispatcher.getInstance().getDispatch(Block.blocksList[itemStack.itemID]).renderBlockOnInventory(tessellator, itemStack.getMetadata(), brightness, alpha);
+            BlockModel.renderBlocks.useInventoryTint = true;
+        } else {
+            super.renderItemInWorld(tessellator, entity, itemStack, brightness, alpha, worldTransform);
         }
+        GL11.glEnable(GL_CULL_FACE);
+        GL11.glDisable(GL_BLEND);
     }
     @Override
     public int getColor(ItemStack stack)
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelBow.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelBow.java
index 6d7481791..0d1ea90f2 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelBow.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelBow.java
@@ -31,8 +31,8 @@ public class ItemModelBow extends ItemModelStandard {
     }
 
     @Override
-    public void renderItem(Tessellator tessellator, ItemRenderer renderer, Entity entity, ItemStack itemstack, boolean handheldTransform) {
-        super.renderItem(tessellator, renderer, entity, itemstack, handheldTransform);
+    public void renderItem(Tessellator tessellator, ItemRenderer renderer, ItemStack itemstack, Entity entity, float brightness, boolean handheldTransform) {
+        super.renderItem(tessellator, renderer, itemstack, entity, brightness, handheldTransform);
         Item nextArrow = null;
         if (entity instanceof EntityPlayer){
             EntityPlayer entityplayer = (EntityPlayer)entity;
@@ -46,7 +46,7 @@ public class ItemModelBow extends ItemModelStandard {
         if (nextArrow != null){
             GL11.glRotatef(-90, 0, 0, 1);
             GL11.glTranslatef(-1,0, 0.0625f);
-            ItemModelDispatcher.getInstance().getDispatch(nextArrow).renderItem(tessellator, renderer, entity, itemstack, false);
+            ItemModelDispatcher.getInstance().getDispatch(nextArrow).renderItem(tessellator, renderer, itemstack, entity, brightness, false);
         }
     }
     @Override
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelCoal.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelCoal.java
index 993ae6c53..3d454edaa 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelCoal.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelCoal.java
@@ -5,6 +5,8 @@ import net.minecraft.client.render.stitcher.TextureRegistry;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class ItemModelCoal extends ItemModelStandard{
     protected IconCoordinate charcoal = TextureRegistry.getTexture("minecraft:item/charcoal");
@@ -13,7 +15,7 @@ public class ItemModelCoal extends ItemModelStandard{
     }
 
     @Override
-    public IconCoordinate getIcon(Entity entity, ItemStack itemStack)
+    public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack)
     {
         if(itemStack.getMetadata() == 1)
             return charcoal;
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
index 7b8744ea4..95f4761cb 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
@@ -112,6 +112,8 @@ public class ItemModelDispatcher extends Dispatcher<Item, ItemModel> {
         addDispatch(new ItemModelStandard(Item.foodAppleGold, "minecraft"));
         addDispatch(new ItemModelStandard(Item.sign, "minecraft"));
         addDispatch(new ItemModelStandard(Item.doorOak, "minecraft"));
+        addDispatch(new ItemModelStandard(Item.doorGlass, "minecraft"));
+        addDispatch(new ItemModelDoorPainted(Item.doorOakPainted));
         addDispatch(new ItemModelStandard(Item.bucket, "minecraft"));
         addDispatch(new ItemModelStandard(Item.bucketWater, "minecraft"));
         addDispatch(new ItemModelStandard(Item.bucketLava, "minecraft").setFullBright());
@@ -198,6 +200,8 @@ public class ItemModelDispatcher extends Dispatcher<Item, ItemModel> {
         addDispatch(new ItemModelStandard(Item.seedsPumpkin, "minecraft"));
         addDispatch(new ItemModelStandard(Item.seat, "minecraft"));
 
+        addDispatch(new ItemModelStandard(Item.rope, "minecraft"));
+
         addDispatch(new ItemModelStandard(Item.record13, "minecraft"));
         addDispatch(new ItemModelStandard(Item.recordCat, "minecraft"));
         addDispatch(new ItemModelStandard(Item.recordBlocks, "minecraft"));
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelDoorPainted.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelDoorPainted.java
new file mode 100644
index 000000000..7e0675f5a
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelDoorPainted.java
@@ -0,0 +1,25 @@
+package net.minecraft.client.render.item.model;
+
+import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemDye;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.MathHelper;
+
+public class ItemModelDoorPainted extends ItemModelStandard{
+    public static IconCoordinate[] doorIcons = new IconCoordinate[16];
+    static {
+        for (int i = 0; i < 16; i++) {
+            doorIcons[i] = TextureRegistry.getTexture("minecraft:item/door_" + ItemDye.dyeColors[i]);
+        }
+    }
+    public ItemModelDoorPainted(Item item) {
+        super(item, null);
+    }
+    public IconCoordinate getIcon(Entity entity, ItemStack itemStack){
+        int meta = itemStack.getMetadata();
+        return doorIcons[MathHelper.clamp(meta, 0, 15)];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelDye.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelDye.java
index 06872abbf..c11055ee5 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelDye.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelDye.java
@@ -2,12 +2,13 @@ package net.minecraft.client.render.item.model;
 
 import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.core.Global;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemDye;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class ItemModelDye extends ItemModelStandard{
     public static IconCoordinate[] dyeIcons = new IconCoordinate[16];
@@ -20,7 +21,7 @@ public class ItemModelDye extends ItemModelStandard{
         super(item, null);
     }
 
-    public IconCoordinate getIcon(Entity entity, ItemStack itemStack){
+    public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack){
         int meta = itemStack.getMetadata();
         return dyeIcons[MathHelper.clamp(meta, 0, 15)];
     }
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelFishingRod.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelFishingRod.java
index 3e5df793a..8a779de23 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelFishingRod.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelFishingRod.java
@@ -6,6 +6,8 @@ import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class ItemModelFishingRod extends ItemModelStandard {
     protected IconCoordinate rodCast = TextureRegistry.getTexture("minecraft:item/tool_fishingrod_cast");
@@ -14,10 +16,10 @@ public class ItemModelFishingRod extends ItemModelStandard {
     }
 
     @Override
-    public IconCoordinate getIcon(Entity entity, ItemStack itemStack){
+    public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack){
         if (entity instanceof EntityPlayer){
             // Use the cast fishing rod texture when holding a cast rod
-            if(itemStack == ((EntityPlayer) entity).getHeldItem() && ((EntityPlayer) entity).fishEntity != null)
+            if(itemStack == ((EntityPlayer) entity).getHeldItem() && ((EntityPlayer) entity).bobberEntity != null)
             {
                 return rodCast;
             }
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelLabel.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelLabel.java
index 909e78695..6d0bfc378 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelLabel.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelLabel.java
@@ -5,6 +5,8 @@ import net.minecraft.client.render.stitcher.TextureRegistry;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class ItemModelLabel extends ItemModelStandard{
     protected IconCoordinate writtenLabel = TextureRegistry.getTexture("minecraft:item/label_written");
@@ -13,7 +15,7 @@ public class ItemModelLabel extends ItemModelStandard{
     }
 
     @Override
-    public IconCoordinate getIcon(Entity entity, ItemStack itemStack)
+    public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack)
     {
         if(itemStack.hasCustomName()) {
             return writtenLabel;
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelNone.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelNone.java
index 658fa49cf..89406e5a9 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelNone.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelNone.java
@@ -2,14 +2,13 @@ package net.minecraft.client.render.item.model;
 
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
-import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.RenderEngine;
 import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.ItemStack;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -24,7 +23,7 @@ public class ItemModelNone extends ItemModel{
     }
 
     @Override
-    public void renderItem(Tessellator tessellator, ItemRenderer renderer, Entity entity, ItemStack itemstack, boolean handheldTransform) {
+    public void renderItem(Tessellator tessellator, ItemRenderer renderer, ItemStack itemstack, @Nullable Entity entity, float brightness, boolean handheldTransform) {
 
     }
 
@@ -44,12 +43,17 @@ public class ItemModelNone extends ItemModel{
     }
 
     @Override
-    public void renderAsItemEntity(Tessellator tessellator, EntityItem entity, RenderBlocks renderBlocks, Random random, ItemStack itemstack, int renderCount, float yaw, float partialTick) {
+    public void renderAsItemEntity(Tessellator tessellator, @Nullable Entity entity, Random random, ItemStack itemstack, int renderCount, float yaw, float brightness, float partialTick) {
 
     }
 
     @Override
-    public IconCoordinate getIcon(Entity entity, ItemStack itemStack) {
+    public void renderItemInWorld(Tessellator tessellator, Entity entity, ItemStack itemStack, float brightness, float alpha, boolean worldTransform) {
+
+    }
+
+    @Override
+    public IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack) {
         return null;
     }
 }
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java
index fdf0d5aab..6d0c2f662 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java
@@ -5,6 +5,8 @@ import net.minecraft.client.render.stitcher.TextureRegistry;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class ItemModelQuiver extends ItemModelStandard{
     protected IconCoordinate quiverFull = TextureRegistry.getTexture("minecraft:item/armor_quiver_full");
@@ -13,7 +15,7 @@ public class ItemModelQuiver extends ItemModelStandard{
     }
 
     @Override
-    public IconCoordinate getIcon(Entity entity, ItemStack itemStack)
+    public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack)
     {
         if(itemStack.getMetadata() >= itemStack.getItem().getMaxDamage())
             return quiverFull;
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
index 25e104a4e..0cb51fe93 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
@@ -4,17 +4,17 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.EntityRenderDispatcher;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
-import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
 import java.awt.*;
@@ -24,6 +24,8 @@ import static org.lwjgl.opengl.GL11.GL_BLEND;
 import static org.lwjgl.opengl.GL11.GL_CULL_FACE;
 import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST;
 import static org.lwjgl.opengl.GL11.GL_LIGHTING;
+import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
+import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
 import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
 import static org.lwjgl.opengl.GL11.glBlendFunc;
 import static org.lwjgl.opengl.GL11.glDisable;
@@ -51,6 +53,10 @@ public class ItemModelStandard extends ItemModel{
 
     @Override
     public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, EntityPlayer player, ItemStack stack, float partialTick) {
+        final Minecraft mc = Minecraft.getMinecraft(Minecraft.class);
+        float brightness = player.getBrightness(1f);
+        if (mc.fullbright || itemfullBright) brightness = 1.0f;
+
         final float distanceScale = 0.8F; // Relates to how close the held item renders from the camera
         final float swingProgress = player.getSwingProgress(partialTick);
         final float animationProgress2 = MathHelper.sin(swingProgress * MathHelper.PI);
@@ -71,137 +77,34 @@ public class ItemModelStandard extends ItemModel{
 
         heldTransformFirstPerson(renderer, player, stack);
 
-        renderItem(tessellator, renderer,player, stack, true);
+        renderItem(tessellator, renderer, stack, player, brightness, true);
     }
 
     @Override
-    public void renderItem(Tessellator tessellator, ItemRenderer renderer, Entity entity, ItemStack itemstack, boolean handheldTransform) {
-        final Minecraft mc = Minecraft.getMinecraft(Minecraft.class);
-
-        IconCoordinate tex = getIcon(entity, itemstack);
-        tex.parentAtlas.bindTexture();
-        int tileWidth = tex.width;
-
-        float brightness = entity.getBrightness(1f);
-        if (mc.fullbright || itemfullBright) brightness = 1.0f;
-        if (useColor) {
-            final int color = getColor(itemstack);
-            final float r = (color >> 16 & 0xff) / 255F;
-            final float g = (color >> 8 & 0xff) / 255F;
-            final float b = (color & 0xff) / 255F;
-            GL11.glColor4f(r * brightness, g * brightness, b * brightness, 1.0F);
-        }  else {
-            GL11.glColor4f(brightness, brightness, brightness, 1.0F);
-        }
-
-        double uMin = tex.getIconUMin();
-        double uMax = tex.getIconUMax();
-        double vMin = tex.getIconVMin();
-        double vMax = tex.getIconVMax();
-        double uDiff = uMin - uMax;
-        double vDiff = vMin - vMax;
-        final double width = 1.0D;
-
-        final double foon = 0.5D * tex.parentAtlas.getInverseWidth();
-        final double goon = 0.0625D * (16.0D / tileWidth);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+    public void renderItem(Tessellator tessellator, ItemRenderer renderer, ItemStack itemstack, @Nullable Entity entity, float brightness, boolean handheldTransform) {
+        if (itemfullBright) brightness = 1f;
         if(handheldTransform) {
             GL11.glTranslatef(-0.0F, -0.3F, 0.0F);
-            final double handheldScale = 1.5F;
-            GL11.glScaled(handheldScale, handheldScale, handheldScale);
-            GL11.glRotated(50F, 0.0F, 1.0F, 0.0F);
-            GL11.glRotated(335F, 0.0F, 0.0F, 1.0F);
-            GL11.glTranslated(-0.9375F, -0.0625F, 0.0F);
+            final float handheldScale = 1.5F;
+            GL11.glScalef(handheldScale, handheldScale, handheldScale);
+            GL11.glRotatef(50F, 0.0F, 1.0F, 0.0F);
+            GL11.glRotatef(335F, 0.0F, 0.0F, 1.0F);
+            GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F);
         }
-        final double thickness = 0.0625D;
-        final double pixelWidth = 1D/tileWidth;
 
-        // Back Face
-        tessellator.startDrawingQuads();
-        tessellator.setNormal(0.0F, 0.0F, 1.0F);
-        tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, uMax, vMax);
-        tessellator.addVertexWithUV(width,0.0D, 0.0D, uMin, vMax);
-        tessellator.addVertexWithUV(width,1.0D, 0.0D, uMin, vMin);
-        tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, uMax, vMin);
-        tessellator.draw();
+        renderItemInWorld(tessellator, entity, itemstack, brightness, 1f, false);
 
-        // Front Face
-        tessellator.startDrawingQuads();
-        tessellator.setNormal(0.0F, 0.0F, -1F);
-        tessellator.addVertexWithUV(0.0D, 1.0D, -thickness, uMax, vMin);
-        tessellator.addVertexWithUV(width,1.0D, -thickness, uMin, vMin);
-        tessellator.addVertexWithUV(width,0.0D, -thickness, uMin, vMax);
-        tessellator.addVertexWithUV(0.0D, 0.0D, -thickness, uMax, vMax);
-        tessellator.draw();
-
-        // Right Sides
-        tessellator.startDrawingQuads();
-        tessellator.setNormal(-1F, 0.0F, 0.0F);
-        for(int i = 0; i < tileWidth; i++)
-        {
-            double texProgress = i * pixelWidth;
-            double u = (uMax + uDiff * texProgress) - foon;
-            double x = width * texProgress;
-            tessellator.addVertexWithUV(x, 0.0D,    -thickness, u, vMax);
-            tessellator.addVertexWithUV(x, 0.0D,    0.0D,       u, vMax);
-            tessellator.addVertexWithUV(x, 1.0D,    0.0D,       u, vMin);
-            tessellator.addVertexWithUV(x, 1.0D,    -thickness, u, vMin);
-        }
-        tessellator.draw();
-
-        // Left Sides
-        tessellator.startDrawingQuads();
-        tessellator.setNormal(1.0F, 0.0F, 0.0F);
-        for(int i = 0; i < tileWidth; i++)
-        {
-            double texProgress = i * pixelWidth;
-            double u = (uMax + uDiff * texProgress) - foon;
-            double x = width * texProgress + goon;
-            tessellator.addVertexWithUV(x, 1.0D,    -thickness, u, vMin);
-            tessellator.addVertexWithUV(x, 1.0D,    0.0D,       u, vMin);
-            tessellator.addVertexWithUV(x, 0.0D,    0.0D,       u, vMax);
-            tessellator.addVertexWithUV(x, 0.0D,    -thickness, u, vMax);
-        }
-        tessellator.draw();
-
-        // Top Sides
-        tessellator.startDrawingQuads();
-        tessellator.setNormal(0.0F, 1.0F, 0.0F);
-        for(int i = 0; i < tileWidth; i++)
-        {
-            double texProgress = i * pixelWidth;
-            double v = (vMax + vDiff * texProgress) - foon;
-            double y = width * texProgress + goon;
-            tessellator.addVertexWithUV(0.0D,   y,  0.0D,       uMax, v);
-            tessellator.addVertexWithUV(width,  y,  0.0D,       uMin, v);
-            tessellator.addVertexWithUV(width,  y,  -thickness, uMin, v);
-            tessellator.addVertexWithUV(0.0D,   y,  -thickness, uMax, v);
-        }
-        tessellator.draw();
-
-        // Bottom Sides
-        tessellator.startDrawingQuads();
-        tessellator.setNormal(0.0F, -1F, 0.0F);
-        for(int i = 0; i < tileWidth; i++)
-        {
-            double texProgress = i * pixelWidth;
-            double v = (vMax + vDiff * texProgress) - foon;
-            double y = width * texProgress;
-            tessellator.addVertexWithUV(width,  y, 0.0D,        uMin, v);
-            tessellator.addVertexWithUV(0.0D,   y, 0.0D,        uMax, v);
-            tessellator.addVertexWithUV(0.0D,   y, -thickness,  uMax, v);
-            tessellator.addVertexWithUV(width,  y, -thickness,  uMin, v);
-        }
-        tessellator.draw();
-
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
     }
 
     @Override
     public void renderItemThirdPerson(Tessellator tessellator, ItemRenderer renderer, Entity entity, ItemStack itemstack, boolean handheldTransform) {
+        final Minecraft mc = Minecraft.getMinecraft(Minecraft.class);
+        float brightness = entity.getBrightness(1f);
+        if (mc.fullbright || itemfullBright) brightness = 1.0f;
+
         GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F);
         heldTransformThirdPerson(renderer, entity, itemstack);
-        renderItem(tessellator, renderer, entity, itemstack, handheldTransform);
+        renderItem(tessellator, renderer, itemstack, entity, brightness, handheldTransform);
     }
 
     @Override
@@ -224,7 +127,7 @@ public class ItemModelStandard extends ItemModel{
             } else {
                 GL11.glColor4f(brightness, brightness, brightness, alpha);
             }
-            renderTexturedQuad(tessellator, x, y, textureIndex, false, false);
+            renderTexturedQuad(tessellator, x, y, textureIndex);
             glEnable(GL_LIGHTING);
         }
         glEnable(GL_CULL_FACE);
@@ -267,14 +170,14 @@ public class ItemModelStandard extends ItemModel{
     }
 
     @Override
-    public void renderAsItemEntity(Tessellator tessellator, EntityItem entity, RenderBlocks renderBlocks, Random random, ItemStack itemstack, int renderCount, float yaw, float partialTick) {
+    public void renderAsItemEntity(Tessellator tessellator, @Nullable Entity entity, Random random, ItemStack itemstack, int renderCount, float yaw, float brightness, float partialTick) {
         final Minecraft mc = Minecraft.getMinecraft(this);
+        if (mc.fullbright || itemfullBright) brightness = 1.0f;
+
         EntityRenderDispatcher renderDispatcher = EntityRenderDispatcher.instance;
         GL11.glScalef(0.5F, 0.5F, 0.5F);
         final IconCoordinate tex = getIcon(entity, itemstack);
         tex.parentAtlas.bindTexture();
-        float brightness = entity.getBrightness(partialTick);
-        if (mc.fullbright || itemfullBright) brightness = 1.0f;
         if (useColor) {
             final int color = getColor(itemstack);
             final float r = (color >> 16 & 0xff) / 255F;
@@ -295,7 +198,7 @@ public class ItemModelStandard extends ItemModel{
                 glPushMatrix();
 
                 glTranslated(0.0, 0.0, 0.1 * i);
-                renderItem(tessellator, renderDispatcher.itemRenderer, entity, itemstack, false);
+                renderItem(tessellator, renderDispatcher.itemRenderer, itemstack, entity, brightness, false);
                 glPopMatrix();
             }
 
@@ -315,6 +218,125 @@ public class ItemModelStandard extends ItemModel{
             }
         }
     }
+
+    @Override
+    public void renderItemInWorld(Tessellator tessellator, Entity entity, ItemStack itemStack, float brightness, float alpha, boolean worldTransform) {
+        GL11.glEnable(GL_BLEND);
+        GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        if (useColor) {
+            final int color = getColor(itemStack);
+            final float r = (color >> 16 & 0xff) / 255F;
+            final float g = (color >> 8 & 0xff) / 255F;
+            final float b = (color & 0xff) / 255F;
+            GL11.glColor4f(r * brightness, g * brightness, b * brightness, alpha);
+        }  else {
+            GL11.glColor4f(brightness, brightness, brightness, alpha);
+        }
+
+        IconCoordinate tex = getIcon(entity, itemStack);
+        tex.parentAtlas.bindTexture();
+        int tileWidth = tex.width;
+
+        float uMin = (float) tex.getIconUMin();
+        float uMax = (float) tex.getIconUMax();
+        float vMin = (float) tex.getIconVMin();
+        float vMax = (float) tex.getIconVMax();
+        float uDiff = uMin - uMax;
+        float vDiff = vMin - vMax;
+        final float width = 1.0F;
+
+        final float foon = (0.5f / 512);
+        final float goon = 0.0625f * (16.0f / tileWidth);
+        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        final float thickness = 0.0625f;
+        final float pixelWidth = 1f/tileWidth;
+
+        if (worldTransform){
+            GL11.glTranslatef(-0.5f, -0.5f, thickness/2);
+        }
+
+        // Back Face
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, 0.0F, 1.0F);
+        tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, uMax, vMax);
+        tessellator.addVertexWithUV(width,0.0D, 0.0D, uMin, vMax);
+        tessellator.addVertexWithUV(width,1.0D, 0.0D, uMin, vMin);
+        tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, uMax, vMin);
+        tessellator.draw();
+
+        // Front Face
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, 0.0F, -1F);
+        tessellator.addVertexWithUV(0.0D, 1.0D, -thickness, uMax, vMin);
+        tessellator.addVertexWithUV(width,1.0D, -thickness, uMin, vMin);
+        tessellator.addVertexWithUV(width,0.0D, -thickness, uMin, vMax);
+        tessellator.addVertexWithUV(0.0D, 0.0D, -thickness, uMax, vMax);
+        tessellator.draw();
+
+        // Right Sides
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(-1F, 0.0F, 0.0F);
+        for(int i = 0; i < tileWidth; i++)
+        {
+            float texProgress = i * pixelWidth;
+            float u = (uMax + uDiff * texProgress) - foon;
+            float x = width * texProgress;
+            tessellator.addVertexWithUV(x, 0.0D,    -thickness, u, vMax);
+            tessellator.addVertexWithUV(x, 0.0D,    0.0D,       u, vMax);
+            tessellator.addVertexWithUV(x, 1.0D,    0.0D,       u, vMin);
+            tessellator.addVertexWithUV(x, 1.0D,    -thickness, u, vMin);
+        }
+        tessellator.draw();
+
+        // Left Sides
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(1.0F, 0.0F, 0.0F);
+        for(int i = 0; i < tileWidth; i++)
+        {
+            float texProgress = i * pixelWidth;
+            float u = (uMax + uDiff * texProgress) - foon;
+            float x = width * texProgress + goon;
+            tessellator.addVertexWithUV(x, 1.0D,    -thickness, u, vMin);
+            tessellator.addVertexWithUV(x, 1.0D,    0.0D,       u, vMin);
+            tessellator.addVertexWithUV(x, 0.0D,    0.0D,       u, vMax);
+            tessellator.addVertexWithUV(x, 0.0D,    -thickness, u, vMax);
+        }
+        tessellator.draw();
+
+        // Top Sides
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, 1.0F, 0.0F);
+        for(int i = 0; i < tileWidth; i++)
+        {
+            float texProgress = i * pixelWidth;
+            float v = (vMax + vDiff * texProgress) - foon;
+            float y = width * texProgress + goon;
+            tessellator.addVertexWithUV(0.0D,   y,  0.0D,       uMax, v);
+            tessellator.addVertexWithUV(width,  y,  0.0D,       uMin, v);
+            tessellator.addVertexWithUV(width,  y,  -thickness, uMin, v);
+            tessellator.addVertexWithUV(0.0D,   y,  -thickness, uMax, v);
+        }
+        tessellator.draw();
+
+        // Bottom Sides
+        tessellator.startDrawingQuads();
+        tessellator.setNormal(0.0F, -1F, 0.0F);
+        for(int i = 0; i < tileWidth; i++)
+        {
+            float texProgress = i * pixelWidth;
+            float v = (vMax + vDiff * texProgress) - foon;
+            float y = width * texProgress;
+            tessellator.addVertexWithUV(width,  y, 0.0D,        uMin, v);
+            tessellator.addVertexWithUV(0.0D,   y, 0.0D,        uMax, v);
+            tessellator.addVertexWithUV(0.0D,   y, -thickness,  uMax, v);
+            tessellator.addVertexWithUV(width,  y, -thickness,  uMin, v);
+        }
+        tessellator.draw();
+
+        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL_BLEND);
+    }
+
     public void renderFlat(Tessellator tessellator, IconCoordinate index){
         final float xOff = 0.5F;
         final float yOff = 0.25F;
@@ -362,7 +384,7 @@ public class ItemModelStandard extends ItemModel{
             GL11.glRotatef(-20F, 0.0F, 1.0F, 0.0F);
         }
     }
-    public IconCoordinate getIcon(Entity entity, ItemStack itemStack){
+    public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack){
         return icon;
     }
     public int getColor(ItemStack stack)
@@ -385,6 +407,10 @@ public class ItemModelStandard extends ItemModel{
         tessellator.draw();
     }
 
+    protected void renderTexturedQuad(Tessellator tessellator, int x, int y, IconCoordinate icon) {
+        renderTexturedQuad(tessellator, x, y, icon, false, false);
+    }
+
     protected void renderTexturedQuad(Tessellator tessellator, int x, int y, IconCoordinate icon, boolean flipX, boolean flipY) {
         final float z = 0.0F;
         double uMin = icon.getIconUMin();
@@ -407,6 +433,7 @@ public class ItemModelStandard extends ItemModel{
         tessellator.addVertexWithUV(x + 16, y,      z, uMax, vMin);
         tessellator.addVertexWithUV(x,      y,      z, uMin, vMin);
         tessellator.draw();
+
     }
 
     public ItemModelStandard setFull3D()
@@ -429,4 +456,4 @@ public class ItemModelStandard extends ItemModel{
         itemfullBright = true;
         return this;
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/render/stitcher/AtlasStitcher.java b/src/main/java/net/minecraft/client/render/stitcher/AtlasStitcher.java
index e661cf11d..b4e92176a 100644
--- a/src/main/java/net/minecraft/client/render/stitcher/AtlasStitcher.java
+++ b/src/main/java/net/minecraft/client/render/stitcher/AtlasStitcher.java
@@ -49,6 +49,7 @@ public class AtlasStitcher {
         List<IconCoordinate> coordinateList = new ArrayList<>(textureMap.values());
         for (IconCoordinate coordinate : coordinateList){
             BufferedImage image = Textures.readImage(mc.texturePackList.getResourceAsStream(coordinate.sourceImage));
+            if (image == null) image = Textures.missingTexture;
             if (image == Textures.missingTexture){
                 System.out.println(coordinate.sourceImage + " could not be found!");
             }
diff --git a/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java b/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java
index d7be53138..3979a5400 100644
--- a/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java
+++ b/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java
@@ -67,7 +67,7 @@ public class TextureRegistry {
             String name = file.getFileName().toString();
             if (name.endsWith(".png")){
                 atlas.getTexture(namespace + ":" + file.getFileName().toString().replace(".png", ""));
-                System.out.println(namespace + ":" + file.getFileName().toString().replace(".png", ""));
+//                System.out.println(namespace + ":" + file.getFileName().toString().replace(".png", ""));
             }
         }
         walk.close();
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java b/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java
new file mode 100644
index 000000000..4e6926f9d
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java
@@ -0,0 +1,35 @@
+package net.minecraft.client.render.tileentity;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.EntityRenderDispatcher;
+import net.minecraft.client.render.RenderBlocks;
+import net.minecraft.client.render.block.model.BlockModel;
+import net.minecraft.client.render.item.model.ItemModelDispatcher;
+import net.minecraft.client.render.tessalator.Tessellator;
+import net.minecraft.client.render.tessalator.TessellatorStandard;
+import net.minecraft.core.block.entity.TileEntityMeshGold;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+import org.lwjgl.opengl.GL11;
+
+public class TileEntityRendererMesh extends TileEntityRenderer<TileEntityMeshGold> {
+
+    @Override
+    public void doRender(Tessellator tessellator, TileEntityMeshGold tileEntity, double x, double y, double z, float renderPartialTicks) {
+        if(tileEntity.filterItem == null) return;
+        GL11.glPushMatrix();
+
+        final float bobbingOffset = MathHelper.sin((tileEntity.ticksRan + renderPartialTicks) / 10F) * 0.1F + 0.1F;
+        final float f3 = (float) Math.toDegrees(((tileEntity.ticksRan + renderPartialTicks) / 20F));
+
+        GL11.glTranslatef((float) x + 0.5f, (float) y + bobbingOffset + 0.25f, (float) z + 0.5f);
+
+        float lightLevel = Minecraft.getMinecraft(this).theWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
+        if (Minecraft.getMinecraft(this).fullbright) lightLevel = 1.0f;
+        BlockModel.setRenderBlocks(EntityRenderDispatcher.instance.itemRenderer.renderBlocksInstance);
+        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        ItemModelDispatcher.getInstance().getDispatch(tileEntity.filterItem).renderAsItemEntity(TessellatorStandard.instance, null, tileEntity.worldObj.rand, tileEntity.filterItem, 1, f3, lightLevel, renderPartialTicks);
+        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glPopMatrix();
+    }
+}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatList.java b/src/main/java/net/minecraft/core/achievement/stat/StatList.java
index 00ddb293e..b2f7dbda2 100644
--- a/src/main/java/net/minecraft/core/achievement/stat/StatList.java
+++ b/src/main/java/net/minecraft/core/achievement/stat/StatList.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.achievement.stat;
 
+import net.minecraft.core.Global;
 import net.minecraft.core.achievement.AchievementList;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
@@ -118,7 +119,7 @@ public abstract class StatList
         pickUpItemStats = new Stat[Item.itemsList.length];
         for (int i = 0; i < Item.itemsList.length; i++)
         {
-            pickUpItemStats[i] = (new StatItem(0x1040000 + i, "", i)).registerStat();
+            pickUpItemStats[i] = (new StatItem(0x1040000 + i, "", i)).registerStat().setClientside();
         }
 
         mobEncounterStats = new HashMap<>();
diff --git a/src/main/java/net/minecraft/core/block/Block.java b/src/main/java/net/minecraft/core/block/Block.java
index 8fd1a8ecb..6d59b85e5 100644
--- a/src/main/java/net/minecraft/core/block/Block.java
+++ b/src/main/java/net/minecraft/core/block/Block.java
@@ -283,7 +283,7 @@ public class Block
         }
     }
     
-    public boolean collidesWithEntity(Entity entity)
+    public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z)
     {
         return true;
     }
@@ -820,6 +820,8 @@ public class Block
 
     public static final Block wool = new BlockWool("wool", 110).withHardness(0.8F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_SHEARS);
+    public static final Block rope = new BlockRope("rope", 111).withHardness(0.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS);
 
     public static final Block brickClay = new Block("brick.clay", 120, Material.stone).withHardness(3.0F).withBlastResistance(10F)
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
@@ -946,7 +948,7 @@ public class Block
     public static final Block mud = new BlockMud("mud", 225, Material.dirt, false).withHardness(0.6F)
             .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_CACTI, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.GROWS_SUGAR_CANE);
     public static final Block mudBaked = new BlockMud("mud.baked", 226, Material.stone, true).withHardness(1.5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_CACTI, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.GROWS_SUGAR_CANE);
 
     public static final Block spongeDry = new BlockSponge("sponge.dry", 230, false).withHardness(0.6F)
             .withTags(BlockTags.MINEABLE_BY_SHEARS);
@@ -1009,6 +1011,9 @@ public class Block
             .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
     public static final Block leavesCacao = new BlockLeavesCacao("leaves.cacao", 298).withHardness(0.2F).withLightBlock(1).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+    public static final Block leavesCaatinga = new BlockLeavesOak("leaves.caatinga", 299).withHardness(0.2F).withLightBlock(1).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+        .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+
 
     public static final Block saplingOak = new BlockSaplingOak("sapling.oak", 310).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
@@ -1151,11 +1156,11 @@ public class Block
     public static final Block leverCobbleStone = new BlockLever("lever.cobble.stone", 480).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
 
-    public static final Block pressureplateStone = new BlockPressurePlate("pressureplate.stone", 490, BlockPressurePlate.MobType.MOBS, Material.stone).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+    public static final Block pressureplateStone = new BlockPressurePlate("pressureplate.stone", 490, EntityLiving.class, Material.stone).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
-    public static final Block pressureplatePlanksOak = new BlockPressurePlate("pressureplate.planks.oak", 491, BlockPressurePlate.MobType.EVERYTHING, Material.wood).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+    public static final Block pressureplatePlanksOak = new BlockPressurePlate("pressureplate.planks.oak", 491, Entity.class, Material.wood).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.PREVENT_MOB_SPAWNS);
-    public static final Block pressureplateCobbleStone = new BlockPressurePlate("pressureplate.cobble.stone", 492, BlockPressurePlate.MobType.PLAYERS, Material.stone).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+    public static final Block pressureplateCobbleStone = new BlockPressurePlate("pressureplate.cobble.stone", 492, EntityPlayer.class, Material.stone).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
 
     public static final Block motionsensorIdle = new BlockMotionSensor("motionsensor.idle", 500, false).withHardness(2.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
@@ -1199,6 +1204,8 @@ public class Block
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block trapdoorGlass = new BlockTrapDoor("trapdoor.glass", 572, Material.glass, false).withHardness(0.3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    public static final Block trapdoorPlanksOakPainted = new BlockTrapDoorPainted("trapdoor.planks.oak.painted", 573, Material.wood).withHardness(3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_AXE);
 
     public static final Block tnt = new BlockTNT("tnt", 580).withHardness(0.0F);
 
@@ -1210,10 +1217,20 @@ public class Block
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block doorIronTop = new BlockDoor("door.iron.top", 593, Material.metal, true).withHardness(5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+    public static final Block doorPlanksOakPaintedBottom = new BlockDoorPainted("door.planks.oak.painted.bottom", 594, Material.wood, false).withHardness(3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+    public static final Block doorPlanksOakPaintedTop = new BlockDoorPainted("door.planks.oak.painted.top", 595, Material.wood, true).withHardness(3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+    public static final Block doorGlassBottom = new BlockDoorGlass("door.glass.bottom", 596, Material.glass, false).withHardness(0.3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+    public static final Block doorGlassTop = new BlockDoorGlass("door.glass.top", 597, Material.glass, true).withHardness(0.3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
 
     public static final Block mesh = new BlockMesh("mesh", 600).withHardness(1.5F)
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
+    public static final Block meshGold = new BlockMeshGold("mesh.gold", 601).withHardness(1F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    
     public static final Block bed = new BlockBed("bed", 610).withHardness(0.2F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
     public static final Block seat = new BlockSeat("seat", 611).withHardness(0.2F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
@@ -1224,6 +1241,10 @@ public class Block
 
     public static final Block fire = new BlockFire("fire", 630).withHardness(0.0F).withLightEmission(1.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
+    public static final Block brazierInactive = new BlockBrazier("brazier.inactive", 631, false).withHardness(1.5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    public static final Block brazierActive = new BlockBrazier("brazier.active", 632, true).withHardness(1.5F).withLightEmission(1.0F)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
 
     public static final Block mobspawner = new BlockMobSpawner("mobspawner", 640).withHardness(5F).withDisabledStats().withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block mobspawnerDeactivated = new BlockMobSpawnerDeactivated("mobspawner.deactivated", 641, Material.stone).withHardness(5F).withTags(BlockTags.MINEABLE_BY_PICKAXE);
@@ -1406,6 +1427,9 @@ public class Block
         Item.itemsList[chestPlanksOakPainted.id] = new ItemBlockPainted(chestPlanksOakPainted, true);
         Item.itemsList[fencePlanksOakPainted.id] = new ItemBlockPainted(fencePlanksOakPainted, false);
         Item.itemsList[fencegatePlanksOakPainted.id] = new ItemBlockPainted(fencegatePlanksOakPainted, true);
+        Item.itemsList[doorPlanksOakPaintedBottom.id] = new ItemBlockPainted(doorPlanksOakPaintedBottom, true);
+        Item.itemsList[doorPlanksOakPaintedTop.id] = new ItemBlockPainted(doorPlanksOakPaintedTop, true);
+        Item.itemsList[trapdoorPlanksOakPainted.id] = new ItemBlockPainted(trapdoorPlanksOakPainted, true);
         Item.itemsList[lampIdle.id] = new ItemBlockLamp(lampIdle);
         Item.itemsList[algae.id] = new ItemBlockAlgae(algae);
         Item.itemsList[chestLegacy.id] = new ItemBlockChestLegacy(chestLegacy);
diff --git a/src/main/java/net/minecraft/core/block/BlockBrazier.java b/src/main/java/net/minecraft/core/block/BlockBrazier.java
new file mode 100644
index 000000000..33ceaedab
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/BlockBrazier.java
@@ -0,0 +1,87 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.ItemFirestriker;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.world.World;
+
+import java.util.Random;
+
+public class BlockBrazier
+    extends Block {
+    private final boolean burning;
+
+    public BlockBrazier(String key, int id, boolean burning) {
+        super(key, id, Material.metal);
+        this.burning = burning;
+    }
+
+    public boolean isBurning() {
+        return burning;
+    }
+
+    @Override
+    public boolean renderAsNormalBlock() {
+        return false;
+    }
+
+    @Override
+    public boolean isSolidRender() {
+        return false;
+    }
+
+    @Override
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity) {
+        return new ItemStack[] { new ItemStack(Block.brazierInactive, 1) };
+    }
+
+    @Override
+    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+        ItemStack heldItem = player.getHeldItem();
+        if (heldItem != null && heldItem.getItem() instanceof ItemFirestriker && !burning) {
+            if (world.getBlock(x + 1, y, z) instanceof BlockFluid ||
+                world.getBlock(x - 1, y, z) instanceof BlockFluid ||
+                world.getBlock(x, y, z + 1) instanceof BlockFluid ||
+                world.getBlock(x, y, z - 1) instanceof BlockFluid) {
+                return false;
+            }
+            world.setBlockAndMetadataWithNotify(x, y, z, Block.brazierActive.id, 0);
+            heldItem.damageItem(1, player);
+            world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D, "fire.ignite", 1.0F, world.rand.nextFloat() * 0.4F + 0.8F);
+            return true;
+        }
+        if (heldItem == null && burning) {
+            world.setBlockAndMetadataWithNotify(x, y, z, Block.brazierInactive.id, 0);
+            return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    public void onBlockRemoved(World world, int x, int y, int z, int data) {
+        if (burning) {
+            Block.fire.onBlockRemoved(world, x, y, z, data);
+        }
+    }
+
+    @Override
+    public void onNeighborBlockChange(World world, int x, int y, int z, int blockId) {
+        if (!burning) return;
+        Block block = Block.blocksList[blockId];
+        if (block instanceof BlockFluid) {
+            world.setBlockAndMetadataWithNotify(x, y, z, Block.brazierInactive.id, 0);
+        }
+    }
+
+    @Override
+    public void randomDisplayTick(World world, int x, int y, int z, Random rand) {
+        if (burning) {
+            Block.fire.randomDisplayTick(world, x, y, z, rand);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockDoorGlass.java b/src/main/java/net/minecraft/core/block/BlockDoorGlass.java
new file mode 100644
index 000000000..00d806ce7
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/BlockDoorGlass.java
@@ -0,0 +1,19 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.world.World;
+
+public class BlockDoorGlass extends BlockDoor {
+    public BlockDoorGlass(String key, int id, Material material, boolean isTop) {
+        super(key, id, material, isTop);
+    }
+    @Override
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    {
+        return new ItemStack[] { new ItemStack(Item.doorGlass) };
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockDoorPainted.java b/src/main/java/net/minecraft/core/block/BlockDoorPainted.java
new file mode 100644
index 000000000..66e934b30
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/BlockDoorPainted.java
@@ -0,0 +1,19 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.world.World;
+
+public class BlockDoorPainted extends BlockDoor{
+    public BlockDoorPainted(String key, int id, Material material, boolean isTop) {
+        super(key, id, material, isTop);
+    }
+    @Override
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    {
+        return new ItemStack[] { new ItemStack(Item.doorOakPainted, 1, 15 - (meta >> 4 & 0xF)) };
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockMesh.java b/src/main/java/net/minecraft/core/block/BlockMesh.java
index 1816d6534..03307b030 100644
--- a/src/main/java/net/minecraft/core/block/BlockMesh.java
+++ b/src/main/java/net/minecraft/core/block/BlockMesh.java
@@ -6,6 +6,7 @@ package net.minecraft.core.block;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.world.World;
 
 public class BlockMesh extends BlockTransparent
 {
@@ -28,7 +29,7 @@ public class BlockMesh extends BlockTransparent
     }
 
     @Override
-    public boolean collidesWithEntity(Entity entity) {
+    public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z) {
         return !(entity instanceof EntityItem);
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockMeshGold.java b/src/main/java/net/minecraft/core/block/BlockMeshGold.java
new file mode 100644
index 000000000..8241f1ad1
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/BlockMeshGold.java
@@ -0,0 +1,73 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.TileEntityMeshGold;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.world.World;
+
+public class BlockMeshGold extends BlockTileEntity{
+    public BlockMeshGold(String key, int id) {
+        super(key, id, Material.metal);
+    }
+
+    @Override
+    protected TileEntity getNewBlockEntity() {
+        return new TileEntityMeshGold();
+    }
+    @Override
+    public boolean isSolidRender()
+    {
+        return false;
+    }
+    @Override
+    public boolean renderAsNormalBlock()
+    {
+        return false;
+    }
+
+    @Override
+    public boolean canPlaceOnSurface()
+    {
+        return true;
+    }
+    @Override
+    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    {
+        TileEntityMeshGold meshGold = (TileEntityMeshGold) world.getBlockTileEntity(x, y, z);
+        ItemStack heldItem = player.getHeldItem();
+        boolean flag = meshGold.setFilterItem(player, heldItem);
+        if(heldItem != null && heldItem.stackSize <= 0)
+        {
+            player.inventory.setInventorySlotContents(player.inventory.currentItem, null);
+        }
+        return flag;
+    }
+    @Override
+    public void onBlockRemoved(World world, int x, int y, int z, int data) {
+        TileEntityMeshGold mesh = (TileEntityMeshGold) world.getBlockTileEntity(x, y, z);
+        if (mesh.filterItem != null){
+            EntityItem item = world.dropItem(x, y, z, mesh.filterItem);
+            item.xd *= 0.5;
+            item.yd *= 0.5;
+            item.zd *= 0.5;
+            item.delayBeforeCanPickup = 0;
+        }
+        super.onBlockRemoved(world, x, y, z, data);
+    }
+
+    @Override
+    public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z) {
+        if (entity instanceof EntityItem){
+            TileEntityMeshGold mesh = (TileEntityMeshGold) world.getBlockTileEntity(x, y, z);
+            if (mesh.filterItem == null) return true;
+
+            ItemStack entityStack = ((EntityItem) entity).item;
+            return !entityStack.isItemEqual(mesh.filterItem);
+        }
+        return true;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockMobSpawner.java b/src/main/java/net/minecraft/core/block/BlockMobSpawner.java
index 2e6bd5b96..77f5efeda 100644
--- a/src/main/java/net/minecraft/core/block/BlockMobSpawner.java
+++ b/src/main/java/net/minecraft/core/block/BlockMobSpawner.java
@@ -45,7 +45,7 @@ public class BlockMobSpawner extends BlockTileEntity
     }
 
     @Override
-    public boolean collidesWithEntity(Entity entity) {
+    public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z) {
         return !(entity instanceof EntityItem);
     }
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockMobSpawnerDeactivated.java b/src/main/java/net/minecraft/core/block/BlockMobSpawnerDeactivated.java
index 235e0e0dc..c940c70c5 100644
--- a/src/main/java/net/minecraft/core/block/BlockMobSpawnerDeactivated.java
+++ b/src/main/java/net/minecraft/core/block/BlockMobSpawnerDeactivated.java
@@ -27,7 +27,7 @@ public class BlockMobSpawnerDeactivated extends BlockTransparent{
     }
 
     @Override
-    public boolean collidesWithEntity(Entity entity) {
+    public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z) {
         return !(entity instanceof EntityItem);
     }
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockMud.java b/src/main/java/net/minecraft/core/block/BlockMud.java
index f5cdf0211..142598a1c 100644
--- a/src/main/java/net/minecraft/core/block/BlockMud.java
+++ b/src/main/java/net/minecraft/core/block/BlockMud.java
@@ -22,7 +22,7 @@ public class BlockMud extends Block{
     @Override
     public int tickRate()
     {
-        return 20;
+        return 5;
     }
 
     @Override
@@ -77,8 +77,8 @@ public class BlockMud extends Block{
         if(isWaterNearby(world, x, y, z, 1))
             return true;
 
-        // If there's water 4 blocks...
-        if(isWaterNearby(world, x, y, z, 4)){
+        // If there's water 3 blocks...
+        if(isWaterNearby(world, x, y, z, 3)){
             for (int x1 = x - 1; x1 <= x + 1; x1++)
             {
                 for (int y1 = y - 1; y1 <= y + 1; y1++)
@@ -166,8 +166,8 @@ public class BlockMud extends Block{
         // dry out mud
         if(isHardened) {
             if(!isLavaNearby(world, x, y, z)) {
-                if (canBecomeWet(world, x, y, z) || world.canBlockBeRainedOn(x, y + 1, z)) {
-                    world.setBlockWithNotify(x, y, z, Block.mud.id);
+                if (canBecomeWet(world, x, y, z)) {
+                    world.setBlock(x, y, z, Block.mud.id);
                 }
             }
         }
@@ -179,7 +179,7 @@ public class BlockMud extends Block{
                 {
                     world.spawnParticle("largesmoke", (double)x + Math.random(), (double)y + Math.random(), (double)z + Math.random(), 0.0D, 0.0D, 0.0D);
                 }
-                world.setBlockWithNotify(x, y, z, Block.mudBaked.id);
+                world.setBlock(x, y, z, Block.mudBaked.id);
             }
         }
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockPressurePlate.java b/src/main/java/net/minecraft/core/block/BlockPressurePlate.java
index 718229033..d7524bc80 100644
--- a/src/main/java/net/minecraft/core/block/BlockPressurePlate.java
+++ b/src/main/java/net/minecraft/core/block/BlockPressurePlate.java
@@ -1,33 +1,29 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.WorldSource;
 
 import java.util.List;
 import java.util.Random;
 
 public class BlockPressurePlate extends Block
 {
-    private final MobType triggerMobType;
+    private final Class<? extends Entity> triggerMobClass;
 
-    public enum MobType
-    {
-        EVERYTHING,
-        MOBS,
-        PLAYERS
-    }
-
-	public BlockPressurePlate(String key, int id, MobType mobType, Material material)
+	public BlockPressurePlate(String key, int id, Class<? extends Entity> mobType, Material material)
     {
         super(key, id, material);
-        triggerMobType = mobType;
+        triggerMobClass = mobType;
         setTicking(true);
         float pixel = 1 / 16f;
         setBlockBounds(pixel, 0.0F, pixel, 1.0F - pixel, pixel / 2, 1.0F - pixel);
@@ -60,13 +56,13 @@ public class BlockPressurePlate extends Block
     @Override
 	public boolean canPlaceBlockAt(World world, int x, int y, int z)
     {
-        return world.canPlaceOnSurfaceOfBlock(x, y - 1, z);
+        return world.canPlaceOnSurfaceOfBlock(x, y - 1, z) || world.isBlockNormalCube(x, y + 1, z);
     }
 
     @Override
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
     {
-        boolean flag = !world.canPlaceOnSurfaceOfBlock(x, y - 1, z);
+        boolean flag = !canPlaceBlockAt(world, x, y, z);
         if(flag)
         {
             dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
@@ -81,7 +77,7 @@ public class BlockPressurePlate extends Block
         {
             return;
         }
-        if (world.getBlockMetadata(x, y, z) != 0) {
+        if (isPressed(world.getBlockMetadata(x, y, z))) {
             updateState(world, x, y, z);
         }
     }
@@ -93,46 +89,36 @@ public class BlockPressurePlate extends Block
         {
             return;
         }
-        if (world.getBlockMetadata(x, y, z) != 1) {
+        if (!isPressed(world.getBlockMetadata(x, y, z))) {
             updateState(world, x, y, z);
         }
     }
 
     private void updateState(World world, int x, int y, int z)
     {
-        boolean isPressed = world.getBlockMetadata(x, y, z) == 1;
+        int meta = world.getBlockMetadata(x, y, z);
+        boolean isPressed = isPressed(meta);
+        boolean isCeiling = (meta & 0b10) != 0;
         boolean isSteppedOn = false;
         float f = 0.125F;
-        List<Entity> list = null;
-        if(triggerMobType == MobType.EVERYTHING)
-        {
-            list = world.getEntitiesWithinAABBExcludingEntity(null, AABB.getBoundingBoxFromPool((float)x + f, y, (float)z + f, (float)(x + 1) - f, (double)y + 0.25D, (float)(z + 1) - f));
-        }
-        if(triggerMobType == MobType.MOBS)
-        {
-            list = world.getEntitiesWithinAABB(EntityLiving.class, AABB.getBoundingBoxFromPool((float)x + f, y, (float)z + f, (float)(x + 1) - f, (double)y + 0.25D, (float)(z + 1) - f));
-        }
-        if(triggerMobType == MobType.PLAYERS)
-        {
-            list = world.getEntitiesWithinAABB(EntityPlayer.class, AABB.getBoundingBoxFromPool((float)x + f, y, (float)z + f, (float)(x + 1) - f, (double)y + 0.25D, (float)(z + 1) - f));
-        }
-        if(list != null && list.size() > 0)
+        List<Entity> list = world.getEntitiesWithinAABB(triggerMobClass, AABB.getBoundingBoxFromPool((float)x + f, y + (isCeiling ? .85f : 0f), (float)z + f, (float)(x + 1) - f, (double)y + (isCeiling ? 1 : 0.25D), (float)(z + 1) - f));;
+        if(list != null && !list.isEmpty())
         {
             isSteppedOn = true;
         }
         if(isSteppedOn && !isPressed)
         {
-            world.setBlockMetadataWithNotify(x, y, z, 1);
+            world.setBlockMetadataWithNotify(x, y, z, meta | 0b01);
             world.notifyBlocksOfNeighborChange(x, y, z, id);
-            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
+            world.notifyBlocksOfNeighborChange(x, y + (isCeiling ? 1 : -1), z, id);
             world.markBlocksDirty(x, y, z, x, y, z);
             world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5D, (double)y + 0.1D, (double)z + 0.5D, "random.click", 0.3F, 0.6F);
         }
         if(!isSteppedOn && isPressed)
         {
-            world.setBlockMetadataWithNotify(x, y, z, 0);
+            world.setBlockMetadataWithNotify(x, y, z, meta & 0b10);
             world.notifyBlocksOfNeighborChange(x, y, z, id);
-            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
+            world.notifyBlocksOfNeighborChange(x, y + (isCeiling ? 1 : -1), z, id);
             world.markBlocksDirty(x, y, z, x, y, z);
             world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5D, (double)y + 0.1D, (double)z + 0.5D, "random.click", 0.3F, 0.5F);
         }
@@ -145,10 +131,11 @@ public class BlockPressurePlate extends Block
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data)
     {
-        if(data > 0)
+        boolean isCeiling = (world.getBlockMetadata(x, y, z) & 0b10) != 0;
+        if(isPressed(data))
         {
             world.notifyBlocksOfNeighborChange(x, y, z, id);
-            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
+            world.notifyBlocksOfNeighborChange(x, y + (isCeiling ? 1 : -1), z, id);
         }
         super.onBlockRemoved(world, x, y, z, data);
     }
@@ -156,14 +143,24 @@ public class BlockPressurePlate extends Block
     @Override
     public void setBlockBoundsBasedOnState(World world, int x, int y, int z)
     {
-        boolean isPressed = world.getBlockMetadata(x, y, z) == 1;
+        int meta = world.getBlockMetadata(x, y, z);
+        boolean isPressed = isPressed(meta);
+        boolean isCeiling = (meta & 0b10) != 0;
         float pixel = 0.0625F;
         if(isPressed)
         {
-            setBlockBounds(pixel, 0.0F, pixel, 1.0F - pixel, 0.03125F, 1.0F - pixel);
+            if (isCeiling){
+                setBlockBounds(pixel, 1f - 0.03125F, pixel, 1.0F - pixel, 1f, 1.0F - pixel);
+            } else {
+                setBlockBounds(pixel, 0.0F, pixel, 1.0F - pixel, 0.03125F, 1.0F - pixel);
+            }
         } else
         {
-            setBlockBounds(pixel, 0.0F, pixel, 1.0F - pixel, 0.0625F, 1.0F - pixel);
+            if (isCeiling){
+                setBlockBounds(pixel, 1f - 0.0625F, pixel, 1.0F - pixel, 1f, 1.0F - pixel);
+            } else {
+                setBlockBounds(pixel, 0.0F, pixel, 1.0F - pixel, 0.0625F, 1.0F - pixel);
+            }
         }
     }
 
@@ -171,20 +168,25 @@ public class BlockPressurePlate extends Block
     public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
     {
 
-        return blockAccess.getBlockMetadata(x, y, z) > 0;
+        return isPressed(blockAccess.getBlockMetadata(x, y, z));
     }
 
     @Override
     public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
     {
-        if(world.getBlockMetadata(x, y, z) == 0)
+        int meta = world.getBlockMetadata(x, y, z);
+        boolean isCeiling = (meta & 0b10) != 0;
+        if(isPressed(world.getBlockMetadata(x, y, z)))
         {
-            return false;
+            return side == (isCeiling ? 0 : 1);
         } else
         {
-            return side == 1;
+            return false;
         }
     }
+    public boolean isPressed(int meta){
+        return (meta & 0b1) != 0;
+    }
 
     @Override
     public boolean canProvidePower()
@@ -197,4 +199,10 @@ public class BlockPressurePlate extends Block
     {
         return 1;
     }
+    @Override
+    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
+        if (!world.canPlaceOnSurfaceOfBlock(x, y - 1 , z) || (side.isHorizontal() && sideHeight > 0.5 && world.isBlockNormalCube(x, y + 1, z))){
+            world.setBlockMetadata(x, y, z, world.getBlockMetadata(x, y, z) | 0b10);
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockRope.java b/src/main/java/net/minecraft/core/block/BlockRope.java
new file mode 100644
index 000000000..2459ac1d4
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/BlockRope.java
@@ -0,0 +1,68 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.world.World;
+
+public class BlockRope
+    extends Block {
+    public BlockRope(String key, int id) {
+        super(key, id, Material.cloth);
+    }
+
+    @Override
+    public boolean renderAsNormalBlock() {
+        return false;
+    }
+
+    @Override
+    public boolean isSolidRender() {
+        return false;
+    }
+
+    @Override
+    public boolean isClimbable(World world, int x, int y, int z) {
+        return true;
+    }
+
+    @Override
+    public AABB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
+        return null;
+    }
+
+    @Override
+    public void setBlockBoundsBasedOnState(World world, int x, int y, int z)
+    {
+        boolean hasBlockNegX = world.getBlockId(x - 1, y, z) == this.id;
+        boolean hasBlockPosX = world.getBlockId(x + 1, y, z) == this.id;
+        boolean hasBlockNegY = world.getBlockId(x, y - 1, z) == this.id;
+        boolean hasBlockPosY = world.getBlockId(x, y + 1, z) == this.id || world.isBlockOpaqueCube(x, y + 1, z);
+        boolean hasBlockNegZ = world.getBlockId(x, y, z - 1) == this.id;
+        boolean hasBlockPosZ = world.getBlockId(x, y, z + 1) == this.id;
+
+        float minX = 5 / 16.0f;
+        float maxX = 11 / 16.0f;
+        float minY = 5 / 16.0f;
+        float maxY = 11 / 16.0f;
+        float minZ = 5 / 16.0f;
+        float maxZ = 11 / 16.0f;
+
+        if (hasBlockNegX) minX = 0;
+        if (hasBlockPosX) maxX = 1;
+        if (hasBlockNegY) minY = 0;
+        if (hasBlockPosY) maxY = 1;
+        if (hasBlockNegZ) minZ = 0;
+        if (hasBlockPosZ) maxZ = 1;
+
+        setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ);
+    }
+
+    @Override
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity) {
+        return new ItemStack[] { new ItemStack(Item.rope) };
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingOak.java b/src/main/java/net/minecraft/core/block/BlockSaplingOak.java
index 51f106945..ed366e8f9 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingOak.java
+++ b/src/main/java/net/minecraft/core/block/BlockSaplingOak.java
@@ -2,6 +2,7 @@ package net.minecraft.core.block;
 
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
+import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeCaatinga;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeFancy;
 import net.minecraft.core.world.generate.feature.WorldFeature;
 
@@ -22,8 +23,8 @@ public class BlockSaplingOak extends BlockSaplingBase
     @Override
 	public void growTree(World world, int i, int j, int k, Random random)
     {
-    	Object treeBig  = new WorldFeatureTreeFancy(Block.leavesOak.id, Block.logOak.id);
-        Object treeSmall = new WorldFeatureTree(Block.leavesOak.id, Block.logOak.id, 4);
+    	Object treeBig = new WorldFeatureTreeCaatinga(Block.leavesOak.id, Block.logOak.id);
+        Object treeSmall = new WorldFeatureTreeCaatinga(Block.leavesOak.id, Block.logOak.id);
     	world.setBlock(i, j, k, 0);
 
         if(!((WorldFeature) (treeSmall)).generate(world, random, i, j, k))
diff --git a/src/main/java/net/minecraft/core/block/BlockSpikes.java b/src/main/java/net/minecraft/core/block/BlockSpikes.java
index 2223c0c3a..7d39736bb 100644
--- a/src/main/java/net/minecraft/core/block/BlockSpikes.java
+++ b/src/main/java/net/minecraft/core/block/BlockSpikes.java
@@ -89,7 +89,7 @@ public class BlockSpikes extends BlockCobweb
     }
 
     @Override
-    public boolean collidesWithEntity(Entity entity) {
+    public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z) {
         return !(entity instanceof EntityItem);
     }
     
diff --git a/src/main/java/net/minecraft/core/block/BlockTrapDoorPainted.java b/src/main/java/net/minecraft/core/block/BlockTrapDoorPainted.java
new file mode 100644
index 000000000..ca1f87515
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/BlockTrapDoorPainted.java
@@ -0,0 +1,33 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.enums.PlacementMode;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+
+public class BlockTrapDoorPainted extends BlockTrapDoor{
+    public BlockTrapDoorPainted(String key, int id, Material material) {
+        super(key, id, material, false);
+    }
+    @Override
+    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
+        int meta = world.getBlockMetadata(x, y, z);
+        int colorBits = meta & 0xF0;
+        meta = getMetaForDirection(entity.getHorizontalPlacementDirection(side, PlacementMode.SIDE));
+        if(entity.getVerticalPlacementDirection(side, sideHeight) == Direction.UP) {
+            meta |= 8;
+        }
+        meta |= colorBits;
+        world.setBlockMetadata(x, y, z, meta);
+    }
+    @Override
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    {
+        return new ItemStack[] { new ItemStack(Block.trapdoorPlanksOakPainted, 1, (meta >> 4 & 0xF) << 4) };
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntity.java b/src/main/java/net/minecraft/core/block/entity/TileEntity.java
index 735a94100..a21ea60a5 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntity.java
+++ b/src/main/java/net/minecraft/core/block/entity/TileEntity.java
@@ -162,6 +162,6 @@ public class TileEntity
         addMapping(TileEntityFlag.class, "Flag");
         addMapping(TileEntitySeat.class, "Seat");
         addMapping(TileEntityFlowerJar.class, "FlowerJar");
-
+        addMapping(TileEntityMeshGold.class, "MeshGold");
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java b/src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java
new file mode 100644
index 000000000..67a716780
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java
@@ -0,0 +1,61 @@
+package net.minecraft.core.block.entity;
+
+import com.mojang.nbt.CompoundTag;
+import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet140TileEntityData;
+import org.jetbrains.annotations.Nullable;
+
+public class TileEntityMeshGold extends TileEntity{
+    @Nullable
+    public ItemStack filterItem;
+    public int ticksRan = 0;
+    public TileEntityMeshGold() {
+    }
+
+    public void tick()
+    {
+        if (ticksRan == 0){
+            ticksRan = worldObj.rand.nextInt(360);
+        }
+        ticksRan++;
+    }
+    public boolean setFilterItem(EntityPlayer player, @Nullable ItemStack stack){
+        boolean flag = false;
+        boolean wasNull = filterItem == null;
+        if (filterItem != null && player.getGamemode().consumeBlocks()){
+            player.inventory.insertItem(filterItem, true);
+            flag = true;
+        }
+        if (stack != null) {
+            stack.consumeItem(player);
+            filterItem = new ItemStack(stack.getItem(), 1, stack.getMetadata(), stack.getData());
+            return true;
+        }
+        filterItem = null;
+        return flag | !wasNull;
+    }
+    @Override
+    public void readFromNBT(CompoundTag compoundTag)
+    {
+        super.readFromNBT(compoundTag);
+        if (compoundTag.getBoolean("hasItem")){
+            filterItem = ItemStack.readItemStackFromNbt(compoundTag.getCompound("item"));
+        }
+    }
+
+    @Override
+    public void writeToNBT(CompoundTag compoundTag)
+    {
+        super.writeToNBT(compoundTag);
+        if (filterItem != null){
+            compoundTag.putCompound("item", filterItem.writeToNBT(new CompoundTag()));
+            compoundTag.putBoolean("hasItem", true);
+        }
+    }
+    @Override
+    public Packet getDescriptionPacket() {
+        return new Packet140TileEntityData(this);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/entity/ConsumedFood.java b/src/main/java/net/minecraft/core/entity/ConsumedFood.java
new file mode 100644
index 000000000..920164a73
--- /dev/null
+++ b/src/main/java/net/minecraft/core/entity/ConsumedFood.java
@@ -0,0 +1,36 @@
+package net.minecraft.core.entity;
+
+import net.minecraft.core.item.ItemFood;
+
+public class ConsumedFood {
+    private final EntityLiving entity;
+    private final ItemFood food;
+    private int healRemaining;
+    private int tickCounter = 0;
+
+    public ConsumedFood(EntityLiving entity, ItemFood food) {
+        this.entity = entity;
+        this.food = food;
+
+        this.healRemaining = food.getHealAmount();
+    }
+
+    public void addFood() {
+        healRemaining += food.getHealAmount();
+    }
+
+    public boolean isFinished() {
+        return healRemaining <= 0;
+    }
+
+    public void tick() {
+        if (isFinished()) return;
+
+        tickCounter++;
+        if (tickCounter >= food.getTicksPerHeal()) {
+            tickCounter = 0;
+            healRemaining--;
+            entity.heal(1);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/entity/EntityBobber.java b/src/main/java/net/minecraft/core/entity/EntityBobber.java
index e5d98de10..b85e5663a 100644
--- a/src/main/java/net/minecraft/core/entity/EntityBobber.java
+++ b/src/main/java/net/minecraft/core/entity/EntityBobber.java
@@ -16,27 +16,32 @@ import net.minecraft.core.util.helper.DamageType;
 
 import java.util.List;
 
-// Referenced classes of package net.minecraft.src:
-//            Entity, EntityPlayer, MathHelper, AxisAlignedBB, 
-//            World, ItemStack, Item, Vec3D, 
-//            MovingObjectPosition, Material, NBTTagCompound, EntityItem, 
-//            StatList
-
 public class EntityBobber extends Entity
 {
+    private int xTile;
+    private int yTile;
+    private int zTile;
+    private boolean inGround;
+    public EntityPlayer player;
+    private int ticksInAir;
+    private int ticksCatchable;
+    public Entity hookedEntity;
+    private int field_6388_l;
+    private double field_6387_m;
+    private double field_6386_n;
+    private double field_6385_o;
+    private double field_6384_p;
+    private double field_6383_q;
+    private double velocityX;
+    private double velocityY;
+    private double velocityZ;
 
     public EntityBobber(World world)
     {
         super(world);
-        xTile = -1;
-        yTile = -1;
-        zTile = -1;
-        inTile = 0;
-        inGround = false;
-        shake = 0;
         ticksInAir = 0;
         ticksCatchable = 0;
-        bobber = null;
+        hookedEntity = null;
         setSize(0.25F, 0.25F);
         ignoreFrustumCheck = true;
     }
@@ -51,29 +56,23 @@ public class EntityBobber extends Entity
     public EntityBobber(World world, EntityPlayer entityplayer)
     {
         super(world);
-        xTile = -1;
-        yTile = -1;
-        zTile = -1;
-        inTile = 0;
-        inGround = false;
-        shake = 0;
         ticksInAir = 0;
         ticksCatchable = 0;
-        bobber = null;
+        hookedEntity = null;
         ignoreFrustumCheck = true;
-        angler = entityplayer;
-        angler.fishEntity = this;
+        player = entityplayer;
+        player.bobberEntity = this;
         setSize(0.25F, 0.25F);
         moveTo(entityplayer.x, (entityplayer.y + 1.62D) - (double)entityplayer.heightOffset, entityplayer.z, entityplayer.yRot, entityplayer.xRot);
-        x -= MathHelper.cos((yRot / 180F) * 3.141593F) * 0.16F;
-        y -= 0.10000000149011612D;
-        z -= MathHelper.sin((yRot / 180F) * 3.141593F) * 0.16F;
+        x -= MathHelper.cos((yRot / 180F) * MathHelper.PI) * 0.16F;
+        y -= 0.1D;
+        z -= MathHelper.sin((yRot / 180F) * MathHelper.PI) * 0.16F;
         setPos(x, y, z);
         heightOffset = 0.0F;
         float f = 0.4F;
-        xd = -MathHelper.sin((yRot / 180F) * 3.141593F) * MathHelper.cos((xRot / 180F) * 3.141593F) * f;
-        zd = MathHelper.cos((yRot / 180F) * 3.141593F) * MathHelper.cos((xRot / 180F) * 3.141593F) * f;
-        yd = -MathHelper.sin((xRot / 180F) * 3.141593F) * f;
+        xd = -MathHelper.sin((yRot / 180F) * MathHelper.PI) * MathHelper.cos((xRot / 180F) * MathHelper.PI) * f;
+        zd = MathHelper.cos((yRot / 180F) * MathHelper.PI) * MathHelper.cos((xRot / 180F) * MathHelper.PI) * f;
+        yd = -MathHelper.sin((xRot / 180F) * MathHelper.PI) * f;
         func_4042_a(xd, yd, zd, 1.5F, 1.0F);
     }
 
@@ -97,9 +96,9 @@ public class EntityBobber extends Entity
         d /= f2;
         d1 /= f2;
         d2 /= f2;
-        d += random.nextGaussian() * 0.0074999998323619366D * (double)f1;
-        d1 += random.nextGaussian() * 0.0074999998323619366D * (double)f1;
-        d2 += random.nextGaussian() * 0.0074999998323619366D * (double)f1;
+        d += random.nextGaussian() * 0.0075D * (double)f1;
+        d1 += random.nextGaussian() * 0.0075D * (double)f1;
+        d2 += random.nextGaussian() * 0.0075D * (double)f1;
         d *= f;
         d1 *= f;
         d2 *= f;
@@ -107,9 +106,8 @@ public class EntityBobber extends Entity
         yd = d1;
         zd = d2;
         float f3 = MathHelper.sqrt_double(d * d + d2 * d2);
-        yRotO = yRot = (float)((java.lang.Math.atan2(d, d2) * 180D) / 3.1415927410125732D);
-        xRotO = xRot = (float)((java.lang.Math.atan2(d1, f3) * 180D) / 3.1415927410125732D);
-        ticksInGround = 0;
+        yRotO = yRot = (float)((Math.atan2(d, d2) * 180D) / Math.PI);
+        xRotO = xRot = (float)((Math.atan2(d1, f3) * 180D) / Math.PI);
     }
 
     @Override
@@ -156,120 +154,107 @@ public class EntityBobber extends Entity
         }
         if(!world.isClientSide)
         {
-            ItemStack itemstack = angler.getCurrentEquippedItem();
-            if(angler.removed || !angler.isAlive() || itemstack == null || itemstack.getItem() != Item.toolFishingrod || distanceToSqr(angler) > 1024D)
+            ItemStack heldPlayerItem = player.getCurrentEquippedItem();
+            if(player.removed || !player.isAlive() || heldPlayerItem == null || heldPlayerItem.getItem() != Item.toolFishingrod || distanceToSqr(player) > 1024D)
             {
                 remove();
-                angler.fishEntity = null;
+                player.bobberEntity = null;
                 return;
             }
-            if(bobber != null)
+            if(hookedEntity != null)
             {
-                if(bobber.removed)
+                if(hookedEntity.removed)
                 {
-                    bobber = null;
+                    hookedEntity = null;
                 } else
                 {
-                    x = bobber.x;
-                    y = bobber.bb.minY + (double)bobber.bbHeight * 0.80000000000000004D;
-                    z = bobber.z;
+                    x = hookedEntity.x;
+                    y = hookedEntity.bb.minY + (double) hookedEntity.bbHeight * 0.8D;
+                    z = hookedEntity.z;
                     return;
                 }
             }
         }
-        if(shake > 0)
-        {
-            shake--;
-        }
-        if(inGround)
-        {
-            int i = world.getBlockId(xTile, yTile, zTile);
-            if(i != inTile)
-            {
+        if (inGround) {
+            if (world.getBlockId(xTile, yTile, zTile) == Block.rope.id) {
+                x = xTile + 0.5D;
+                y = yTile + 0.5D;
+                z = zTile + 0.5D;
+                return;
+            } else {
                 inGround = false;
                 xd *= random.nextFloat() * 0.2F;
                 yd *= random.nextFloat() * 0.2F;
                 zd *= random.nextFloat() * 0.2F;
-                ticksInGround = 0;
                 ticksInAir = 0;
-            } else
-            {
-                ticksInGround++;
-                if(ticksInGround == 1200)
-                {
-                    remove();
-                }
-                return;
+                ticksCatchable = 0;
             }
-        } else
-        {
-            ticksInAir++;
         }
-        Vec3d vec3d = Vec3d.createVector(x, y, z);
-        Vec3d vec3d1 = Vec3d.createVector(x + xd, y + yd, z + zd);
-        HitResult movingobjectposition = world.checkBlockCollisionBetweenPoints(vec3d, vec3d1);
-        vec3d = Vec3d.createVector(x, y, z);
-        vec3d1 = Vec3d.createVector(x + xd, y + yd, z + zd);
-        if(movingobjectposition != null)
+        ticksInAir++;
+        Vec3d currentPos = Vec3d.createVector(x, y, z);
+        Vec3d nextPos = Vec3d.createVector(x + xd, y + yd, z + zd);
+        HitResult hitResult = world.checkBlockCollisionBetweenPoints(currentPos, nextPos);
+        currentPos = Vec3d.createVector(x, y, z);
+        nextPos = Vec3d.createVector(x + xd, y + yd, z + zd);
+        if(hitResult != null)
         {
-            vec3d1 = Vec3d.createVector(movingobjectposition.location.xCoord, movingobjectposition.location.yCoord, movingobjectposition.location.zCoord);
+            nextPos = Vec3d.createVector(hitResult.location.xCoord, hitResult.location.yCoord, hitResult.location.zCoord);
+            if (hitResult.hitType == HitResult.HitType.TILE && world.getBlockId(hitResult.x, hitResult.y, hitResult.z) == Block.rope.id) {
+                inGround = true;
+                xTile = hitResult.x;
+                yTile = hitResult.y;
+                zTile = hitResult.z;
+            }
         }
         Entity entity = null;
-        List list = world.getEntitiesWithinAABBExcludingEntity(this, bb.addCoord(xd, yd, zd).expand(1.0D, 1.0D, 1.0D));
+        List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.addCoord(xd, yd, zd).expand(1.0D, 1.0D, 1.0D));
         double d3 = 0.0D;
-        for(int j = 0; j < list.size(); j++)
+        for (Entity e : list)
         {
-            Entity entity1 = (Entity)list.get(j);
-            if(!entity1.isPickable() || entity1 == angler && ticksInAir < 5)
-            {
+            if (!e.isPickable() || e == player && ticksInAir < 5) {
                 continue;
             }
             float f2 = 0.3F;
-            AABB axisalignedbb = entity1.bb.expand(f2, f2, f2);
-            HitResult movingobjectposition1 = axisalignedbb.func_1169_a(vec3d, vec3d1);
-            if(movingobjectposition1 == null)
-            {
+            AABB aabb = e.bb.expand(f2, f2, f2);
+            HitResult newHitResult = aabb.func_1169_a(currentPos, nextPos);
+            if (newHitResult == null) {
                 continue;
             }
-            double d6 = vec3d.distanceTo(movingobjectposition1.location);
-            if(d6 < d3 || d3 == 0.0D)
-            {
-                entity = entity1;
+            double d6 = currentPos.distanceTo(newHitResult.location);
+            if (d6 < d3 || d3 == 0.0D) {
+                entity = e;
                 d3 = d6;
             }
         }
 
         if(entity != null)
         {
-            movingobjectposition = new HitResult(entity);
+            hitResult = new HitResult(entity);
         }
-        if(movingobjectposition != null)
+        if(hitResult != null)
         {
-            if(movingobjectposition.entity != null)
+            if(hitResult.entity != null)
             {
-                if(movingobjectposition.entity.hurt(angler, 0, DamageType.COMBAT))
+                if(hitResult.entity.hurt(player, 0, DamageType.COMBAT))
                 {
-                    bobber = movingobjectposition.entity;
+                    hookedEntity = hitResult.entity;
                 }
             }
         }
-        if(inGround)
-        {
-            return;
-        }
         move(xd, yd, zd);
         float f = MathHelper.sqrt_double(xd * xd + zd * zd);
-        yRot = (float)((java.lang.Math.atan2(xd, zd) * 180D) / 3.1415927410125732D);
-        for(xRot = (float)((java.lang.Math.atan2(yd, f) * 180D) / 3.1415927410125732D); xRot - xRotO < -180F; xRotO -= 360F) { }
+        yRot = (float)((java.lang.Math.atan2(xd, zd) * 180D) / Math.PI);
+        for(xRot = (float)((java.lang.Math.atan2(yd, f) * 180D) / Math.PI); xRot - xRotO < -180F; xRotO -= 360F) { }
         for(; xRot - xRotO >= 180F; xRotO += 360F) { }
         for(; yRot - yRotO < -180F; yRotO -= 360F) { }
         for(; yRot - yRotO >= 180F; yRotO += 360F) { }
         xRot = xRotO + (xRot - xRotO) * 0.2F;
         yRot = yRotO + (yRot - yRotO) * 0.2F;
-        float f1 = 0.92F;
+
+        float movementScale = 0.92F;
         if(onGround || horizontalCollision)
         {
-            f1 = 0.5F;
+            movementScale = 0.5F;
         }
         int k = 5;
         double d5 = 0.0D;
@@ -296,16 +281,19 @@ public class EntityBobber extends Entity
                 int rainRate = 0;
                 int algaeRate = 0;
                 if(world.canBlockBeRainedOn(MathHelper.floor_double(x), MathHelper.floor_double(y) + 1, MathHelper.floor_double(z)))
+                {
                     rainRate = 200;
+                }
 
-                if(world.getBlockId(MathHelper.floor_double(x), MathHelper.floor_double(y) + 1, MathHelper.floor_double(z)) == Block.algae.id)
+                if(world.getBlockId(MathHelper.floor_double(x), MathHelper.floor_double(y) + 1, MathHelper.floor_double(z)) == Block.algae.id) {
                     algaeRate = 100;
+                }
                 catchRate = (catchRate - rainRate) - algaeRate;
 
                 if(random.nextInt(catchRate) == 0)
                 {
                     ticksCatchable = random.nextInt(30) + 10;
-                    yd -= 0.20000000298023224D;
+                    yd -= 0.2D;
                     world.playSoundAtEntity(null, this, "random.splash", 0.25F, 1.0F + (random.nextFloat() - random.nextFloat()) * 0.4F);
                     float f3 = MathHelper.floor_double(bb.minY);
                     for(int i1 = 0; (float)i1 < 1.0F + bbWidth * 20F; i1++)
@@ -327,41 +315,29 @@ public class EntityBobber extends Entity
         }
         if(ticksCatchable > 0)
         {
-            yd -= (double)(random.nextFloat() * random.nextFloat() * random.nextFloat()) * 0.20000000000000001D;
+            yd -= (double)(random.nextFloat() * random.nextFloat() * random.nextFloat()) * 0.2D;
         }
         double d7 = d5 * 2D - 1.0D;
-        yd += 0.039999999105930328D * d7;
+        yd += 0.04D * d7;
         if(d5 > 0.0D)
         {
-            f1 = (float)((double)f1 * 0.90000000000000002D);
-            yd *= 0.80000000000000004D;
+            movementScale = (float)((double)movementScale * 0.9D);
+            yd *= 0.8D;
         }
-        xd *= f1;
-        yd *= f1;
-        zd *= f1;
+        xd *= movementScale;
+        yd *= movementScale;
+        zd *= movementScale;
         setPos(x, y, z);
     }
 
     @Override
 	public void addAdditionalSaveData(CompoundTag tag)
     {
-        tag.putShort("xTile", (short)xTile);
-        tag.putShort("yTile", (short)yTile);
-        tag.putShort("zTile", (short)zTile);
-        tag.putShort("inTile", (short)inTile);
-        tag.putByte("shake", (byte)shake);
-        tag.putByte("inGround", (byte)(inGround ? 1 : 0));
     }
 
     @Override
 	public void readAdditionalSaveData(CompoundTag tag)
     {
-        xTile = tag.getShort("xTile");
-        yTile = tag.getShort("yTile");
-        zTile = tag.getShort("zTile");
-        inTile = tag.getShort("inTile") & 0x3fff;
-        shake = tag.getByte("shake") & 0xff;
-        inGround = tag.getByte("inGround") == 1;
     }
 
     @Override
@@ -370,63 +346,62 @@ public class EntityBobber extends Entity
         return 0.0F;
     }
 
-    public int catchFish()
+    public int yoink()
     {
-        byte byte0 = 0;
-        if(bobber != null)
+        int damage = 0;
+
+        if(inGround)
         {
-            double d = angler.x - x;
-            double d2 = angler.y - y;
-            double d4 = angler.z - z;
-            double d6 = MathHelper.sqrt_double(d * d + d2 * d2 + d4 * d4);
-            double d8 = 0.10000000000000001D;
-            bobber.xd += d * d8;
-            bobber.yd += d2 * d8 + (double) MathHelper.sqrt_double(d6) * 0.080000000000000002D;
-            bobber.zd += d4 * d8;
-            byte0 = 3;
-        } else
-        if(ticksCatchable > 0)
+            double dx = x - player.x;
+            double dy = y - player.y;
+            double dz = z - player.z;
+            double distance = MathHelper.sqrt_double(dx * dx + dy * dy + dz * dz);
+            dx /= distance;
+            dy /= distance;
+            dz /= distance;
+            double clamp = 0.6D;
+            dx = MathHelper.clamp(dx, -clamp, clamp);
+            dy = MathHelper.clamp(dy, -clamp, clamp);
+            dz = MathHelper.clamp(dz, -clamp, clamp);
+            double scale = 2D;
+            player.xd += dx * scale;
+            player.yd += dy * scale;
+            player.zd += dz * scale;
+            damage = 5;
+        }
+        if(hookedEntity != null)
+        {
+            double dx = player.x - x;
+            double dy = player.y - y;
+            double dz = player.z - z;
+            double distance = MathHelper.sqrt_double(dx * dx + dy * dy + dz * dz);
+            double scale = 0.1D;
+            hookedEntity.xd += dx * scale;
+            hookedEntity.yd += dy * scale + (double) MathHelper.sqrt_double(distance) * 0.08D;
+            hookedEntity.zd += dz * scale;
+            damage = 3;
+        }
+        else if(ticksCatchable > 0)
         {
             EntityItem entityitem = new EntityItem(world, x, y, z, new ItemStack(Item.foodFishRaw));
-            double d1 = angler.x - x;
-            double d3 = angler.y - y;
-            double d5 = angler.z - z;
-            double d7 = MathHelper.sqrt_double(d1 * d1 + d3 * d3 + d5 * d5);
-            double d9 = 0.10000000000000001D;
-            entityitem.xd = d1 * d9;
-            entityitem.yd = d3 * d9 + (double) MathHelper.sqrt_double(d7) * 0.080000000000000002D;
-            entityitem.zd = d5 * d9;
+            double dx = player.x - x;
+            double dy = player.y - y;
+            double dz = player.z - z;
+            double distance = MathHelper.sqrt_double(dx * dx + dy * dy + dz * dz);
+            double scale = 0.1D;
+            entityitem.xd = dx * scale;
+            entityitem.yd = dy * scale + (double) MathHelper.sqrt_double(distance) * 0.08D;
+            entityitem.zd = dz * scale;
             world.entityJoinedWorld(entityitem);
-            angler.addStat(StatList.fishCaughtStat, 1);
-            byte0 = 1;
+            player.addStat(StatList.fishCaughtStat, 1);
+            damage = 1;
         }
         if(inGround)
         {
-            byte0 = 2;
+            damage = 2;
         }
         remove();
-        angler.fishEntity = null;
-        return byte0;
+        player.bobberEntity = null;
+        return damage;
     }
-
-    private int xTile;
-    private int yTile;
-    private int zTile;
-    private int inTile;
-    private boolean inGround;
-    public int shake;
-    public EntityPlayer angler;
-    private int ticksInGround;
-    private int ticksInAir;
-    private int ticksCatchable;
-    public Entity bobber;
-    private int field_6388_l;
-    private double field_6387_m;
-    private double field_6386_n;
-    private double field_6385_o;
-    private double field_6384_p;
-    private double field_6383_q;
-    private double velocityX;
-    private double velocityY;
-    private double velocityZ;
 }
diff --git a/src/main/java/net/minecraft/core/entity/EntityItem.java b/src/main/java/net/minecraft/core/entity/EntityItem.java
index 1f578227a..9a85cadd1 100644
--- a/src/main/java/net/minecraft/core/entity/EntityItem.java
+++ b/src/main/java/net/minecraft/core/entity/EntityItem.java
@@ -31,7 +31,7 @@ public class EntityItem extends Entity
         super(world);
         age = 0;
         health = 5;
-        field_804_d = (float)(java.lang.Math.random() * 3.1415926535897931D * 2D);
+        initialRotation = (float)(java.lang.Math.random() * Math.PI * 2D);
         setSize(0.25F, 0.25F);
         heightOffset = bbHeight / 2.0F;
         setPos(d, d1, d2);
@@ -57,7 +57,7 @@ public class EntityItem extends Entity
         super(world);
         age = 0;
         health = 5;
-        field_804_d = (float)(java.lang.Math.random() * 3.1415926535897931D * 2D);
+        initialRotation = (float)(java.lang.Math.random() * 3.1415926535897931D * 2D);
         setSize(0.25F, 0.25F);
         heightOffset = bbHeight / 2.0F;
     }
@@ -272,7 +272,7 @@ public class EntityItem extends Entity
     public int age;
     public int delayBeforeCanPickup;
     private int health;
-    public float field_804_d;
+    public float initialRotation;
     public int basketPickupDelay = 0;
     public static boolean enableItemClumping = true;
 }
diff --git a/src/main/java/net/minecraft/core/entity/EntityLiving.java b/src/main/java/net/minecraft/core/entity/EntityLiving.java
index dd8163388..b15c41f72 100644
--- a/src/main/java/net/minecraft/core/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/core/entity/EntityLiving.java
@@ -1,6 +1,8 @@
 package net.minecraft.core.entity;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import com.b100.utils.StringUtils;
 import com.mojang.nbt.CompoundTag;
@@ -15,6 +17,7 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.enums.PlacementMode;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemFood;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.util.helper.DamageType;
@@ -229,6 +232,12 @@ public abstract class EntityLiving extends Entity
 
             }
         }
+        for (Map.Entry<ItemFood, ConsumedFood> entry : consumedFood.entrySet()) {
+            entry.getValue().tick();
+            if (entry.getValue().isFinished()) {
+                consumedFood.remove(entry.getKey());
+            }
+        }
         prevRotationUnused = unusedRotation1;
         prevRenderYawOffset = renderYawOffset;
         yRotO = yRot;
@@ -382,6 +391,19 @@ public abstract class EntityLiving extends Entity
         return 10;
     }
 
+    public void eatFood(ItemFood food) {
+        if (food == null) return;
+        if (food.getTicksPerHeal() == 0) {
+            heal(food.getHealAmount());
+        } else {
+            if (consumedFood.containsKey(food)) {
+                consumedFood.get(food).addFood();
+            } else {
+                consumedFood.put(food, new ConsumedFood(this, food));
+            }
+        }
+    }
+
     @Override
     public boolean hurt(Entity attacker, int damage, DamageType type)
     {
@@ -409,6 +431,7 @@ public abstract class EntityLiving extends Entity
         {
             lastDamage = damage;
             prevHealth = getHealth();
+            prevBonusHealth = bonusHealth;
             heartsFlashTime = heartsHalvesLife;
             damageEntity(damage, type);
             hurtTime = maxHurtTime = 10;
@@ -1184,7 +1207,8 @@ public abstract class EntityLiving extends Entity
     	}
     	return xRot < 0.0f ? Direction.UP : Direction.DOWN;
     }
-	
+
+    protected Map<ItemFood, ConsumedFood> consumedFood = new HashMap<ItemFood, ConsumedFood>();
     public int heartsHalvesLife;
     public float unusedRotationPitch2;
     public float unusedRotationPitch;
@@ -1205,6 +1229,8 @@ public abstract class EntityLiving extends Entity
     public float prevSwingProgress;
     public float swingProgress;
     public int prevHealth;
+    public int bonusHealth;
+    public int prevBonusHealth;
     private int livingSoundTime;
     public int hurtTime;
     public int maxHurtTime;
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntityWolf.java b/src/main/java/net/minecraft/core/entity/animal/EntityWolf.java
index 33533782b..e8b1e4ea4 100644
--- a/src/main/java/net/minecraft/core/entity/animal/EntityWolf.java
+++ b/src/main/java/net/minecraft/core/entity/animal/EntityWolf.java
@@ -272,7 +272,7 @@ public class EntityWolf extends EntityAnimal
 
         if (getTarget() instanceof EntityItem)
         {
-            if (getTarget().isInWater() || getTarget().isInLava() || getTarget().isInWall())
+            if (getTarget().isInWater() || getTarget().isInLava() || getTarget().isInWall() || !getTarget().onGround || getTarget().isRemoved())
             {
                 setTarget(null);
             }
@@ -316,7 +316,7 @@ public class EntityWolf extends EntityAnimal
                         continue;
                     }
 
-                    if (item.isInWater() || item.isInLava() || item.isInWall())
+                    if (item.isInWater() || item.isInLava() || item.isInWall() || !item.onGround || item.isRemoved())
                     {
                         triedItems.add(item);
                         continue;
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntitySnowman.java b/src/main/java/net/minecraft/core/entity/monster/EntitySnowman.java
index 04f5ba63c..e525b393e 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntitySnowman.java
+++ b/src/main/java/net/minecraft/core/entity/monster/EntitySnowman.java
@@ -105,4 +105,21 @@ public class EntitySnowman extends EntityMonster
         return "mob.zombiedeath";
     }
 
+    @Override
+    protected void dropFewItems()
+    {
+        int i = Item.ammoSnowball.id;
+        if(i > 0)
+        {
+            int j = random.nextInt(3);
+            if (random.nextInt(1000) == 0) {
+                id = Item.bucketIcecream.id;
+                j = 1;
+            }
+            for(int k = 0; k < j; k++)
+            {
+                spawnAtLocation(i, 1);
+            }
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java b/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java
index 05a3854b9..ee9b0542c 100644
--- a/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java
+++ b/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java
@@ -64,7 +64,7 @@ public abstract class EntityPlayer extends EntityLiving
         swingProgressInt = 0;
         timeUntilPortal = 20;
         inPortal = false;
-        fishEntity = null;
+        bobberEntity = null;
         inventorySlots = new ContainerPlayer(inventory, !world.isClientSide);
         craftingInventory = inventorySlots;
         heightOffset = 1.62F;
@@ -1393,7 +1393,7 @@ public abstract class EntityPlayer extends EntityLiving
     public Gamemode gamemode = Gamemode.survival;
     public byte field_9371_f;
     public int score;
-    public List<String> messages = new ArrayList<>();
+    public List<String> messageHistory = new ArrayList<>();
     public float field_775_e;
     public float field_774_f;
     public boolean isSwinging;
@@ -1421,7 +1421,7 @@ public abstract class EntityPlayer extends EntityLiving
     public float timeInPortal;
     public float prevTimeInPortal;
     private final int damageRemainder;
-    public EntityBobber fishEntity;
+    public EntityBobber bobberEntity;
     public volatile String skinURL;
     public volatile String capeURL;
     public boolean slimModel = false;
diff --git a/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java b/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java
index 1bbf95ea4..cba03dafb 100644
--- a/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java
+++ b/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java
@@ -245,8 +245,14 @@ label0:
         {
             minecartCurrentDamage--;
         }
+        double _x = x;
+        double _y = y;
+        double _z = z;
     	onUpdate2();
     	onUpdate2();
+        this.xo = _x;
+        this.yo = _y;
+        this.zo = _z;
     }
 
     public void onUpdate2()
diff --git a/src/main/java/net/minecraft/core/item/Item.java b/src/main/java/net/minecraft/core/item/Item.java
index eec9bfe93..f26d8c7d1 100644
--- a/src/main/java/net/minecraft/core/item/Item.java
+++ b/src/main/java/net/minecraft/core/item/Item.java
@@ -3,7 +3,6 @@ package net.minecraft.core.item;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.material.Material;
 import net.minecraft.core.data.tag.ITaggable;
 import net.minecraft.core.data.tag.Tag;
 import net.minecraft.core.entity.Entity;
@@ -222,12 +221,6 @@ public class Item
         return I18n.getInstance().translateNameKey(getKey());
     }
 
-    public Item setNotInCreativeMenu()
-    {
-        notInCreativeMenu = true;
-        return this;
-    }
-
     public void inventoryTick(ItemStack itemstack, World world, Entity entity, int i, boolean flag)
     {
     }
@@ -243,7 +236,7 @@ public class Item
     
     public boolean isSilkTouch()
     {
-        return this.hasTag(ItemTags.isSilkTouch);
+        return this.hasTag(ItemTags.IS_SILK_TOUCH);
     }
     
     public boolean hasInventoryInteraction() {
@@ -262,34 +255,35 @@ public class Item
     public static final Map<String, Integer> nameToIdMap = new HashMap<>();
 
     public static Item[] itemsList = new Item[32768];
+
     public static Item toolShovelIron = (new ItemToolShovel("tool.shovel.iron", 16384, ToolMaterial.iron));
     public static Item toolPickaxeIron = (new ItemToolPickaxe("tool.pickaxe.iron", 16385, ToolMaterial.iron));
     public static Item toolAxeIron = (new ItemToolAxe("tool.axe.iron", 16386, ToolMaterial.iron));
     public static Item toolFirestriker = (new ItemFirestriker("tool.firestriker", 16387));
-    public static Item foodApple = (new ItemFood("food.apple", 16388, 4, false));
+    public static Item foodApple = (new ItemFood("food.apple", 16388, 4, 4, false, 16));
     public static Item toolBow = (new ItemBow("tool.bow", 16389));
     public static Item ammoArrow = (new Item("ammo.arrow", 16390));
     public static Item coal = (new ItemCoal("coal", 16391));
     public static Item diamond = (new Item("diamond", 16392));
     public static Item ingotIron = (new Item("ingot.iron", 16393));
     public static Item ingotGold = (new Item("ingot.gold", 16394));
-    public static Item toolSwordIron = (new ItemToolSword("tool.sword.iron", 16395, ToolMaterial.iron)).withTags(ItemTags.preventCreativeMining);
-    public static Item toolSwordWood = (new ItemToolSword("tool.sword.wood", 16396, ToolMaterial.wood)).withTags(ItemTags.preventCreativeMining);
+    public static Item toolSwordIron = (new ItemToolSword("tool.sword.iron", 16395, ToolMaterial.iron)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
+    public static Item toolSwordWood = (new ItemToolSword("tool.sword.wood", 16396, ToolMaterial.wood)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
     public static Item toolShovelWood = (new ItemToolShovel("tool.shovel.wood", 16397, ToolMaterial.wood));
     public static Item toolPickaxeWood = (new ItemToolPickaxe("tool.pickaxe.wood", 16398, ToolMaterial.wood));
     public static Item toolAxeWood = (new ItemToolAxe("tool.axe.wood", 16399, ToolMaterial.wood));
-    public static Item toolSwordStone = (new ItemToolSword("tool.sword.stone", 16400, ToolMaterial.stone)).withTags(ItemTags.preventCreativeMining);
+    public static Item toolSwordStone = (new ItemToolSword("tool.sword.stone", 16400, ToolMaterial.stone)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
     public static Item toolShovelStone = (new ItemToolShovel("tool.shovel.stone", 16401, ToolMaterial.stone));
     public static Item toolPickaxeStone = (new ItemToolPickaxe("tool.pickaxe.stone", 16402, ToolMaterial.stone));
     public static Item toolAxeStone = (new ItemToolAxe("tool.axe.stone", 16403, ToolMaterial.stone));
-    public static Item toolSwordDiamond = (new ItemToolSword("tool.sword.diamond", 16404, ToolMaterial.diamond)).withTags(ItemTags.preventCreativeMining);
+    public static Item toolSwordDiamond = (new ItemToolSword("tool.sword.diamond", 16404, ToolMaterial.diamond)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
     public static Item toolShovelDiamond = (new ItemToolShovel("tool.shovel.diamond", 16405, ToolMaterial.diamond));
     public static Item toolPickaxeDiamond = (new ItemToolPickaxe("tool.pickaxe.diamond", 16406, ToolMaterial.diamond));
     public static Item toolAxeDiamond = (new ItemToolAxe("tool.axe.diamond", 16407, ToolMaterial.diamond));
     public static Item stick = (new Item("stick", 16408));
     public static Item bowl = (new Item("bowl", 16409));
-    public static Item foodStewMushroom = (new ItemSoup("food.stew.mushroom", 16410, 10));
-    public static Item toolSwordGold = (new ItemToolSword("tool.sword.gold", 16411, ToolMaterial.gold)).withTags(ItemTags.preventCreativeMining);
+    public static Item foodStewMushroom = (new ItemSoup("food.stew.mushroom", 16410, 10, 8));
+    public static Item toolSwordGold = (new ItemToolSword("tool.sword.gold", 16411, ToolMaterial.gold)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
     public static Item toolShovelGold = (new ItemToolShovel("tool.shovel.gold", 16412, ToolMaterial.gold));
     public static Item toolPickaxeGold = (new ItemToolPickaxe("tool.pickaxe.gold", 16413, ToolMaterial.gold));
     public static Item toolAxeGold = (new ItemToolAxe("tool.axe.gold", 16414, ToolMaterial.gold));
@@ -303,7 +297,7 @@ public class Item
     public static Item toolHoeGold = (new ItemToolHoe("tool.hoe.gold", 16422, ToolMaterial.gold));
     public static Item seedsWheat = (new ItemSeeds("seeds.wheat", 16423, Block.cropsWheat));
     public static Item wheat = (new Item("wheat", 16424));
-    public static Item foodBread = (new ItemFood("food.bread", 16425, 5, false));
+    public static Item foodBread = (new ItemFood("food.bread", 16425, 5, 6, false, 16));
 
     public static Item armorHelmetLeather = (new ItemArmor("armor.helmet.leather", 16426, ArmorMaterial.LEATHER, 0));
     public static Item armorChestplateLeather = (new ItemArmor("armor.chestplate.leather", 16427, ArmorMaterial.LEATHER, 1));
@@ -330,18 +324,18 @@ public class Item
     public static Item armorLeggingsGold = (new ItemArmor("armor.leggings.gold", 16444, ArmorMaterial.GOLD, 2));
     public static Item armorBootsGold = (new ItemArmor("armor.boots.gold", 16445, ArmorMaterial.GOLD, 3));
     public static Item flint = (new Item("flint", 16446));
-    public static Item foodPorkchopRaw = (new ItemFood("food.porkchop.raw", 16447, 3, true));
-    public static Item foodPorkchopCooked = (new ItemFood("food.porkchop.cooked", 16448, 8, true));
+    public static Item foodPorkchopRaw = (new ItemFood("food.porkchop.raw", 16447, 3, 8, true, 16));
+    public static Item foodPorkchopCooked = (new ItemFood("food.porkchop.cooked", 16448, 8, 8, true, 16));
     public static Item painting = (new ItemPainting("painting", 16449));
-    public static Item foodAppleGold = (new ItemFood("food.apple.gold", 16450, 42, false));
+    public static Item foodAppleGold = (new ItemFood("food.apple.gold", 16450, 42, 0, false, 16));
     public static Item sign = (new ItemSign("sign", 16451));
-    public static Item doorOak = (new ItemDoor("door.oak", 16452, Material.wood));
+    public static Item doorOak = (new ItemDoor("door.oak", 16452, Block.doorPlanksOakBottom, Block.doorPlanksOakTop));
     public static Item bucket = (new ItemBucketEmpty("bucket", 16453));
     public static Item bucketWater = (new ItemBucket("bucket.water", 16454, Block.fluidWaterFlowing)).setContainerItem(bucket);
     public static Item bucketLava = (new ItemBucket("bucket.lava", 16455, Block.fluidLavaFlowing)).setContainerItem(bucket);
     public static Item minecart = (new ItemMinecart("minecart", 16456, 0));
     public static Item saddle = (new ItemSaddle("saddle", 16457));
-    public static Item doorIron = (new ItemDoor("door.iron", 16458, Material.metal));
+    public static Item doorIron = (new ItemDoor("door.iron", 16458, Block.doorIronBottom, Block.doorIronTop));
     public static Item dustRedstone = (new ItemPlaceable("dust.redstone", 16459, Block.wireRedstone));
     public static Item ammoSnowball = (new ItemSnowball("ammo.snowball", 16460));
     public static Item boat = (new ItemBoat("boat", 16461));
@@ -360,15 +354,15 @@ public class Item
     public static Item toolFishingrod = (new ItemFishingRod("tool.fishingrod", 16474));
     public static Item toolClock = (new Item("tool.clock", 16475));
     public static Item dustGlowstone = (new Item("dust.glowstone", 16476));
-    public static Item foodFishRaw = (new ItemFoodStackable("food.fish.raw", 16477, 2, false,4));
-    public static Item foodFishCooked = (new ItemFoodStackable("food.fish.cooked", 16478, 5, false, 4));
+    public static Item foodFishRaw = (new ItemFood("food.fish.raw", 16477, 2, 6, false, 16));
+    public static Item foodFishCooked = (new ItemFood("food.fish.cooked", 16478, 5, 6, false, 16));
     public static Item dye = (new ItemDye("dye", 16479));
     public static Item bone = (new Item("bone", 16480));
     public static Item dustSugar = (new Item("dust.sugar", 16481));
     public static Item foodCake = (new ItemPlaceable("food.cake", 16482, Block.cake)).setMaxStackSize(1);
     public static Item bed = (new ItemBed("bed", 16483)).setMaxStackSize(1);
     public static Item repeater = (new ItemPlaceable("repeater", 16484, Block.repeaterIdle));
-    public static Item foodCookie = (new ItemFoodStackable("food.cookie", 16485, 1, false, 8));
+    public static Item foodCookie = (new ItemFood("food.cookie", 16485, 1, 0, false, 16));
     public static ItemMap map = new ItemMap("map", 16486);
     public static ItemToolShears toolShears = new ItemToolShears("tool.shears", 16487, ToolMaterial.iron);
     public static Item record13 = (new ItemRecord("record.13", 18384, "13"));
@@ -388,8 +382,8 @@ public class Item
     public static Item armorChestplateSteel = (new ItemArmor("armor.chestplate.steel", 16490, ArmorMaterial.STEEL, 1));
     public static Item armorLeggingsSteel = (new ItemArmor("armor.leggings.steel", 16491, ArmorMaterial.STEEL, 2));
     public static Item armorBootsSteel = (new ItemArmor("armor.boots.steel", 16492, ArmorMaterial.STEEL, 3));
-    
-    public static Item toolSwordSteel = (new ItemToolSword("tool.sword.steel", 16493, ToolMaterial.steel)).withTags(ItemTags.preventCreativeMining);
+
+    public static Item toolSwordSteel = (new ItemToolSword("tool.sword.steel", 16493, ToolMaterial.steel)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
     public static Item toolShovelSteel = (new ItemToolShovel("tool.shovel.steel", 16494, ToolMaterial.steel));
     public static Item toolPickaxeSteel = (new ItemToolPickaxe("tool.pickaxe.steel", 16495, ToolMaterial.steel));
     public static Item toolAxeSteel = (new ItemToolAxe("tool.axe.steel", 16496, ToolMaterial.steel));
@@ -397,13 +391,13 @@ public class Item
     
     public static Item ingotSteel = (new Item("ingot.steel", 16498));
     public static Item ingotSteelCrude = (new Item("ingot.steel.crude", 16499));
-    public static Item ammoFireball = (new Item("ammo.fireball", 16500)).setNotInCreativeMenu();
+    public static Item ammoFireball = (new Item("ammo.fireball", 16500)).withTags(ItemTags.NOT_IN_CREATIVE_MENU);
     public static Item armorQuiverGold = (new ItemQuiverEndless("armor.quiver.gold", 16501));
     public static Item handcannonUnloaded = (new ItemHandCannonUnloaded("handcannon.unloaded", 16502));
     public static Item chainlink = (new Item("chainlink", 16503));
     public static Item cloth = (new Item("cloth", 16504));
     public static Item ammoChargeExplosive = (new Item("ammo.charge.explosive", 16505)).setMaxStackSize(16);
-    public static Item handcannonLoaded = (new ItemHandCannonLoaded("handcannon.loaded", 16506)).setNotInCreativeMenu();
+    public static Item handcannonLoaded = (new ItemHandCannonLoaded("handcannon.loaded", 16506)).withTags(ItemTags.NOT_IN_CREATIVE_MENU);
     public static Item ammoArrowGold = (new Item("ammo.arrow.gold", 16507));
     public static Item armorQuiver = (new ItemQuiver("armor.quiver", 16508));
     public static Item toolCalendar = (new Item("tool.calendar", 16509));
@@ -412,9 +406,9 @@ public class Item
     public static Item quartz = (new Item("quartz", 16512));
     public static Item olivine = (new Item("olivine", 16513));
     public static Item ammoPebble = (new ItemPebble("ammo.pebble", 16514));
-    public static Item cherry = (new ItemFoodStackable("food.cherry", 16515, 2, false, 2));
-    public static Item bucketIcecream = (new ItemBucketIceCream("bucket.icecream", 16516, 10)).setContainerItem(bucket);
-    public static Item ammoArrowPurple = (new Item("ammo.arrow.purple", 16517)).setNotInCreativeMenu();
+    public static Item cherry = (new ItemFood("food.cherry", 16515, 2, 0, false, 16));
+    public static Item bucketIcecream = (new ItemBucketIceCream("bucket.icecream", 16516, 10, 4)).setContainerItem(bucket);
+    public static Item ammoArrowPurple = (new Item("ammo.arrow.purple", 16517)).withTags(ItemTags.NOT_IN_CREATIVE_MENU);
     public static Item label = (new ItemLabel("label", 16518));
     public static Item jar = (new ItemJar("jar", 16519));
     public static Item lanternFireflyGreen = (new ItemPlaceable("lantern.firefly.green", 16520, Block.lanternFireflyGreen));
@@ -429,6 +423,9 @@ public class Item
     public static Item toolFirestrikerSteel = (new ItemFirestriker("tool.firestriker.steel", 16529)).setMaxDamage(ToolMaterial.steel.getDurability());
     public static Item seedsPumpkin = (new ItemSeeds("seeds.pumpkin", 16530, Block.cropsPumpkin));
     public static Item seat = new ItemPlaceable("seat", 16531, Block.seat).setMaxStackSize(64);
+    public static Item doorOakPainted = (new ItemDoorPainted("door.oak.painted", 16532, Block.doorPlanksOakPaintedBottom, Block.doorPlanksOakPaintedTop));
+    public static Item doorGlass = (new ItemDoor("door.glass", 16533, Block.doorGlassBottom, Block.doorGlassTop));
+    public static Item rope = new ItemPlaceable("rope", 16534, Block.rope);
 
 
     public static int highestItemId = 0;
@@ -438,7 +435,6 @@ public class Item
     protected boolean hasSubtypes;
     private Item containerItem;
     private String key;
-    public boolean notInCreativeMenu;
 
     static 
     {
diff --git a/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java b/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java
index d122ff370..8e2f8d4d2 100644
--- a/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java
+++ b/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java
@@ -3,28 +3,20 @@ package net.minecraft.core.item;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.world.World;
 
-public class ItemBucketIceCream extends Item{
+public class ItemBucketIceCream extends ItemFood {
 
-    public ItemBucketIceCream(String name, int id, int healAmount)
+    public ItemBucketIceCream(String name, int id, int healAmount, int ticksPerHeal)
     {
-        super(name, id);
-        this.healAmount = healAmount;
+        super(name, id, healAmount, ticksPerHeal, false, 1);
         maxStackSize = 1;
     }
     @Override
     public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         if (entityplayer.getHealth() < entityplayer.getMaxHealth()){
-            entityplayer.heal(healAmount);
+            super.onItemRightClick(itemstack, world, entityplayer);
             return new ItemStack(Item.bucket);
         }
         return itemstack;
     }
-
-    public int getHealAmount()
-    {
-        return healAmount;
-    }
-
-    protected int healAmount;
 }
diff --git a/src/main/java/net/minecraft/core/item/ItemDoor.java b/src/main/java/net/minecraft/core/item/ItemDoor.java
index ea1951c4c..ae5af701a 100644
--- a/src/main/java/net/minecraft/core/item/ItemDoor.java
+++ b/src/main/java/net/minecraft/core/item/ItemDoor.java
@@ -14,12 +14,15 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 public class ItemDoor extends Item {
+	protected final Block doorBlockBottom;
+	protected final Block doorBlockTop;
 
-	public ItemDoor(String name, int id, Material material) {
+	public ItemDoor(String name, int id, Block doorBlockBottom, Block doorBlockTop) {
 		super(name, id);
-		doorMaterial = material;
 		maxStackSize = 64;
-	}
+        this.doorBlockBottom = doorBlockBottom;
+        this.doorBlockTop = doorBlockTop;
+    }
 
 	@Override
 	public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
@@ -28,15 +31,6 @@ public class ItemDoor extends Item {
 			blockY += side.getOffsetY();
 			blockZ += side.getOffsetZ();
 		}
-		Block doorBlockBottom;
-		Block doorBlockTop;
-		if(doorMaterial == Material.wood) {
-			doorBlockBottom = Block.doorPlanksOakBottom;
-			doorBlockTop = Block.doorPlanksOakTop;
-		} else {
-			doorBlockBottom = Block.doorIronBottom;
-			doorBlockTop = Block.doorIronTop;
-		}
 		if(!doorBlockBottom.canPlaceBlockAt(world, blockX, blockY, blockZ)) {
 			return false;
 		}
diff --git a/src/main/java/net/minecraft/core/item/ItemDoorPainted.java b/src/main/java/net/minecraft/core/item/ItemDoorPainted.java
new file mode 100644
index 000000000..a03b6fdce
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/ItemDoorPainted.java
@@ -0,0 +1,65 @@
+package net.minecraft.core.item;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockWool;
+import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.enums.EnumBlockSoundEffectType;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+
+public class ItemDoorPainted extends ItemDoor{
+    public ItemDoorPainted(String name, int id, Block doorBottom, Block doorTopId) {
+        super(name, id, doorBottom, doorTopId);
+    }
+    @Override
+    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+        if(!world.canPlaceInsideBlock(blockX, blockY, blockZ)) {
+            blockX += side.getOffsetX();
+            blockY += side.getOffsetY();
+            blockZ += side.getOffsetZ();
+        }
+        if(!doorBlockBottom.canPlaceBlockAt(world, blockX, blockY, blockZ)) {
+            return false;
+        }
+
+        Direction dir = entityplayer.getHorizontalPlacementDirection(side).rotate(3);
+        int meta = dir.getHorizontalIndex();
+
+        int xOffset = -dir.getOffsetX();
+        int zOffset = -dir.getOffsetZ();
+
+        int isSolidBlockLeft = (world.isBlockNormalCube(blockX - xOffset, blockY, blockZ - zOffset) ? 1 : 0) + (world.isBlockNormalCube(blockX - xOffset, blockY + 1, blockZ - zOffset) ? 1 : 0);
+        int isSolidBlockRight = (world.isBlockNormalCube(blockX + xOffset, blockY, blockZ + zOffset) ? 1 : 0) + (world.isBlockNormalCube(blockX + xOffset, blockY + 1, blockZ + zOffset) ? 1 : 0);
+        boolean isDoorLeft = world.getBlockId(blockX - xOffset, blockY, blockZ - zOffset) == doorBlockBottom.id || world.getBlockId(blockX - xOffset, blockY + 1, blockZ - zOffset) == doorBlockTop.id;
+        boolean isDoorRight = world.getBlockId(blockX + xOffset, blockY, blockZ + zOffset) == doorBlockBottom.id || world.getBlockId(blockX + xOffset, blockY + 1, blockZ + zOffset) == doorBlockTop.id;
+        boolean isMirrored = false;
+
+        if(isDoorLeft && !isDoorRight) {
+            isMirrored = true;
+        } else if(isSolidBlockRight > isSolidBlockLeft) {
+            isMirrored = true;
+        }
+        if(isMirrored) {
+            meta = meta - 1 & 3;
+            meta += 4;
+            meta |= 0x8;
+        }
+        meta |= (15 - itemstack.getMetadata()) << 4 &0xF0;
+
+        world.editingBlocks = true;
+        world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, doorBlockBottom.id, meta);
+        world.setBlockAndMetadataWithNotify(blockX, blockY + 1, blockZ, doorBlockTop.id, meta);
+        world.editingBlocks = false;
+        world.notifyBlocksOfNeighborChange(blockX, blockY, blockZ, doorBlockBottom.id);
+        world.notifyBlocksOfNeighborChange(blockX, blockY + 1, blockZ, doorBlockTop.id);
+        world.playBlockSoundEffect(entityplayer,blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, doorBlockBottom, EnumBlockSoundEffectType.PLACE);
+        itemstack.consumeItem(entityplayer);
+        return true;
+    }
+    @Override
+    public String getLanguageKey(ItemStack itemstack)
+    {
+        return (new StringBuilder()).append(super.getKey()).append(".").append(ItemDye.dyeColors[itemstack.getMetadata() & 0xF]).toString();
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/ItemFishingRod.java b/src/main/java/net/minecraft/core/item/ItemFishingRod.java
index 4b9a2dd7e..4429b3073 100644
--- a/src/main/java/net/minecraft/core/item/ItemFishingRod.java
+++ b/src/main/java/net/minecraft/core/item/ItemFishingRod.java
@@ -21,10 +21,10 @@ public class ItemFishingRod extends Item
     @Override
     public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
-        if(entityplayer.fishEntity != null)
+        if(entityplayer.bobberEntity != null)
         {
-            int i = entityplayer.fishEntity.catchFish();
-            itemstack.damageItem(i, entityplayer);
+            int damage = entityplayer.bobberEntity.yoink();
+            itemstack.damageItem(damage, entityplayer);
         } else
         {
             world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
diff --git a/src/main/java/net/minecraft/core/item/ItemFood.java b/src/main/java/net/minecraft/core/item/ItemFood.java
index 92c5c48f1..81b46345a 100644
--- a/src/main/java/net/minecraft/core/item/ItemFood.java
+++ b/src/main/java/net/minecraft/core/item/ItemFood.java
@@ -1,28 +1,29 @@
 package net.minecraft.core.item;
 
-
-// Referenced classes of package net.minecraft.src:
-//            Item, ItemStack, EntityPlayer, World
-
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.world.World;
 
 public class ItemFood extends Item
 {
+    private final int healAmount;
+    private final boolean isWolfsFavoriteMeat;
+    private final int ticksPerHeal;
 
-    public ItemFood(String name, int id, int healAmount, boolean favouriteWolfMeat)
+    public ItemFood(String name, int id, int healAmount, int ticksPerHeal, boolean favouriteWolfMeat, int maxStackSize)
     {
         super(name, id);
         this.healAmount = healAmount;
-        isWolfsFavoriteMeat = favouriteWolfMeat;
-        maxStackSize = 1;
+        this.ticksPerHeal = ticksPerHeal;
+        this.isWolfsFavoriteMeat = favouriteWolfMeat;
+
+        this.maxStackSize = maxStackSize;
     }
 
     @Override
     public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         if(entityplayer.getHealth() < entityplayer.getMaxHealth() && itemstack.consumeItem(entityplayer)) {
-            entityplayer.heal(healAmount);
+            entityplayer.eatFood(this);
         }
         return itemstack;
     }
@@ -32,11 +33,12 @@ public class ItemFood extends Item
         return healAmount;
     }
 
+    public int getTicksPerHeal() {
+        return ticksPerHeal;
+    }
+
     public boolean getIsWolfsFavoriteMeat()
     {
         return isWolfsFavoriteMeat;
     }
-
-    protected int healAmount;
-    protected boolean isWolfsFavoriteMeat;
 }
diff --git a/src/main/java/net/minecraft/core/item/ItemFoodStackable.java b/src/main/java/net/minecraft/core/item/ItemFoodStackable.java
deleted file mode 100644
index f2bfb89ad..000000000
--- a/src/main/java/net/minecraft/core/item/ItemFoodStackable.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.minecraft.core.item;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ItemFood
-
-public class ItemFoodStackable extends ItemFood
-{
-
-    public ItemFoodStackable(String name, int id, int healAmount, boolean favouriteWolfFood, int maxStackSize)
-    {
-        super(name, id, healAmount, favouriteWolfFood);
-        this.maxStackSize = maxStackSize;
-    }
-
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemSoup.java b/src/main/java/net/minecraft/core/item/ItemSoup.java
index 49cc14755..dfc8d27bb 100644
--- a/src/main/java/net/minecraft/core/item/ItemSoup.java
+++ b/src/main/java/net/minecraft/core/item/ItemSoup.java
@@ -1,19 +1,14 @@
 package net.minecraft.core.item;
 
-
-// Referenced classes of package net.minecraft.src:
-//            ItemFood, ItemStack, Item, World, 
-//            EntityPlayer
-
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.world.World;
 
 public class ItemSoup extends ItemFood
 {
 
-    public ItemSoup(String name, int id, int j)
+    public ItemSoup(String name, int id, int healAmount, int ticksPerHeal)
     {
-        super(name, id, j, false);
+        super(name, id, healAmount, ticksPerHeal, false, 1);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/item/tag/ItemTags.java b/src/main/java/net/minecraft/core/item/tag/ItemTags.java
index b52add1d2..559e9155a 100644
--- a/src/main/java/net/minecraft/core/item/tag/ItemTags.java
+++ b/src/main/java/net/minecraft/core/item/tag/ItemTags.java
@@ -13,11 +13,16 @@ public abstract class ItemTags
     /**
      * Items with this tag will not destroy blocks in creative mode
      */
-    public static Tag<Item> preventCreativeMining = Tag.of("prevent_creative_mining");
+    public static Tag<Item> PREVENT_CREATIVE_MINING = Tag.of("prevent_creative_mining");
     /**
      * Items with this tag will break blocks with silk touch
      */
-    public static Tag<Item> isSilkTouch = Tag.of("is_silk_touch");
+    public static Tag<Item> IS_SILK_TOUCH = Tag.of("is_silk_touch");
+    /**
+     * Items with this tag will not be shown in the creative inventory.
+     */
+    public static Tag<Item> NOT_IN_CREATIVE_MENU = Tag.of("not_in_creative_menu");
+
     public static List<Tag<Item>> TAG_LIST;
 
     static
diff --git a/src/main/java/net/minecraft/core/net/ServerAddress.java b/src/main/java/net/minecraft/core/net/ServerAddress.java
new file mode 100644
index 000000000..df4a0c685
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/ServerAddress.java
@@ -0,0 +1,80 @@
+package net.minecraft.core.net;
+
+import javax.naming.directory.Attributes;
+import javax.naming.directory.InitialDirContext;
+import java.util.Hashtable;
+
+public class ServerAddress {
+    private final String ipAddress;
+    private final int serverPort;
+
+    private ServerAddress(String ip, int port) {
+        this.ipAddress = ip;
+        this.serverPort = port;
+    }
+
+    public String getIP() {
+        return this.ipAddress;
+    }
+
+    public int getPort() {
+        return this.serverPort;
+    }
+
+    public static ServerAddress resolveServerIP(String ipToResolve) {
+        if (ipToResolve == null) {
+            return null;
+        } else {
+            String[] ipSplit = ipToResolve.split(":");
+            if (ipToResolve.startsWith("[")) {
+                int ipv6End = ipToResolve.indexOf("]");
+                if (ipv6End > 0) {
+                    String ipv6IP = ipToResolve.substring(1, ipv6End);
+                    String port = ipToResolve.substring(ipv6End + 1).trim();
+                    if (port.startsWith(":") && !port.isEmpty()) {
+                        port = port.substring(1);
+                        ipSplit = new String[]{ipv6IP, port};
+                    } else {
+                        ipSplit = new String[]{ipv6IP};
+                    }
+                }
+            }
+
+            if (ipSplit.length > 2) {
+                ipSplit = new String[]{ipToResolve};
+            }
+
+            String ip = ipSplit[0];
+            int port = ipSplit.length > 1 ? parseIntWithDefault(ipSplit[1], 25565) : 25565;
+            if (port == 25565) {
+                String[] recordSplit = resolveSRVRecord(ip);
+                ip = recordSplit[0];
+                port = parseIntWithDefault(recordSplit[1], 25565);
+            }
+
+            return new ServerAddress(ip, port);
+        }
+    }
+
+    private static String[] resolveSRVRecord(String ip) {
+        try {
+            Hashtable<String, String> contextTable = new Hashtable<>();
+            contextTable.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
+            contextTable.put("java.naming.provider.url", "dns:");
+            InitialDirContext context = new InitialDirContext(contextTable);
+            Attributes attr = context.getAttributes("_minecraft._tcp." + ip, new String[]{"SRV"});
+            String[] ipSplit = attr.get("srv").get().toString().split(" ", 4);
+            return new String[]{ipSplit[3], ipSplit[2]};
+        } catch (Throwable t) {
+            return new String[]{ip, Integer.toString(25565)};
+        }
+    }
+
+    private static int parseIntWithDefault(String str, int defaultVal) {
+        try {
+            return Integer.parseInt(str.trim());
+        } catch (Exception e) {
+            return defaultVal;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/ServerData.java b/src/main/java/net/minecraft/core/net/ServerData.java
index 68b8dc554..308fcc8de 100644
--- a/src/main/java/net/minecraft/core/net/ServerData.java
+++ b/src/main/java/net/minecraft/core/net/ServerData.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.net;
 
 import com.mojang.nbt.CompoundTag;
+import org.apache.logging.log4j.core.jmx.Server;
 
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
@@ -40,19 +41,7 @@ public class ServerData
         tag.putCompound(Integer.toString(index), subTag);
     }
 
-    public String getHostName()
-    {
-        String[] split = address.split(":");
-        return split[0];
-    }
-
-    public int getPort()
-    {
-        String[] split = address.split(":");
-        try {
-            return Integer.parseInt(split[split.length - 1]);
-        } catch (NumberFormatException e) {
-            return 25565;
-        }
+    public ServerAddress getServerAddress() {
+        return ServerAddress.resolveServerIP(address);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/command/ClientPlayerCommandSender.java b/src/main/java/net/minecraft/core/net/command/ClientPlayerCommandSender.java
index ed9b6ea0d..95214f844 100644
--- a/src/main/java/net/minecraft/core/net/command/ClientPlayerCommandSender.java
+++ b/src/main/java/net/minecraft/core/net/command/ClientPlayerCommandSender.java
@@ -18,7 +18,7 @@ public class ClientPlayerCommandSender extends PlayerCommandSender{
 
 	@Override
 	public boolean isAdmin() {
-		return true;
+		return minecraft.theWorld.getLevelData().getCheatsEnabled();
 	}
 
 	@Override
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebook.java b/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebook.java
index 4b0a5dda3..cb16461da 100644
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebook.java
+++ b/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebook.java
@@ -25,42 +25,6 @@ public class ContainerGuidebook extends Container
 		return null;
 	}
 
-	public void setRecipes(final EntityPlayer player, final ContainerGuidebookRecipeBase[] recipes, StatsCounter statWriter)
-	{
-		inventorySlots.clear();
-
-		for (int i = 0; i < recipes.length; i++)
-		{
-			final int xOffset = (158 * (i / 3)) - 41;
-			final int yOffset = (62 * (i % 3)) + 3;
-			if (recipes[i] == null)
-			{
-				continue;
-			}
-
-			for (int j = 0; j < recipes[i].inventorySlots.size(); j++)
-			{
-				final SlotGuidebook slot = (SlotGuidebook) recipes[i].inventorySlots.get(j);
-
-				boolean discovered;
-
-				if (slot.item == null)
-				{
-					discovered = false;
-				}
-				else
-				{
-
-					discovered = statWriter.readStat(StatList.pickUpItemStats[slot.item.itemID]) > 0;
-				}
-				if(player.getGamemode() == Gamemode.creative)
-					discovered = true;
-
-				//addSlot(new SlotGuidebook(inventorySlots.size(), slot.xDisplayPosition + xOffset, slot.yDisplayPosition + yOffset, slot.item, discovered));
-			}
-		}
-	}
-	
 	@Override
 	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
 		return null;
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebookRecipeBase.java b/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebookRecipeBase.java
deleted file mode 100644
index 034d0b010..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebookRecipeBase.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-import net.minecraft.core.InventoryAction;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-
-public abstract class ContainerGuidebookRecipeBase extends Container
-{
-	@Override
-	public boolean isUsableByPlayer(final EntityPlayer entityplayer)
-	{
-		return true;
-	}
-
-	@Override
-	public ItemStack clickInventorySlot(InventoryAction action, int[] args, EntityPlayer player)
-	{
-		return null;
-	}
-
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebookRecipeCrafting.java b/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebookRecipeCrafting.java
deleted file mode 100644
index f4a77fae2..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebookRecipeCrafting.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-import net.minecraft.core.InventoryAction;
-import net.minecraft.core.crafting.legacy.recipe.IRecipe;
-import net.minecraft.core.crafting.legacy.type.RecipeShaped;
-import net.minecraft.core.crafting.legacy.type.RecipeShapeless;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotGuidebook;
-
-import java.util.List;
-
-public class ContainerGuidebookRecipeCrafting extends ContainerGuidebookRecipeBase
-{
-	public IRecipe recipe;
-
-	public ContainerGuidebookRecipeCrafting(final IRecipe recipe)
-	{
-		super();
-		this.recipe = recipe;
-
-		if (recipe instanceof RecipeShaped)
-		{
-			final RecipeShaped r = (RecipeShaped) recipe;
-			int slots;
-
-			if (r.recipeHeight > 2 || r.recipeWidth > 2)
-			{
-				slots = 10;
-				//addSlot(new SlotGuidebook(slots - 1, 81, 19, r.recipeOutput, false));
-
-				for (int i = 0; i < slots - 1; i++)
-				{
-					final int slotX = i % 3;
-					final int slotY = i / 3;
-
-					if (slotX >= r.recipeWidth || slotY >= r.recipeHeight)
-					{
-						addSlot(new SlotGuidebook(i, 1 + 18 * (i % 3), 1 + 18 * (i / 3), null, false));
-					}
-					else
-					{
-						ItemStack stack = r.recipeItems[slotX + (slotY * r.recipeWidth)];
-						if (stack != null)
-						{
-							stack = stack.copy();
-							stack.stackSize = 1;
-						}
-						//addSlot(new SlotGuidebook(i, 1 + 18 * (i % 3), 1 + 18 * (i / 3), stack, false));
-					}
-
-				}
-			}
-			else
-			{
-				slots = 5;
-				//addSlot(new SlotGuidebook(slots - 1, 69, 20, r.recipeOutput, false));
-
-				for (int i = 0; i < slots - 1; i++)
-				{
-					final int slotX = i % 2;
-					final int slotY = i / 2;
-
-					if (slotX >= r.recipeWidth || slotY >= r.recipeHeight)
-					{
-						addSlot(new SlotGuidebook(i, 13 + 18 * (i % 2), 10 + 18 * (i / 2), null, false));
-					}
-					else
-					{
-						ItemStack stack = r.recipeItems[slotX + (slotY * r.recipeWidth)];
-						if (stack != null)
-						{
-							stack = stack.copy();
-							stack.stackSize = 1;
-						}
-						//addSlot(new SlotGuidebook(i, 13 + 18 * (i % 2), 10 + 18 * (i / 2), stack, false));
-					}
-
-				}
-			}
-
-		}
-		else if (recipe instanceof RecipeShapeless)
-		{
-			final RecipeShapeless r = (RecipeShapeless) recipe;
-			int slots = 0;
-
-			if (r.recipeItems.size() > 4)
-			{
-				slots = 10;
-				//addSlot(new SlotGuidebook(slots - 1, 81, 19, r.recipeOutput, false));
-
-				for (int i = 0; i < r.recipeItems.size(); i++)
-				{
-					ItemStack stack = ((ItemStack) r.recipeItems.get(i));
-					if (stack != null)
-					{
-						stack = stack.copy();
-						stack.stackSize = 1;
-					}
-
-					//addSlot(new SlotGuidebook(i, 1 + 18 * (i % 3), 1 + 18 * (i / 3), stack, false));
-				}
-			}
-			else
-			{
-				slots = 5;
-				//addSlot(new SlotGuidebook(slots - 1, 69, 20, r.recipeOutput, false));
-
-				for (int i = 0; i < r.recipeItems.size(); i++)
-				{
-					ItemStack stack = ((ItemStack) r.recipeItems.get(i));
-					if (stack != null)
-					{
-						stack = stack.copy();
-						stack.stackSize = 1;
-					}
-					//addSlot(new SlotGuidebook(i, 13 + 18 * (i % 2), 10 + 18 * (i / 2), stack, false));
-				}
-			}
-
-		}
-		else
-		{
-			throw new IllegalArgumentException("Unsupported recipe type!!");
-		}
-	}
-
-	@Override
-	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		return null;
-	}
-	
-	@Override
-	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		return null;
-	}
-
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebookRecipeFurnace.java b/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebookRecipeFurnace.java
deleted file mode 100644
index 93fe1cfe9..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebookRecipeFurnace.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-import net.minecraft.core.InventoryAction;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.slot.Slot;
-
-import java.util.List;
-
-public class ContainerGuidebookRecipeFurnace extends ContainerGuidebookRecipeBase
-{
-	public int furnaceType;
-	public ItemStack input;
-	public ItemStack output;
-
-	public ContainerGuidebookRecipeFurnace(final ItemStack furnaceType, final ItemStack input, final ItemStack output)
-	{
-		super();
-
-		if (furnaceType.itemID == Block.furnaceStoneActive.id)
-		{
-			this.furnaceType = 0;
-		}
-		else if (furnaceType.itemID == Block.furnaceBlastActive.id)
-		{
-			this.furnaceType = 1;
-		}
-		else
-		{
-			throw new IllegalArgumentException();
-		}
-		this.input = input;
-		this.output = output;
-
-		//addSlot(new SlotGuidebook(0, 9, 10, input, false));
-		//addSlot(new SlotGuidebook(1, 69, 19, output, false));
-	}
-
-	@Override
-	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		return null;
-	}
-	
-	@Override
-	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		return null;
-	}
-
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerPlayerCreative.java b/src/main/java/net/minecraft/core/player/inventory/ContainerPlayerCreative.java
index e3a1f5be6..e503187de 100644
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerPlayerCreative.java
+++ b/src/main/java/net/minecraft/core/player/inventory/ContainerPlayerCreative.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.player.inventory;
 
 import net.minecraft.core.block.tag.BlockTags;
+import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
@@ -141,7 +142,9 @@ public class ContainerPlayerCreative extends ContainerPlayer
 						count++;
 					}
 				}
-				else if (id == Block.chestPlanksOakPainted.id || id == Block.slabPlanksOakPainted.id || id == Block.fencegatePlanksOakPainted.id || id == Block.stairsPlanksOakPainted.id)
+				else if (id == Block.chestPlanksOakPainted.id || id == Block.slabPlanksOakPainted.id || id == Block.fencegatePlanksOakPainted.id
+					  || id == Block.stairsPlanksOakPainted.id || id == Block.doorPlanksOakPaintedBottom.id || id == Block.doorPlanksOakPaintedTop.id
+					  || id == Block.trapdoorPlanksOakPainted.id)
 				{
 					for (int i = 0x10; i < 0x100; i += 0x10)
 					{
@@ -154,7 +157,7 @@ public class ContainerPlayerCreative extends ContainerPlayer
 		
 		for (int i = Block.blocksList.length; i < Item.itemsList.length; i++)
 		{
-			if (Item.itemsList[i] != null && !Item.itemsList[i].notInCreativeMenu)
+			if (Item.itemsList[i] != null && !Item.itemsList[i].hasTag(ItemTags.NOT_IN_CREATIVE_MENU))
 			{
 				creativeItems.add(new ItemStack(Item.itemsList[i]));
 				count++;
@@ -168,7 +171,7 @@ public class ContainerPlayerCreative extends ContainerPlayer
 					}
 				}
 
-				if (i == Item.dye.id)
+				if (i == Item.dye.id || i == Item.doorOakPainted.id)
 				{
 					for (int j = 1; j < 16; j++)
 					{
diff --git a/src/main/java/net/minecraft/core/player/inventory/CreativeInventoryCategories.java b/src/main/java/net/minecraft/core/player/inventory/CreativeInventoryCategories.java
deleted file mode 100644
index 0b7a505f6..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/CreativeInventoryCategories.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.Block;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static net.minecraft.core.block.Block.*;
-
-public class CreativeInventoryCategories
-{
-    public static class Category
-    {
-        public final String languageKey;
-        public final Item categoryIcon;
-        public final List<ItemStack> categoryItems;
-        public boolean expanded;
-
-        public Category(String languageKey, Item categoryIcon)
-        {
-            this.languageKey = languageKey;
-            this.categoryIcon = categoryIcon;
-            this.categoryItems = new ArrayList<>();
-        }
-
-        public Category(String languageKey, Block categoryIcon)
-        {
-            this(languageKey, Item.itemsList[categoryIcon.id]);
-        }
-
-        public void addItem(Item item, int metadata)
-        {
-            // Check item doesn't already exist
-            for (ItemStack stack : categoryItems)
-            {
-                if (stack.getItem() == item && stack.getMetadata() == metadata)
-                {
-                    return;
-                }
-            }
-
-            // Create item stack and add
-            categoryItems.add(new ItemStack(item, 1, metadata));
-        }
-
-        public void addItem(Item item)
-        {
-            addItem(item, 0);
-        }
-
-        public void addItems(Item item, int... metadatas)
-        {
-            for (int metadata : metadatas)
-            {
-                addItem(item, metadata);
-            }
-        }
-
-        public void addItems(Item item, int minMetadata, int maxMetadata)
-        {
-            for (int metadata = minMetadata; metadata <= maxMetadata; metadata++)
-            {
-                addItem(item, metadata);
-            }
-        }
-
-        public void addItem(Block block, int metadata)
-        {
-            addItem(Item.itemsList[block.id], metadata);
-        }
-
-        public void addItem(Block block)
-        {
-            addItem(block, 0);
-        }
-
-        public void addItems(Block block, int... metadatas)
-        {
-            addItems(Item.itemsList[block.id], metadatas);
-        }
-
-        public void addItems(Block block, int minMetadata, int maxMetadata)
-        {
-            addItems(Item.itemsList[block.id], minMetadata, maxMetadata);
-        }
-    }
-
-    public static final List<Object> members;
-
-    private static void addItem(Item item, int metadata)
-    {
-        // Check item doesn't already exist
-        for (Object member : members)
-        {
-            if (member instanceof ItemStack)
-            {
-                ItemStack stack = (ItemStack)member;
-                if (stack.getItem() == item && stack.getMetadata() == metadata)
-                {
-                    return;
-                }
-            }
-        }
-
-        // Create item stack and add
-        members.add(new ItemStack(item, 1, metadata));
-    }
-
-    private static void addItem(Item item)
-    {
-        addItem(item, 0);
-    }
-
-    private static void addItems(Item item, int... metadatas)
-    {
-        for (int metadata : metadatas)
-        {
-            addItem(item, metadata);
-        }
-    }
-
-    private static void addItems(Item item, int minMetadata, int maxMetadata)
-    {
-        for (int metadata = minMetadata; metadata <= maxMetadata; metadata++)
-        {
-            addItem(item, metadata);
-        }
-    }
-
-    private static void addItem(Block block, int metadata)
-    {
-        addItem(Item.itemsList[block.id], metadata);
-    }
-
-    private static void addItem(Block block)
-    {
-        addItem(block, 0);
-    }
-
-    private static void addItems(Block block, int... metadatas)
-    {
-        addItems(Item.itemsList[block.id], metadatas);
-    }
-
-    private static void addItems(Block block, int minMetadata, int maxMetadata)
-    {
-        addItems(Item.itemsList[block.id], minMetadata, maxMetadata);
-    }
-
-    static
-    {
-        members = new ArrayList<>();
-        Category active;
-
-        // Stones
-        members.add(active = new Category("creative.category.stones", stone));
-        active.addItem(stone);
-        active.addItem(basalt);
-        active.addItem(limestone);
-        active.addItem(granite);
-        active.addItem(marble);
-        active.addItem(slate);
-
-        // Cobblestones
-        members.add(active = new Category("creative.inventory.cobblestones", cobbleStone));
-        active.addItem(cobbleStone);
-        active.addItem(cobbleStoneMossy);
-        active.addItem(cobbleBasalt);
-        active.addItem(cobbleLimestone);
-        active.addItem(cobbleGranite);
-
-        // Polished Stones
-        members.add(active = new Category("creative.inventory.polishedStones", stonePolished));
-        active.addItem(stonePolished);
-        active.addItem(granitePolished);
-        active.addItem(limestonePolished);
-        active.addItem(basaltPolished);
-        active.addItem(slatePolished);
-
-        addItem(pillarMarble);
-
-        addItem(sandstone);
-
-        addItem(planksOak);
-
-        // Painted Planks
-        members.add(active = new Category("creative.inventory.paintedPlanks", planksOakPainted));
-        active.addItems(planksOakPainted, 0, 15);
-
-        addItem(fencePlanksOak);
-
-        // Painted Fences
-        members.add(active = new Category("creative.inventory.paintedFences", fencePlanksOakPainted));
-        active.addItems(fencePlanksOakPainted, 0, 15);
-
-        addItem(fencegatePlanksOak);
-
-        // Painted Fence Gates
-        members.add(active = new Category("creative.inventory.paintedFenceGates", fencegatePlanksOakPainted));
-        active.addItems(fencegatePlanksOakPainted, 0, 15);
-
-        
-
-    }
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/InventoryPlayer.java b/src/main/java/net/minecraft/core/player/inventory/InventoryPlayer.java
index fb88ea2d7..4e4b50b8b 100644
--- a/src/main/java/net/minecraft/core/player/inventory/InventoryPlayer.java
+++ b/src/main/java/net/minecraft/core/player/inventory/InventoryPlayer.java
@@ -17,7 +17,9 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemArmor;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.util.helper.DamageType;
+import org.jetbrains.annotations.Nullable;
 
 public class InventoryPlayer
     implements IInventory
@@ -32,6 +34,7 @@ public class InventoryPlayer
         this.player = player;
     }
 
+    @Nullable
     public ItemStack getCurrentItem()
     {
         if(currentItem < 9 + hotbarOffset && currentItem >= hotbarOffset)
@@ -136,7 +139,7 @@ public class InventoryPlayer
     	}
     	else
     	{
-    		if (Item.itemsList[itemstack.itemID].notInCreativeMenu) return currentItem;
+    		if (Item.itemsList[itemstack.itemID].hasTag(ItemTags.NOT_IN_CREATIVE_MENU)) return currentItem;
     	}
     	
     	for (int j = hotbarOffset; j < 9 + hotbarOffset; j++)
diff --git a/src/main/java/net/minecraft/core/player/inventory/creative/CreativeTab.java b/src/main/java/net/minecraft/core/player/inventory/creative/CreativeTab.java
new file mode 100644
index 000000000..60ad57121
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/creative/CreativeTab.java
@@ -0,0 +1,27 @@
+package net.minecraft.core.player.inventory.creative;
+
+import net.minecraft.core.item.ItemStack;
+
+public class CreativeTab {
+    private final String translationKey;
+    private final ItemStack icon;
+    private final CreativeTabItemProvider itemProvider;
+
+    public CreativeTab(String translationKey, ItemStack icon, CreativeTabItemProvider itemProvider) {
+        this.translationKey = translationKey;
+        this.icon = icon;
+        this.itemProvider = itemProvider;
+    }
+
+    public String getTranslationKey() {
+        return translationKey;
+    }
+
+    public ItemStack getIcon() {
+        return icon;
+    }
+
+    public CreativeTabItemProvider getItemProvider() {
+        return itemProvider;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/creative/CreativeTabItemProvider.java b/src/main/java/net/minecraft/core/player/inventory/creative/CreativeTabItemProvider.java
new file mode 100644
index 000000000..f31a41f8d
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/creative/CreativeTabItemProvider.java
@@ -0,0 +1,9 @@
+package net.minecraft.core.player.inventory.creative;
+
+import net.minecraft.core.item.ItemStack;
+
+import java.util.List;
+
+public interface CreativeTabItemProvider {
+    List<ItemStack> getItems();
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/creative/CreativeTabs.java b/src/main/java/net/minecraft/core/player/inventory/creative/CreativeTabs.java
new file mode 100644
index 000000000..8a60d940e
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/creative/CreativeTabs.java
@@ -0,0 +1,73 @@
+package net.minecraft.core.player.inventory.creative;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.tag.BlockTags;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.tag.ItemTags;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public abstract class CreativeTabs {
+    private static boolean initialized = false;
+    private static final List<CreativeTab> tabList = new ArrayList<>();
+
+    public static CreativeTab ALL;
+    public static CreativeTab BLOCKS;
+    public static CreativeTab ITEMS;
+
+    public static void init() {
+        if (initialized) return;
+        initialized = true;
+
+        ALL = register("tab.creative.all", new ItemStack(Item.ammoSnowball), () -> {
+            List<ItemStack> items = new ArrayList<>();
+            for (int i = 0; i < Item.highestItemId; i++) {
+                Item item = Item.itemsList[i];
+                if (item != null && !item.hasTag(ItemTags.NOT_IN_CREATIVE_MENU)) {
+                    items.add(new ItemStack(item));
+                }
+            }
+            for (int i = 0; i < Block.highestBlockId; i++) {
+                Block block = Block.blocksList[i];
+                if (block != null && !block.hasTag(BlockTags.NOT_IN_CREATIVE_MENU)) {
+                    items.add(new ItemStack(block));
+                }
+            }
+            return items;
+        });
+        BLOCKS = register("tab.creative.blocks", new ItemStack(Block.grass), () -> {
+            List<ItemStack> items = new ArrayList<>();
+            for (int i = 0; i < Block.highestBlockId; i++) {
+                Block block = Block.blocksList[i];
+                if (block != null && !block.hasTag(BlockTags.NOT_IN_CREATIVE_MENU)) {
+                    items.add(new ItemStack(block));
+                }
+            }
+            return items;
+        });
+        ITEMS = register("tab.creative.items", new ItemStack(Item.string), () -> {
+            List<ItemStack> items = new ArrayList<>();
+            for (int i = 0; i < Item.highestItemId; i++) {
+                Item item = Item.itemsList[i];
+                if (item != null && !item.hasTag(ItemTags.NOT_IN_CREATIVE_MENU)) {
+                    items.add(new ItemStack(item));
+                }
+            }
+            return items;
+        });
+    }
+
+    public static CreativeTab register(String translationKey, ItemStack icon, CreativeTabItemProvider itemProvider) {
+        CreativeTab tab = new CreativeTab(translationKey, icon, itemProvider);
+        tabList.add(tab);
+        return tab;
+    }
+
+    public static List<CreativeTab> getTabList() {
+        return Collections.unmodifiableList(tabList);
+    }
+
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/SlotGuidebook.java b/src/main/java/net/minecraft/core/player/inventory/slot/SlotGuidebook.java
index 6f02a6043..5f80f95ac 100644
--- a/src/main/java/net/minecraft/core/player/inventory/slot/SlotGuidebook.java
+++ b/src/main/java/net/minecraft/core/player/inventory/slot/SlotGuidebook.java
@@ -1,13 +1,12 @@
 package net.minecraft.core.player.inventory.slot;
 
 import net.minecraft.client.entity.player.EntityPlayerSP;
-import net.minecraft.core.Global;
 import net.minecraft.core.WeightedRandomBag;
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.data.registry.recipe.entry.RecipeEntryTrommel;
 import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
 import net.minecraft.core.data.registry.recipe.RecipeSymbol;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryTrommel;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.gamemode.Gamemode;
diff --git a/src/main/java/net/minecraft/core/sound/BlockSoundDispatcher.java b/src/main/java/net/minecraft/core/sound/BlockSoundDispatcher.java
index 951ec9d27..dcd6ba559 100644
--- a/src/main/java/net/minecraft/core/sound/BlockSoundDispatcher.java
+++ b/src/main/java/net/minecraft/core/sound/BlockSoundDispatcher.java
@@ -1,393 +1 @@
-package net.minecraft.core.sound;
-
-import net.minecraft.client.util.dispatch.Dispatcher;
-import net.minecraft.core.block.Block;
-
-public class BlockSoundDispatcher
-    extends Dispatcher<Block, BlockSound>
-{
-    private static final BlockSoundDispatcher instance = new BlockSoundDispatcher();
-
-    public static BlockSoundDispatcher getInstance()
-    {
-        return instance;
-    }
-
-    private BlockSoundDispatcher()
-    {
-        addDispatch(Block.stone, BlockSounds.STONE);
-        addDispatch(Block.basalt, BlockSounds.STONE);
-        addDispatch(Block.limestone, BlockSounds.STONE);
-        addDispatch(Block.granite, BlockSounds.STONE);
-        addDispatch(Block.marble, BlockSounds.STONE);
-        addDispatch(Block.slate, BlockSounds.STONE);
-        addDispatch(Block.permafrost, BlockSounds.STONE);
-
-        addDispatch(Block.cobbleStone, BlockSounds.STONE);
-        addDispatch(Block.cobbleStoneMossy, BlockSounds.STONE);
-        addDispatch(Block.cobbleBasalt, BlockSounds.STONE);
-        addDispatch(Block.cobbleLimestone, BlockSounds.STONE);
-        addDispatch(Block.cobbleGranite, BlockSounds.STONE);
-        addDispatch(Block.cobblePermafrost, BlockSounds.STONE);
-
-        addDispatch(Block.stonePolished, BlockSounds.STONE);
-        addDispatch(Block.granitePolished, BlockSounds.STONE);
-        addDispatch(Block.limestonePolished, BlockSounds.STONE);
-        addDispatch(Block.basaltPolished, BlockSounds.STONE);
-        addDispatch(Block.slatePolished, BlockSounds.STONE);
-
-        addDispatch(Block.pillarMarble, BlockSounds.STONE);
-        addDispatch(Block.capstoneMarble, BlockSounds.STONE);
-
-        addDispatch(Block.sandstone, BlockSounds.STONE);
-
-        addDispatch(Block.stoneCarved, BlockSounds.STONE);
-        addDispatch(Block.graniteCarved, BlockSounds.STONE);
-        addDispatch(Block.limestoneCarved, BlockSounds.STONE);
-        addDispatch(Block.basaltCarved, BlockSounds.STONE);
-
-        addDispatch(Block.planksOak, BlockSounds.WOOD);
-        addDispatch(Block.planksOakPainted, BlockSounds.WOOD);
-
-        addDispatch(Block.torchCoal, BlockSounds.WOOD);
-//        addDispatch(Block.candleSoulwax, BlockSounds.CLOTH);
-
-        addDispatch(Block.ladderOak, BlockSounds.WOOD);
-
-        addDispatch(Block.fencePlanksOak, BlockSounds.WOOD);
-        addDispatch(Block.fencePlanksOakPainted, BlockSounds.WOOD);
-
-        addDispatch(Block.fencegatePlanksOak, BlockSounds.WOOD);
-        addDispatch(Block.fencegatePlanksOakPainted, BlockSounds.WOOD);
-
-        addDispatch(Block.bookshelfPlanksOak, BlockSounds.WOOD);
-
-        addDispatch(Block.wool, BlockSounds.CLOTH);
-
-        addDispatch(Block.brickClay, BlockSounds.STONE);
-        addDispatch(Block.brickStonePolished, BlockSounds.STONE);
-        addDispatch(Block.brickStonePolishedMossy, BlockSounds.STONE);
-        addDispatch(Block.brickSandstone, BlockSounds.STONE);
-        addDispatch(Block.brickGold, BlockSounds.METAL);
-        addDispatch(Block.brickLapis, BlockSounds.STONE);
-        addDispatch(Block.brickBasalt, BlockSounds.STONE);
-        addDispatch(Block.brickLimestone, BlockSounds.STONE);
-        addDispatch(Block.brickGranite, BlockSounds.STONE);
-        addDispatch(Block.brickMarble, BlockSounds.STONE);
-        addDispatch(Block.brickSlate, BlockSounds.STONE);
-        addDispatch(Block.brickStone, BlockSounds.STONE);
-        addDispatch(Block.brickPermafrost, BlockSounds.STONE);
-        addDispatch(Block.brickIron, BlockSounds.METAL);
-
-        addDispatch(Block.slabPlanksOak, BlockSounds.WOOD);
-        addDispatch(Block.slabCobbleStone, BlockSounds.STONE);
-        addDispatch(Block.slabSandstone, BlockSounds.STONE);
-        addDispatch(Block.slabBrickStonePolished, BlockSounds.STONE);
-        addDispatch(Block.slabStonePolished, BlockSounds.STONE);
-        addDispatch(Block.slabBrickMarble, BlockSounds.STONE);
-        addDispatch(Block.slabBrickClay, BlockSounds.STONE);
-        addDispatch(Block.slabCapstoneMarble, BlockSounds.STONE);
-        addDispatch(Block.slabCobbleBasalt, BlockSounds.STONE);
-        addDispatch(Block.slabCobbleLimestone, BlockSounds.STONE);
-        addDispatch(Block.slabCobbleGranite, BlockSounds.STONE);
-        addDispatch(Block.slabBrickBasalt, BlockSounds.STONE);
-        addDispatch(Block.slabBrickLimestone, BlockSounds.STONE);
-        addDispatch(Block.slabBrickGranite, BlockSounds.STONE);
-        addDispatch(Block.slabPlanksOakPainted, BlockSounds.WOOD);
-        addDispatch(Block.slabBrickSlate, BlockSounds.STONE);
-        addDispatch(Block.slabBrickStone, BlockSounds.STONE);
-        addDispatch(Block.slabGranitePolished, BlockSounds.STONE);
-        addDispatch(Block.slabLimestonePolished, BlockSounds.STONE);
-        addDispatch(Block.slabBasaltPolished, BlockSounds.STONE);
-
-        addDispatch(Block.stairsPlanksOak, BlockSounds.WOOD);
-        addDispatch(Block.stairsCobbleStone, BlockSounds.STONE);
-        addDispatch(Block.stairsBrickStonePolished, BlockSounds.STONE);
-        addDispatch(Block.stairsBrickMarble, BlockSounds.STONE);
-        addDispatch(Block.stairsCobbleBasalt, BlockSounds.STONE);
-        addDispatch(Block.stairsCobbleLimestone, BlockSounds.STONE);
-        addDispatch(Block.stairsCobbleGranite, BlockSounds.STONE);
-        addDispatch(Block.stairsBrickBasalt, BlockSounds.STONE);
-        addDispatch(Block.stairsBrickLimestone, BlockSounds.STONE);
-        addDispatch(Block.stairsBrickGranite, BlockSounds.STONE);
-        addDispatch(Block.stairsBrickClay, BlockSounds.STONE);
-        addDispatch(Block.stairsPlanksOakPainted, BlockSounds.WOOD);
-        addDispatch(Block.stairsBrickSlate, BlockSounds.STONE);
-        addDispatch(Block.stairsBrickStone, BlockSounds.STONE);
-
-        addDispatch(Block.obsidian, BlockSounds.STONE);
-
-        addDispatch(Block.glass, BlockSounds.GLASS);
-        addDispatch(Block.glassTinted, BlockSounds.GLASS);
-
-        addDispatch(Block.grass, BlockSounds.GRASS);
-        addDispatch(Block.grassRetro, BlockSounds.GRASS);
-        addDispatch(Block.grassScorched, BlockSounds.GRASS);
-
-        addDispatch(Block.pathDirt, BlockSounds.GRAVEL);
-
-        addDispatch(Block.dirt, BlockSounds.GRAVEL);
-        addDispatch(Block.dirtScorched, BlockSounds.GRAVEL);
-        addDispatch(Block.dirtScorchedRich, BlockSounds.GRAVEL);
-
-        addDispatch(Block.mud, BlockSounds.GRAVEL);
-        addDispatch(Block.mudBaked, BlockSounds.STONE);
-
-        addDispatch(Block.spongeDry, BlockSounds.GRASS);
-        addDispatch(Block.spongeWet, BlockSounds.GRASS);
-
-        addDispatch(Block.mossStone, BlockSounds.GRASS);
-        addDispatch(Block.mossBasalt, BlockSounds.GRASS);
-        addDispatch(Block.mossLimestone, BlockSounds.GRASS);
-        addDispatch(Block.mossGranite, BlockSounds.GRASS);
-
-        addDispatch(Block.sand, BlockSounds.SAND);
-        addDispatch(Block.gravel, BlockSounds.GRAVEL);
-
-        addDispatch(Block.bedrock, BlockSounds.STONE);
-
-        addDispatch(Block.fluidWaterFlowing, BlockSounds.DEFAULT);
-        addDispatch(Block.fluidWaterStill, BlockSounds.DEFAULT);
-        addDispatch(Block.fluidLavaFlowing, BlockSounds.DEFAULT);
-        addDispatch(Block.fluidLavaStill, BlockSounds.DEFAULT);
-
-        addDispatch(Block.logOak, BlockSounds.WOOD);
-        addDispatch(Block.logPine, BlockSounds.WOOD);
-        addDispatch(Block.logBirch, BlockSounds.WOOD);
-        addDispatch(Block.logCherry, BlockSounds.WOOD);
-        addDispatch(Block.logEucalyptus, BlockSounds.WOOD);
-        addDispatch(Block.logOakMossy, BlockSounds.WOOD);
-
-        addDispatch(Block.leavesOak, BlockSounds.GRASS);
-        addDispatch(Block.leavesOakRetro, BlockSounds.GRASS);
-        addDispatch(Block.leavesPine, BlockSounds.GRASS);
-        addDispatch(Block.leavesBirch, BlockSounds.GRASS);
-        addDispatch(Block.leavesCherry, BlockSounds.GRASS);
-        addDispatch(Block.leavesEucalyptus, BlockSounds.GRASS);
-        addDispatch(Block.leavesShrub, BlockSounds.GRASS);
-        addDispatch(Block.leavesCherryFlowering, BlockSounds.GRASS);
-        addDispatch(Block.leavesCacao, BlockSounds.GRASS);
-
-        addDispatch(Block.saplingOak, BlockSounds.GRASS);
-        addDispatch(Block.saplingOakRetro, BlockSounds.GRASS);
-        addDispatch(Block.saplingPine, BlockSounds.GRASS);
-        addDispatch(Block.saplingBirch, BlockSounds.GRASS);
-        addDispatch(Block.saplingCherry, BlockSounds.GRASS);
-        addDispatch(Block.saplingEucalyptus, BlockSounds.GRASS);
-        addDispatch(Block.saplingShrub, BlockSounds.GRASS);
-        addDispatch(Block.saplingCacao, BlockSounds.GRASS);
-
-        addDispatch(Block.tallgrass, BlockSounds.GRASS);
-        addDispatch(Block.tallgrassFern, BlockSounds.GRASS);
-        addDispatch(Block.deadbush, BlockSounds.GRASS);
-        addDispatch(Block.spinifex, BlockSounds.GRASS);
-        addDispatch(Block.algae, BlockSounds.GRASS);
-
-        addDispatch(Block.flowerYellow, BlockSounds.GRASS);
-        addDispatch(Block.flowerRed, BlockSounds.GRASS);
-
-        addDispatch(Block.mushroomBrown, BlockSounds.GRASS);
-        addDispatch(Block.mushroomRed, BlockSounds.GRASS);
-
-        addDispatch(Block.oreCoalStone, BlockSounds.STONE);
-        addDispatch(Block.oreCoalBasalt, BlockSounds.STONE);
-        addDispatch(Block.oreCoalLimestone, BlockSounds.STONE);
-        addDispatch(Block.oreCoalGranite, BlockSounds.STONE);
-
-        addDispatch(Block.oreIronStone, BlockSounds.STONE);
-        addDispatch(Block.oreIronBasalt, BlockSounds.STONE);
-        addDispatch(Block.oreIronLimestone, BlockSounds.STONE);
-        addDispatch(Block.oreIronGranite, BlockSounds.STONE);
-
-        addDispatch(Block.oreGoldStone, BlockSounds.STONE);
-        addDispatch(Block.oreGoldBasalt, BlockSounds.STONE);
-        addDispatch(Block.oreGoldLimestone, BlockSounds.STONE);
-        addDispatch(Block.oreGoldGranite, BlockSounds.STONE);
-
-        addDispatch(Block.oreLapisStone, BlockSounds.STONE);
-        addDispatch(Block.oreLapisBasalt, BlockSounds.STONE);
-        addDispatch(Block.oreLapisLimestone, BlockSounds.STONE);
-        addDispatch(Block.oreLapisGranite, BlockSounds.STONE);
-
-        addDispatch(Block.oreRedstoneStone, BlockSounds.STONE);
-        addDispatch(Block.oreRedstoneBasalt, BlockSounds.STONE);
-        addDispatch(Block.oreRedstoneLimestone, BlockSounds.STONE);
-        addDispatch(Block.oreRedstoneGranite, BlockSounds.STONE);
-
-        addDispatch(Block.oreRedstoneGlowingStone, BlockSounds.STONE);
-        addDispatch(Block.oreRedstoneGlowingBasalt, BlockSounds.STONE);
-        addDispatch(Block.oreRedstoneGlowingLimestone, BlockSounds.STONE);
-        addDispatch(Block.oreRedstoneGlowingGranite, BlockSounds.STONE);
-
-        addDispatch(Block.oreDiamondStone, BlockSounds.STONE);
-        addDispatch(Block.oreDiamondBasalt, BlockSounds.STONE);
-        addDispatch(Block.oreDiamondLimestone, BlockSounds.STONE);
-        addDispatch(Block.oreDiamondGranite, BlockSounds.STONE);
-
-        addDispatch(Block.oreNethercoalNetherrack, BlockSounds.STONE);
-
-        addDispatch(Block.blockCoal, BlockSounds.STONE);
-        addDispatch(Block.blockIron, BlockSounds.METAL);
-        addDispatch(Block.blockGold, BlockSounds.METAL);
-        addDispatch(Block.blockLapis, BlockSounds.STONE);
-        addDispatch(Block.blockRedstone, BlockSounds.STONE);
-        addDispatch(Block.blockDiamond, BlockSounds.STONE);
-        addDispatch(Block.blockNetherCoal, BlockSounds.STONE);
-        addDispatch(Block.blockSteel, BlockSounds.METAL);
-        addDispatch(Block.blockQuartz, BlockSounds.STONE);
-        addDispatch(Block.blockOlivine, BlockSounds.STONE);
-        addDispatch(Block.blockCharcoal, BlockSounds.STONE);
-
-        addDispatch(Block.wireRedstone, BlockSounds.STONE);
-
-        addDispatch(Block.torchRedstoneIdle, BlockSounds.WOOD);
-        addDispatch(Block.torchRedstoneActive, BlockSounds.WOOD);
-
-        addDispatch(Block.buttonStone, BlockSounds.STONE);
-
-        addDispatch(Block.leverCobbleStone, BlockSounds.STONE);
-
-        addDispatch(Block.pressureplateStone, BlockSounds.STONE);
-        addDispatch(Block.pressureplatePlanksOak, BlockSounds.WOOD);
-        addDispatch(Block.pressureplateCobbleStone, BlockSounds.STONE);
-
-        addDispatch(Block.motionsensorIdle, BlockSounds.STONE);
-        addDispatch(Block.motionsensorActive, BlockSounds.STONE);
-
-        addDispatch(Block.repeaterIdle, BlockSounds.STONE);
-        addDispatch(Block.repeaterActive, BlockSounds.STONE);
-
-        addDispatch(Block.pistonBase, BlockSounds.STONE);
-        addDispatch(Block.pistonBaseSticky, BlockSounds.STONE);
-        addDispatch(Block.pistonHead, BlockSounds.STONE);
-        addDispatch(Block.pistonMoving, BlockSounds.STONE);
-
-        addDispatch(Block.noteblock, BlockSounds.WOOD);
-
-        addDispatch(Block.rail, BlockSounds.METAL);
-        addDispatch(Block.railPowered, BlockSounds.METAL);
-        addDispatch(Block.railDetector, BlockSounds.METAL);
-
-        addDispatch(Block.spikes, BlockSounds.METAL);
-
-        addDispatch(Block.dispenserCobbleStone, BlockSounds.STONE);
-
-        addDispatch(Block.trapdoorPlanksOak, BlockSounds.WOOD);
-        addDispatch(Block.trapdoorIron, BlockSounds.METAL);
-        addDispatch(Block.trapdoorGlass, BlockSounds.GLASS);
-
-        addDispatch(Block.tnt, BlockSounds.GRASS);
-
-        addDispatch(Block.doorPlanksOakBottom, BlockSounds.WOOD);
-        addDispatch(Block.doorPlanksOakTop, BlockSounds.WOOD);
-        addDispatch(Block.doorIronBottom, BlockSounds.METAL);
-        addDispatch(Block.doorIronTop, BlockSounds.METAL);
-
-        addDispatch(Block.mesh, BlockSounds.METAL);
-
-        addDispatch(Block.bed, BlockSounds.WOOD);
-        addDispatch(Block.seat, BlockSounds.WOOD);
-
-        addDispatch(Block.cobweb, BlockSounds.CLOTH);
-
-        addDispatch(Block.fire, BlockSounds.FIRE);
-
-        addDispatch(Block.mobspawner, BlockSounds.METAL);
-        addDispatch(Block.mobspawnerDeactivated, BlockSounds.METAL);
-
-        addDispatch(Block.workbench, BlockSounds.WOOD);
-
-        addDispatch(Block.furnaceStoneIdle, BlockSounds.STONE);
-        addDispatch(Block.furnaceStoneActive, BlockSounds.STONE);
-        addDispatch(Block.furnaceBlastIdle, BlockSounds.METAL);
-        addDispatch(Block.furnaceBlastActive, BlockSounds.METAL);
-
-        addDispatch(Block.trommelIdle, BlockSounds.STONE);
-        addDispatch(Block.trommelActive, BlockSounds.STONE);
-
-        addDispatch(Block.chestLegacy, BlockSounds.WOOD);
-        addDispatch(Block.chestLegacyPainted, BlockSounds.WOOD);
-        addDispatch(Block.chestPlanksOak, BlockSounds.WOOD);
-        addDispatch(Block.chestPlanksOakPainted, BlockSounds.WOOD);
-
-        addDispatch(Block.basket, BlockSounds.CLOTH);
-
-        addDispatch(Block.cropsWheat, BlockSounds.GRASS);
-        addDispatch(Block.cropsPumpkin, BlockSounds.WOOD);
-
-        addDispatch(Block.farmlandDirt, BlockSounds.GRAVEL);
-
-        addDispatch(Block.signPostPlanksOak, BlockSounds.WOOD);
-        addDispatch(Block.signWallPlanksOak, BlockSounds.WOOD);
-        addDispatch(Block.flag, BlockSounds.WOOD);
-
-        addDispatch(Block.layerSnow, BlockSounds.CLOTH);
-        addDispatch(Block.layerLeavesOak, BlockSounds.GRASS);
-        addDispatch(Block.layerSlate, BlockSounds.STONE);
-
-        addDispatch(Block.ice, BlockSounds.GLASS);
-        addDispatch(Block.permaice, BlockSounds.GLASS);
-
-        addDispatch(Block.blockSnow, BlockSounds.CLOTH);
-
-        addDispatch(Block.cactus, BlockSounds.CLOTH);
-
-        addDispatch(Block.blockClay, BlockSounds.GRAVEL);
-
-        addDispatch(Block.sugarcane, BlockSounds.GRASS);
-        addDispatch(Block.blockSugarcane, BlockSounds.GRASS);
-        addDispatch(Block.blockSugarcaneBaked, BlockSounds.GRASS);
-
-        addDispatch(Block.jukebox, BlockSounds.WOOD);
-
-        addDispatch(Block.pumpkin, BlockSounds.WOOD);
-        addDispatch(Block.pumpkinCarvedIdle, BlockSounds.WOOD);
-        addDispatch(Block.pumpkinCarvedActive, BlockSounds.WOOD);
-
-        addDispatch(Block.netherrack, BlockSounds.STONE);
-        addDispatch(Block.netherrackIgneous, BlockSounds.STONE);
-
-        addDispatch(Block.soulsand, BlockSounds.SAND);
-
-        addDispatch(Block.glowstone, BlockSounds.GLASS);
-
-        addDispatch(Block.portalNether, BlockSounds.GLASS);
-        addDispatch(Block.portalParadise, BlockSounds.GLASS);
-
-        addDispatch(Block.cake, BlockSounds.CLOTH);
-
-        addDispatch(Block.lampIdle, BlockSounds.GLASS);
-        addDispatch(Block.lampActive, BlockSounds.GLASS);
-
-        addDispatch(Block.lanternFireflyGreen, BlockSounds.GLASS);
-        addDispatch(Block.lanternFireflyBlue, BlockSounds.GLASS);
-        addDispatch(Block.lanternFireflyOrange, BlockSounds.GLASS);
-        addDispatch(Block.lanternFireflyRed, BlockSounds.GLASS);
-        addDispatch(Block.jarGlass, BlockSounds.GLASS);
-
-        addDispatch(Block.overlayPebbles, BlockSounds.STONE);
-
-        addDispatch(Block.fenceChainlink, BlockSounds.METAL);
-        addDispatch(Block.fencePaperWall, BlockSounds.CLOTH);
-        addDispatch(Block.paperWall, BlockSounds.CLOTH);
-
-        validate();
-    }
-
-    @Override
-    protected BlockSound getDefault()
-    {
-        return BlockSounds.DEFAULT;
-    }
-
-    private void validate()
-    {
-        for (Block block : Block.blocksList)
-        {
-            if (block != null && dispatches.get(block) == null)
-            {
-                throw new RuntimeException("Block " + block.getKey() + " has no assigned sound!");
-            }
-        }
-    }
-}
+package net.minecraft.core.sound;

import net.minecraft.client.util.dispatch.Dispatcher;
import net.minecraft.core.block.Block;

public class BlockSoundDispatcher
    extends Dispatcher<Block, BlockSound>
{
    private static final BlockSoundDispatcher instance = new BlockSoundDispatcher();

    public static BlockSoundDispatcher getInstance()
    {
        return instance;
    }

    private BlockSoundDispatcher()
    {
        addDispatch(Block.stone, BlockSounds.STONE);
        addDispatch(Block.basalt, BlockSounds.STONE);
        addDispatch(Block.limestone, BlockSounds.STONE);
        addDispatch(Block.granite, BlockSounds.STONE);
        addDispatch(Block.marble, BlockSounds.STONE);
        addDispatch(Block.slate, BlockSounds.STONE);
        addDispatch(Block.permafrost, BlockSounds.STONE);

        addDispatch(Block.cobbleStone, BlockSounds.STONE);
        addDispatch(Block.cobbleStoneMossy, BlockSounds.STONE);
        addDispatch(Block.cobbleBasalt, BlockSounds.STONE);
        addDispatch(Block.cobbleLimestone, BlockSounds.STONE);
        addDispatch(Block.cobbleGranite, BlockSounds.STONE);
        addDispatch(Block.cobblePermafrost, BlockSounds.STONE);

        addDispatch(Block.stonePolished, BlockSounds.STONE);
        addDispatch(Block.granitePolished, BlockSounds.STONE);
        addDispatch(Block.limestonePolished, BlockSounds.STONE);
        addDispatch(Block.basaltPolished, BlockSounds.STONE);
        addDispatch(Block.slatePolished, BlockSounds.STONE);

        addDispatch(Block.pillarMarble, BlockSounds.STONE);
        addDispatch(Block.capstoneMarble, BlockSounds.STONE);

        addDispatch(Block.sandstone, BlockSounds.STONE);

        addDispatch(Block.stoneCarved, BlockSounds.STONE);
        addDispatch(Block.graniteCarved, BlockSounds.STONE);
        addDispatch(Block.limestoneCarved, BlockSounds.STONE);
        addDispatch(Block.basaltCarved, BlockSounds.STONE);

        addDispatch(Block.planksOak, BlockSounds.WOOD);
        addDispatch(Block.planksOakPainted, BlockSounds.WOOD);

        addDispatch(Block.torchCoal, BlockSounds.WOOD);
//        addDispatch(Block.candleSoulwax, BlockSounds.CLOTH);

        addDispatch(Block.ladderOak, BlockSounds.WOOD);

        addDispatch(Block.fencePlanksOak, BlockSounds.WOOD);
        addDispatch(Block.fencePlanksOakPainted, BlockSounds.WOOD);

        addDispatch(Block.fencegatePlanksOak, BlockSounds.WOOD);
        addDispatch(Block.fencegatePlanksOakPainted, BlockSounds.WOOD);

        addDispatch(Block.bookshelfPlanksOak, BlockSounds.WOOD);

        addDispatch(Block.wool, BlockSounds.CLOTH);
        addDispatch(Block.rope, BlockSounds.CLOTH);

        addDispatch(Block.brickClay, BlockSounds.STONE);
        addDispatch(Block.brickStonePolished, BlockSounds.STONE);
        addDispatch(Block.brickStonePolishedMossy, BlockSounds.STONE);
        addDispatch(Block.brickSandstone, BlockSounds.STONE);
        addDispatch(Block.brickGold, BlockSounds.METAL);
        addDispatch(Block.brickLapis, BlockSounds.STONE);
        addDispatch(Block.brickBasalt, BlockSounds.STONE);
        addDispatch(Block.brickLimestone, BlockSounds.STONE);
        addDispatch(Block.brickGranite, BlockSounds.STONE);
        addDispatch(Block.brickMarble, BlockSounds.STONE);
        addDispatch(Block.brickSlate, BlockSounds.STONE);
        addDispatch(Block.brickStone, BlockSounds.STONE);
        addDispatch(Block.brickPermafrost, BlockSounds.STONE);
        addDispatch(Block.brickIron, BlockSounds.METAL);

        addDispatch(Block.slabPlanksOak, BlockSounds.WOOD);
        addDispatch(Block.slabCobbleStone, BlockSounds.STONE);
        addDispatch(Block.slabSandstone, BlockSounds.STONE);
        addDispatch(Block.slabBrickStonePolished, BlockSounds.STONE);
        addDispatch(Block.slabStonePolished, BlockSounds.STONE);
        addDispatch(Block.slabBrickMarble, BlockSounds.STONE);
        addDispatch(Block.slabBrickClay, BlockSounds.STONE);
        addDispatch(Block.slabCapstoneMarble, BlockSounds.STONE);
        addDispatch(Block.slabCobbleBasalt, BlockSounds.STONE);
        addDispatch(Block.slabCobbleLimestone, BlockSounds.STONE);
        addDispatch(Block.slabCobbleGranite, BlockSounds.STONE);
        addDispatch(Block.slabBrickBasalt, BlockSounds.STONE);
        addDispatch(Block.slabBrickLimestone, BlockSounds.STONE);
        addDispatch(Block.slabBrickGranite, BlockSounds.STONE);
        addDispatch(Block.slabPlanksOakPainted, BlockSounds.WOOD);
        addDispatch(Block.slabBrickSlate, BlockSounds.STONE);
        addDispatch(Block.slabBrickStone, BlockSounds.STONE);
        addDispatch(Block.slabGranitePolished, BlockSounds.STONE);
        addDispatch(Block.slabLimestonePolished, BlockSounds.STONE);
        addDispatch(Block.slabBasaltPolished, BlockSounds.STONE);

        addDispatch(Block.stairsPlanksOak, BlockSounds.WOOD);
        addDispatch(Block.stairsCobbleStone, BlockSounds.STONE);
        addDispatch(Block.stairsBrickStonePolished, BlockSounds.STONE);
        addDispatch(Block.stairsBrickMarble, BlockSounds.STONE);
        addDispatch(Block.stairsCobbleBasalt, BlockSounds.STONE);
        addDispatch(Block.stairsCobbleLimestone, BlockSounds.STONE);
        addDispatch(Block.stairsCobbleGranite, BlockSounds.STONE);
        addDispatch(Block.stairsBrickBasalt, BlockSounds.STONE);
        addDispatch(Block.stairsBrickLimestone, BlockSounds.STONE);
        addDispatch(Block.stairsBrickGranite, BlockSounds.STONE);
        addDispatch(Block.stairsBrickClay, BlockSounds.STONE);
        addDispatch(Block.stairsPlanksOakPainted, BlockSounds.WOOD);
        addDispatch(Block.stairsBrickSlate, BlockSounds.STONE);
        addDispatch(Block.stairsBrickStone, BlockSounds.STONE);

        addDispatch(Block.obsidian, BlockSounds.STONE);

        addDispatch(Block.glass, BlockSounds.GLASS);
        addDispatch(Block.glassTinted, BlockSounds.GLASS);

        addDispatch(Block.grass, BlockSounds.GRASS);
        addDispatch(Block.grassRetro, BlockSounds.GRASS);
        addDispatch(Block.grassScorched, BlockSounds.GRASS);

        addDispatch(Block.pathDirt, BlockSounds.GRAVEL);

        addDispatch(Block.dirt, BlockSounds.GRAVEL);
        addDispatch(Block.dirtScorched, BlockSounds.GRAVEL);
        addDispatch(Block.dirtScorchedRich, BlockSounds.GRAVEL);

        addDispatch(Block.mud, BlockSounds.GRAVEL);
        addDispatch(Block.mudBaked, BlockSounds.STONE);

        addDispatch(Block.spongeDry, BlockSounds.GRASS);
        addDispatch(Block.spongeWet, BlockSounds.GRASS);

        addDispatch(Block.mossStone, BlockSounds.GRASS);
        addDispatch(Block.mossBasalt, BlockSounds.GRASS);
        addDispatch(Block.mossLimestone, BlockSounds.GRASS);
        addDispatch(Block.mossGranite, BlockSounds.GRASS);

        addDispatch(Block.sand, BlockSounds.SAND);
        addDispatch(Block.gravel, BlockSounds.GRAVEL);

        addDispatch(Block.bedrock, BlockSounds.STONE);

        addDispatch(Block.fluidWaterFlowing, BlockSounds.DEFAULT);
        addDispatch(Block.fluidWaterStill, BlockSounds.DEFAULT);
        addDispatch(Block.fluidLavaFlowing, BlockSounds.DEFAULT);
        addDispatch(Block.fluidLavaStill, BlockSounds.DEFAULT);

        addDispatch(Block.logOak, BlockSounds.WOOD);
        addDispatch(Block.logPine, BlockSounds.WOOD);
        addDispatch(Block.logBirch, BlockSounds.WOOD);
        addDispatch(Block.logCherry, BlockSounds.WOOD);
        addDispatch(Block.logEucalyptus, BlockSounds.WOOD);
        addDispatch(Block.logOakMossy, BlockSounds.WOOD);

        addDispatch(Block.leavesOak, BlockSounds.GRASS);
        addDispatch(Block.leavesOakRetro, BlockSounds.GRASS);
        addDispatch(Block.leavesPine, BlockSounds.GRASS);
        addDispatch(Block.leavesBirch, BlockSounds.GRASS);
        addDispatch(Block.leavesCherry, BlockSounds.GRASS);
        addDispatch(Block.leavesEucalyptus, BlockSounds.GRASS);
        addDispatch(Block.leavesShrub, BlockSounds.GRASS);
        addDispatch(Block.leavesCherryFlowering, BlockSounds.GRASS);
        addDispatch(Block.leavesCacao, BlockSounds.GRASS);
        addDispatch(Block.leavesCaatinga, BlockSounds.GRASS);

        addDispatch(Block.saplingOak, BlockSounds.GRASS);
        addDispatch(Block.saplingOakRetro, BlockSounds.GRASS);
        addDispatch(Block.saplingPine, BlockSounds.GRASS);
        addDispatch(Block.saplingBirch, BlockSounds.GRASS);
        addDispatch(Block.saplingCherry, BlockSounds.GRASS);
        addDispatch(Block.saplingEucalyptus, BlockSounds.GRASS);
        addDispatch(Block.saplingShrub, BlockSounds.GRASS);
        addDispatch(Block.saplingCacao, BlockSounds.GRASS);

        addDispatch(Block.tallgrass, BlockSounds.GRASS);
        addDispatch(Block.tallgrassFern, BlockSounds.GRASS);
        addDispatch(Block.deadbush, BlockSounds.GRASS);
        addDispatch(Block.spinifex, BlockSounds.GRASS);
        addDispatch(Block.algae, BlockSounds.GRASS);

        addDispatch(Block.flowerYellow, BlockSounds.GRASS);
        addDispatch(Block.flowerRed, BlockSounds.GRASS);

        addDispatch(Block.mushroomBrown, BlockSounds.GRASS);
        addDispatch(Block.mushroomRed, BlockSounds.GRASS);

        addDispatch(Block.oreCoalStone, BlockSounds.STONE);
        addDispatch(Block.oreCoalBasalt, BlockSounds.STONE);
        addDispatch(Block.oreCoalLimestone, BlockSounds.STONE);
        addDispatch(Block.oreCoalGranite, BlockSounds.STONE);

        addDispatch(Block.oreIronStone, BlockSounds.STONE);
        addDispatch(Block.oreIronBasalt, BlockSounds.STONE);
        addDispatch(Block.oreIronLimestone, BlockSounds.STONE);
        addDispatch(Block.oreIronGranite, BlockSounds.STONE);

        addDispatch(Block.oreGoldStone, BlockSounds.STONE);
        addDispatch(Block.oreGoldBasalt, BlockSounds.STONE);
        addDispatch(Block.oreGoldLimestone, BlockSounds.STONE);
        addDispatch(Block.oreGoldGranite, BlockSounds.STONE);

        addDispatch(Block.oreLapisStone, BlockSounds.STONE);
        addDispatch(Block.oreLapisBasalt, BlockSounds.STONE);
        addDispatch(Block.oreLapisLimestone, BlockSounds.STONE);
        addDispatch(Block.oreLapisGranite, BlockSounds.STONE);

        addDispatch(Block.oreRedstoneStone, BlockSounds.STONE);
        addDispatch(Block.oreRedstoneBasalt, BlockSounds.STONE);
        addDispatch(Block.oreRedstoneLimestone, BlockSounds.STONE);
        addDispatch(Block.oreRedstoneGranite, BlockSounds.STONE);

        addDispatch(Block.oreRedstoneGlowingStone, BlockSounds.STONE);
        addDispatch(Block.oreRedstoneGlowingBasalt, BlockSounds.STONE);
        addDispatch(Block.oreRedstoneGlowingLimestone, BlockSounds.STONE);
        addDispatch(Block.oreRedstoneGlowingGranite, BlockSounds.STONE);

        addDispatch(Block.oreDiamondStone, BlockSounds.STONE);
        addDispatch(Block.oreDiamondBasalt, BlockSounds.STONE);
        addDispatch(Block.oreDiamondLimestone, BlockSounds.STONE);
        addDispatch(Block.oreDiamondGranite, BlockSounds.STONE);

        addDispatch(Block.oreNethercoalNetherrack, BlockSounds.STONE);

        addDispatch(Block.blockCoal, BlockSounds.STONE);
        addDispatch(Block.blockIron, BlockSounds.METAL);
        addDispatch(Block.blockGold, BlockSounds.METAL);
        addDispatch(Block.blockLapis, BlockSounds.STONE);
        addDispatch(Block.blockRedstone, BlockSounds.STONE);
        addDispatch(Block.blockDiamond, BlockSounds.STONE);
        addDispatch(Block.blockNetherCoal, BlockSounds.STONE);
        addDispatch(Block.blockSteel, BlockSounds.METAL);
        addDispatch(Block.blockQuartz, BlockSounds.STONE);
        addDispatch(Block.blockOlivine, BlockSounds.STONE);
        addDispatch(Block.blockCharcoal, BlockSounds.STONE);

        addDispatch(Block.wireRedstone, BlockSounds.STONE);

        addDispatch(Block.torchRedstoneIdle, BlockSounds.WOOD);
        addDispatch(Block.torchRedstoneActive, BlockSounds.WOOD);

        addDispatch(Block.buttonStone, BlockSounds.STONE);

        addDispatch(Block.leverCobbleStone, BlockSounds.STONE);

        addDispatch(Block.pressureplateStone, BlockSounds.STONE);
        addDispatch(Block.pressureplatePlanksOak, BlockSounds.WOOD);
        addDispatch(Block.pressureplateCobbleStone, BlockSounds.STONE);

        addDispatch(Block.motionsensorIdle, BlockSounds.STONE);
        addDispatch(Block.motionsensorActive, BlockSounds.STONE);

        addDispatch(Block.repeaterIdle, BlockSounds.STONE);
        addDispatch(Block.repeaterActive, BlockSounds.STONE);

        addDispatch(Block.pistonBase, BlockSounds.STONE);
        addDispatch(Block.pistonBaseSticky, BlockSounds.STONE);
        addDispatch(Block.pistonHead, BlockSounds.STONE);
        addDispatch(Block.pistonMoving, BlockSounds.STONE);

        addDispatch(Block.noteblock, BlockSounds.WOOD);

        addDispatch(Block.rail, BlockSounds.METAL);
        addDispatch(Block.railPowered, BlockSounds.METAL);
        addDispatch(Block.railDetector, BlockSounds.METAL);

        addDispatch(Block.spikes, BlockSounds.METAL);

        addDispatch(Block.dispenserCobbleStone, BlockSounds.STONE);

        addDispatch(Block.trapdoorPlanksOak, BlockSounds.WOOD);
        addDispatch(Block.trapdoorPlanksOakPainted, BlockSounds.WOOD);
        addDispatch(Block.trapdoorIron, BlockSounds.METAL);
        addDispatch(Block.trapdoorGlass, BlockSounds.GLASS);

        addDispatch(Block.tnt, BlockSounds.GRASS);

        addDispatch(Block.doorPlanksOakBottom, BlockSounds.WOOD);
        addDispatch(Block.doorPlanksOakTop, BlockSounds.WOOD);
        addDispatch(Block.doorIronBottom, BlockSounds.METAL);
        addDispatch(Block.doorIronTop, BlockSounds.METAL);
        addDispatch(Block.doorPlanksOakPaintedBottom, BlockSounds.WOOD);
        addDispatch(Block.doorPlanksOakPaintedTop, BlockSounds.WOOD);
        addDispatch(Block.doorGlassBottom, BlockSounds.GLASS);
        addDispatch(Block.doorGlassTop, BlockSounds.GLASS);

        addDispatch(Block.mesh, BlockSounds.METAL);
        addDispatch(Block.meshGold, BlockSounds.METAL);

        addDispatch(Block.bed, BlockSounds.WOOD);
        addDispatch(Block.seat, BlockSounds.WOOD);

        addDispatch(Block.cobweb, BlockSounds.CLOTH);

        addDispatch(Block.fire, BlockSounds.FIRE);
        addDispatch(Block.brazierInactive, BlockSounds.METAL);
        addDispatch(Block.brazierActive, BlockSounds.FIRE);

        addDispatch(Block.mobspawner, BlockSounds.METAL);
        addDispatch(Block.mobspawnerDeactivated, BlockSounds.METAL);

        addDispatch(Block.workbench, BlockSounds.WOOD);

        addDispatch(Block.furnaceStoneIdle, BlockSounds.STONE);
        addDispatch(Block.furnaceStoneActive, BlockSounds.STONE);
        addDispatch(Block.furnaceBlastIdle, BlockSounds.METAL);
        addDispatch(Block.furnaceBlastActive, BlockSounds.METAL);

        addDispatch(Block.trommelIdle, BlockSounds.STONE);
        addDispatch(Block.trommelActive, BlockSounds.STONE);

        addDispatch(Block.chestLegacy, BlockSounds.WOOD);
        addDispatch(Block.chestLegacyPainted, BlockSounds.WOOD);
        addDispatch(Block.chestPlanksOak, BlockSounds.WOOD);
        addDispatch(Block.chestPlanksOakPainted, BlockSounds.WOOD);

        addDispatch(Block.basket, BlockSounds.CLOTH);

        addDispatch(Block.cropsWheat, BlockSounds.GRASS);
        addDispatch(Block.cropsPumpkin, BlockSounds.WOOD);

        addDispatch(Block.farmlandDirt, BlockSounds.GRAVEL);

        addDispatch(Block.signPostPlanksOak, BlockSounds.WOOD);
        addDispatch(Block.signWallPlanksOak, BlockSounds.WOOD);
        addDispatch(Block.flag, BlockSounds.WOOD);

        addDispatch(Block.layerSnow, BlockSounds.CLOTH);
        addDispatch(Block.layerLeavesOak, BlockSounds.GRASS);
        addDispatch(Block.layerSlate, BlockSounds.STONE);

        addDispatch(Block.ice, BlockSounds.GLASS);
        addDispatch(Block.permaice, BlockSounds.GLASS);

        addDispatch(Block.blockSnow, BlockSounds.CLOTH);

        addDispatch(Block.cactus, BlockSounds.CLOTH);

        addDispatch(Block.blockClay, BlockSounds.GRAVEL);

        addDispatch(Block.sugarcane, BlockSounds.GRASS);
        addDispatch(Block.blockSugarcane, BlockSounds.GRASS);
        addDispatch(Block.blockSugarcaneBaked, BlockSounds.GRASS);

        addDispatch(Block.jukebox, BlockSounds.WOOD);

        addDispatch(Block.pumpkin, BlockSounds.WOOD);
        addDispatch(Block.pumpkinCarvedIdle, BlockSounds.WOOD);
        addDispatch(Block.pumpkinCarvedActive, BlockSounds.WOOD);

        addDispatch(Block.netherrack, BlockSounds.STONE);
        addDispatch(Block.netherrackIgneous, BlockSounds.STONE);

        addDispatch(Block.soulsand, BlockSounds.SAND);

        addDispatch(Block.glowstone, BlockSounds.GLASS);

        addDispatch(Block.portalNether, BlockSounds.GLASS);
        addDispatch(Block.portalParadise, BlockSounds.GLASS);

        addDispatch(Block.cake, BlockSounds.CLOTH);

        addDispatch(Block.lampIdle, BlockSounds.GLASS);
        addDispatch(Block.lampActive, BlockSounds.GLASS);

        addDispatch(Block.lanternFireflyGreen, BlockSounds.GLASS);
        addDispatch(Block.lanternFireflyBlue, BlockSounds.GLASS);
        addDispatch(Block.lanternFireflyOrange, BlockSounds.GLASS);
        addDispatch(Block.lanternFireflyRed, BlockSounds.GLASS);
        addDispatch(Block.jarGlass, BlockSounds.GLASS);

        addDispatch(Block.overlayPebbles, BlockSounds.STONE);

        addDispatch(Block.fenceChainlink, BlockSounds.METAL);
        addDispatch(Block.fencePaperWall, BlockSounds.CLOTH);
        addDispatch(Block.paperWall, BlockSounds.CLOTH);

        validate();
    }

    @Override
    protected BlockSound getDefault()
    {
        return BlockSounds.DEFAULT;
    }

    private void validate()
    {
        for (Block block : Block.blocksList)
        {
            if (block != null && dispatches.get(block) == null)
            {
                throw new RuntimeException("Block " + block.getKey() + " has no assigned sound!");
            }
        }
    }
}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/world/World.java b/src/main/java/net/minecraft/core/world/World.java
index 15a4a1967..59cbacaac 100644
--- a/src/main/java/net/minecraft/core/world/World.java
+++ b/src/main/java/net/minecraft/core/world/World.java
@@ -1442,7 +1442,7 @@ public class World implements WorldSource {
                     if(block != null)
                     {
                         int metadata = getBlockMetadata(dx, dy, dz);
-                        if (block.collidesWithEntity(entity) && entity.collidesWithBlock(block, metadata))
+                        if (block.collidesWithEntity(entity, this, dx, dy, dz) && entity.collidesWithBlock(block, metadata))
                         {
                             block.getCollidingBoundingBoxes(this, dx, dy, dz, axisalignedbb, collidingBoundingBoxes);
                         }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeCaatinga.java b/src/main/java/net/minecraft/core/world/biome/BiomeCaatinga.java
new file mode 100644
index 000000000..71b6c0d33
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeCaatinga.java
@@ -0,0 +1,37 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) braces deadcode
+
+package net.minecraft.core.world.biome;
+
+import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.entity.SpawnListEntry;
+import net.minecraft.core.world.generate.feature.tree.*;
+import net.minecraft.core.world.generate.feature.WorldFeature;
+
+import java.util.Random;
+
+// Referenced classes of package net.minecraft.src:
+//            BiomeGenBase, SpawnListEntry, EntityWolf, WorldGenForest,
+//            WorldGenBigTree, WorldGenTrees, WorldGenerator
+
+public class BiomeCaatinga extends Biome
+{
+
+    public BiomeCaatinga(String key) {
+        super(key);
+    }
+
+    @Override
+    public WorldFeature getRandomWorldGenForTrees(Random random)
+    {
+        if(random.nextInt(5) == 0)
+        {
+            return new WorldFeatureTreeShrub(Block.leavesCaatinga.id, Block.logOak.id);
+        } else
+        {
+            return new WorldFeatureTreeCaatinga(Block.leavesCaatinga.id, Block.logOak.id);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/biome/Biomes.java b/src/main/java/net/minecraft/core/world/biome/Biomes.java
index 784278d6c..0f37427e6 100644
--- a/src/main/java/net/minecraft/core/world/biome/Biomes.java
+++ b/src/main/java/net/minecraft/core/world/biome/Biomes.java
@@ -6,6 +6,7 @@ import net.minecraft.core.world.weather.Weather;
 
 public class Biomes
 {
+
     public static final Biome OVERWORLD_RAINFOREST = register("minecraft:overworld.rainforest", new BiomeRainforest("rainforest").setColor(0x1cf100).setBlockedWeathers(Weather.overworldSnow));
     public static final Biome OVERWORLD_SWAMPLAND = register("minecraft:overworld.swampland", new BiomeSwamp("swampland").setColor(0x00ff78));
     public static final Biome OVERWORLD_SEASONAL_FOREST = register("minecraft:overworld.seasonal_forest", new BiomeSeasonalForest("seasonal_forest").setColor(0x64ce15));
@@ -27,6 +28,7 @@ public class Biomes
     public static final Biome OVERWORLD_HELL = register("minecraft:overworld.hell", new Biome("hell").setColor(0xD96223).setTopBlock(Block.dirtScorched.id).setTopBlock(Block.dirtScorched.id));
     public static final Biome OVERWORLD_SWAMPLAND_MUDDY = register("minecraft:overworld.swampland.muddy", new BiomeSwamp("swampland.muddy").setColor(0x522700));
     public static final Biome OVERWORLD_OUTBACK_GRASSY = register("minecraft:overworld.outback.grassy", new BiomeOutback("outback.grassy").setColor(0xf09037).setBlockedWeathers(Weather.overworldSnow).setTopBlock(Block.grassScorched.id).setFillerBlock(Block.dirtScorched.id));
+    public static final Biome OVERWORLD_CAATINGA = register("minecraft:overworld.caatinga", new BiomeCaatinga("caatinga").setColor(0xFFFFFF).setTopBlock(Block.mudBaked.id).setFillerBlock(Block.mudBaked.id).setBlockedWeathers(Weather.overworldSnow));
 
     public static Biome register(String key, Biome biome)
     {
diff --git a/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderOverworld.java b/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderOverworld.java
index 2e16404fb..f02eb65cd 100644
--- a/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderOverworld.java
+++ b/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderOverworld.java
@@ -364,7 +364,7 @@ public final class BiomeProviderOverworld
         );
 
         brm.addRange(Biomes.OVERWORLD_PLAINS,
-                new BiomeRange(0.95, 1.0, 0.0125, 0.4, 0.0, 1.0, 0.0, 1.0)
+                new BiomeRange(0.90, 1.0, 0.0125, 0.5, 0.0, 1.0, 0.0, 1.0)
         );
         brm.addRange(Biomes.OVERWORLD_DESERT,
                 new BiomeRange(0.95, 1.0, 0.0, 0.2, 0.0, 1.0, 0.0, 1.0)
@@ -384,7 +384,10 @@ public final class BiomeProviderOverworld
         );
         brm.addRange(Biomes.OVERWORLD_FOREST,
                 new BiomeRange(0.75, 0.95, 0.2, 0.85, 0.0, 1.0, 0.0, 1.0),
-                new BiomeRange(0.95, 1.0, 0.4, 0.85, 0.0, 1.0, 0.0, 1.0)
+                new BiomeRange(0.95, 1.0, 0.5, 0.85, 0.0, 1.0, 0.0, 1.0)
+        );
+        brm.addRange(Biomes.OVERWORLD_CAATINGA,
+                new BiomeRange(0.98, 1.0, 0.2, 0.65, 0.0, 1.0, 0.0, 1.0)
         );
         brm.addRange(Biomes.OVERWORLD_RAINFOREST,
                 new BiomeRange(0.95, 1.0, 0.85, 1.0, 0.0, 1.0, 0.0, 1.0)
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 dac157166..a8a8848b4 100644
--- a/src/main/java/net/minecraft/core/world/chunk/Chunk.java
+++ b/src/main/java/net/minecraft/core/world/chunk/Chunk.java
@@ -327,7 +327,7 @@ public class Chunk
         }
 
         section.setBlock(x, y % ChunkSection.SECTION_SIZE_Y, z, id);
-        section.setData(x, y % ChunkSection.SECTION_SIZE_Y, z, id);
+        section.setData(x, y % ChunkSection.SECTION_SIZE_Y, z, 0);
 
         int worldX = xPosition * CHUNK_SIZE_X + x;
         int worldZ = zPosition * CHUNK_SIZE_Z + z;
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/ChunkDecoratorOverworld.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/ChunkDecoratorOverworld.java
index a14a0658a..7ea2c70fe 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/ChunkDecoratorOverworld.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/ChunkDecoratorOverworld.java
@@ -258,6 +258,9 @@ public class ChunkDecoratorOverworld
         if (biome == Biomes.OVERWORLD_PLAINS) {
             treeDensity -= 20;
         }
+        if (biome == Biomes.OVERWORLD_CAATINGA) {
+            treeDensity += k4 + 2;
+        }
         if (biome == Biomes.OVERWORLD_SWAMPLAND) {
             treeDensity += k4 + 4;
         }
@@ -320,6 +323,9 @@ public class ChunkDecoratorOverworld
         if (biome == Biomes.OVERWORLD_PLAINS) {
             byte0 = 3;
         }
+        if (biome == Biomes.OVERWORLD_CAATINGA) {
+            byte0 = 5;
+        }
         if (biome == Biomes.OVERWORLD_OUTBACK_GRASSY || biome == Biomes.OVERWORLD_OUTBACK) {
             byte0 = 2;
         }
@@ -355,6 +361,9 @@ public class ChunkDecoratorOverworld
         if (biome == Biomes.OVERWORLD_PLAINS) {
             byte1 = 10;
         }
+        if (biome == Biomes.OVERWORLD_CAATINGA) {
+            byte1 = 3;
+        }
         if (biome == Biomes.OVERWORLD_SWAMPLAND) {
             byte1 = 4;
         }
@@ -446,6 +455,10 @@ public class ChunkDecoratorOverworld
         {
             k16 += 10;
         }
+        if(biome == Biomes.OVERWORLD_CAATINGA)
+        {
+            k16 += 3;
+        }
         for(int k18 = 0; k18 < k16; k18++)
         {
             int k21 = x + rand.nextInt(16) + 8;
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java
index a70327338..453ba9673 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java
@@ -147,7 +147,7 @@ public class SurfaceGeneratorOverworld
                             // generate coastlines
                             topBlock = biome.topBlock;
                             fillerBlock = biome.fillerBlock;
-                            if(biome == Biomes.OVERWORLD_SWAMPLAND || biome == Biomes.OVERWORLD_SWAMPLAND_MUDDY)
+                            if(biome == Biomes.OVERWORLD_CAATINGA || biome == Biomes.OVERWORLD_SWAMPLAND || biome == Biomes.OVERWORLD_SWAMPLAND_MUDDY)
                             {
                                 topBlock = (short) Block.mud.id;
                                 fillerBlock = (short) Block.mud.id;
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeCaatinga.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeCaatinga.java
new file mode 100644
index 000000000..a50560754
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeCaatinga.java
@@ -0,0 +1,194 @@
+package net.minecraft.core.world.generate.feature.tree;
+
+import java.util.Random;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.tag.BlockTags;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.feature.WorldFeature;
+
+public class WorldFeatureTreeCaatinga extends WorldFeature
+{
+    protected int leavesID;
+    protected int logID;
+    protected int heightMod = 2;
+
+    public WorldFeatureTreeCaatinga(int leavesID, int logID)
+    {
+        this.leavesID = leavesID;
+        this.logID = logID;
+    }
+
+    void placeBranch(int[] startPos, int[] endPos, int blockId, World world)
+    {
+        int[] dimensions = { 0, 0, 0 };
+        int dim0 = 0;
+
+        // Find widest dimension and assign it to dim0
+        for(int i = 0; i < 3; i++)
+        {
+            dimensions[i] = endPos[i] - startPos[i];
+            if(Math.abs(dimensions[i]) > Math.abs(dimensions[dim0]))
+            {
+                dim0 = i;
+            }
+        }
+
+        if(dimensions[dim0] == 0)
+        {
+            return;
+        }
+
+        // Look up other two dimensions
+        byte dim1 = dimensionLookup[dim0];
+        byte dim2 = dimensionLookup[dim0 + 3];
+
+        byte delta;
+        if(dimensions[dim0] > 0)
+        {
+            delta = 1;
+        }
+        else
+        {
+            delta = -1;
+        }
+
+        // Determine delta scale for other two dimensions
+        double dim1DeltaScale = (double)dimensions[dim1] / (double)dimensions[dim0];
+        double dim2DeltaScale = (double)dimensions[dim2] / (double)dimensions[dim0];
+
+        // Draw line from startPos to endPos
+        for(int i = 0; i != dimensions[dim0] + delta; i += delta)
+        {
+            int[] pos = { 0, 0, 0 };
+            pos[dim0] = MathHelper.floor_double((double)startPos[dim0] + (double)i + 0.5D);
+            pos[dim1] = MathHelper.floor_double((double)startPos[dim1] + (double)i * dim1DeltaScale + 0.5D);
+            pos[dim2] = MathHelper.floor_double((double)startPos[dim2] + (double)i * dim2DeltaScale + 0.5D);
+            world.setBlockWithNotify(pos[0], pos[1], pos[2], blockId);
+        }
+    }
+
+    @Override
+    public boolean generate(World world, Random random, int x, int y, int z)
+    {
+        int l = random.nextInt(3) + heightMod;
+        int noCanopies = 2;
+        boolean flag = true;
+        if(y < 1 || y + l + 1 > world.getHeightBlocks())
+        {
+            return false;
+        }
+        for(int i1 = y; i1 <= y + 1 + l; i1++)
+        {
+            byte byte0 = 1;
+            if(i1 == y)
+            {
+                byte0 = 0;
+            }
+            if(i1 >= (y + 1 + l) - 2)
+            {
+                byte0 = 2;
+            }
+            for(int i2 = x - byte0; i2 <= x + byte0 && flag; i2++)
+            {
+                for(int l2 = z - byte0; l2 <= z + byte0 && flag; l2++)
+                {
+                    if(i1 >= 0 && i1 < world.getHeightBlocks())
+                    {
+                        int j3 = world.getBlockId(i2, i1, l2);
+                        if(j3 != 0 && j3 != leavesID)
+                        {
+                            flag = false;
+                        }
+                    } else
+                    {
+                        flag = false;
+                    }
+                }
+
+            }
+
+        }
+
+        if(!flag)
+        {
+            return false;
+        }
+        int idBelow = world.getBlockId(x, y - 1, z);
+        if(!Block.hasTag(idBelow, BlockTags.GROWS_TREES) || y >= world.getHeightBlocks() - l - 1)
+        {
+            return false;
+        }
+        WorldFeatureTree.onTreeGrown(world, x, y, z);
+        for(int i = 0; i < noCanopies; i++) {
+            int modX = random.nextInt(6) - 3;
+            int modZ = random.nextInt(6) - 3;
+            int modY = random.nextInt(3) + 1;
+            int x1 = x + modX;
+            int z1 = z + modZ;
+
+            for(int k1 = (y - 2) + l; k1 <= y + l; k1++)
+            {
+                int j2 = k1 - (y + l);
+                int i3 = 1 - j2 / 2;
+
+                for (int k3 = x - i3; k3 <= x + i3; k3++) {
+                    int l3 = k3 - x;
+                    for (int i4 = z - i3; i4 <= z + i3; i4++) {
+                        int j4 = i4 - z;
+                        if ((Math.abs(l3) != i3 || Math.abs(j4) != i3 || random.nextInt(2) != 0 && j2 != 0) && !Block.solid[world.getBlockId(k3, k1, i4)]) {
+                            placeLeaves(world, k3+ modX, k1 + modY, i4+ modZ, random);
+                        }
+                    }
+
+                }
+            }
+            placeBranch(new int[]{x1, (y + modY + l) - 2, z1}, new int[]{x, (y - 2) + l, z}, logID, world);
+        }
+
+        for(int l1 = 0; l1 < l; l1++)
+        {
+            int id = world.getBlockId(x, y + l1, z);
+            if(id == 0 || isLeaf(id))
+            {
+                world.setBlockWithNotify(x, y + l1, z, logID);
+            }
+        }
+
+        return true;
+    }
+
+    public void placeLeaves(World world, int x, int y, int z, Random rand) {
+        world.setBlockWithNotify(x, y, z, leavesID);
+    }
+
+    public boolean isLeaf(int id) {
+        return id == leavesID;
+    }
+
+    /**
+     * Replace grass blocks below the tree with dirt
+     */
+    public static void onTreeGrown(World world, int x, int y, int z) {
+        Block dirt = WorldFeatureTree.getDirtForGrass(world.getBlockId(x, y - 1, z));
+        if(dirt != null) {
+            world.setBlockWithNotify(x, y - 1, z, dirt.id);
+        }
+    }
+
+    public static Block getDirtForGrass(int id) {
+        // TODO make this not hardcoded
+        if(id == Block.grass.id || id == Block.grassRetro.id) {
+            return Block.dirt;
+        }
+        if(id == Block.grassScorched.id) {
+            return Block.dirtScorched;
+        }
+        return null;
+    }
+
+    static final byte dimensionLookup[] = {
+            2, 0, 0, 1, 2, 1
+    };
+}
diff --git a/src/main/resources/assets/minecraft/textures/block/brazier_base.png b/src/main/resources/assets/minecraft/textures/block/brazier_base.png
new file mode 100644
index 000000000..a491fed89
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/brazier_base.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/brazier_side.png b/src/main/resources/assets/minecraft/textures/block/brazier_side.png
new file mode 100644
index 000000000..a6110c89a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/brazier_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/cobbled_basalt.png b/src/main/resources/assets/minecraft/textures/block/cobbled_basalt.png
index 2cc6930b1..7c581deea 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/cobbled_basalt.png and b/src/main/resources/assets/minecraft/textures/block/cobbled_basalt.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/cobbled_granite.png b/src/main/resources/assets/minecraft/textures/block/cobbled_granite.png
index cd01c11db..d2d6c8669 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/cobbled_granite.png and b/src/main/resources/assets/minecraft/textures/block/cobbled_granite.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/cobbled_limestone.png b/src/main/resources/assets/minecraft/textures/block/cobbled_limestone.png
index 8f1d0c960..764ae3107 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/cobbled_limestone.png and b/src/main/resources/assets/minecraft/textures/block/cobbled_limestone.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/cobbled_permafrost.png b/src/main/resources/assets/minecraft/textures/block/cobbled_permafrost.png
index 15c8eb822..c3e41be95 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/cobbled_permafrost.png and b/src/main/resources/assets/minecraft/textures/block/cobbled_permafrost.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/cobbled_stone.png b/src/main/resources/assets/minecraft/textures/block/cobbled_stone.png
index ea6e0cb24..719cb4b85 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/cobbled_stone.png and b/src/main/resources/assets/minecraft/textures/block/cobbled_stone.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/cobbled_stone_mossy.png b/src/main/resources/assets/minecraft/textures/block/cobbled_stone_mossy.png
index 0e86978cc..bf2fa8c59 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/cobbled_stone_mossy.png and b/src/main/resources/assets/minecraft/textures/block/cobbled_stone_mossy.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/cobbled_stone_retro.png b/src/main/resources/assets/minecraft/textures/block/cobbled_stone_retro.png
index e02ed586d..725e9af8f 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/cobbled_stone_retro.png and b/src/main/resources/assets/minecraft/textures/block/cobbled_stone_retro.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_glass_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_glass_bottom.png
new file mode 100644
index 000000000..842eb4def
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_glass_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_glass_top.png b/src/main/resources/assets/minecraft/textures/block/door_glass_top.png
new file mode 100644
index 000000000..a869b9c4a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_glass_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_black_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_black_bottom.png
new file mode 100644
index 000000000..35f85c279
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_black_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_black_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_black_top.png
new file mode 100644
index 000000000..c59a3af96
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_black_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_blue_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_blue_bottom.png
new file mode 100644
index 000000000..3e85b7996
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_blue_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_blue_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_blue_top.png
new file mode 100644
index 000000000..f57e8690f
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_blue_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_brown_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_brown_bottom.png
new file mode 100644
index 000000000..e2a6b506b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_brown_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_brown_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_brown_top.png
new file mode 100644
index 000000000..308606c34
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_brown_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_cyan_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_cyan_bottom.png
new file mode 100644
index 000000000..a390dcbd6
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_cyan_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_cyan_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_cyan_top.png
new file mode 100644
index 000000000..46426df2c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_cyan_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_gray_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_gray_bottom.png
new file mode 100644
index 000000000..e4fc43bb2
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_gray_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_gray_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_gray_top.png
new file mode 100644
index 000000000..f36e02b10
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_gray_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_green_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_green_bottom.png
new file mode 100644
index 000000000..57326e175
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_green_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_green_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_green_top.png
new file mode 100644
index 000000000..e2c73a1b0
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_green_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lightblue_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lightblue_bottom.png
new file mode 100644
index 000000000..cb1697c6e
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lightblue_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lightblue_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lightblue_top.png
new file mode 100644
index 000000000..e4acaaf9b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lightblue_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lime_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lime_bottom.png
new file mode 100644
index 000000000..f96c9f83d
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lime_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lime_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lime_top.png
new file mode 100644
index 000000000..eddc94803
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_lime_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_magenta_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_magenta_bottom.png
new file mode 100644
index 000000000..7d3c2fccc
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_magenta_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_magenta_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_magenta_top.png
new file mode 100644
index 000000000..098cbafeb
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_magenta_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_orange_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_orange_bottom.png
new file mode 100644
index 000000000..aa1094e6c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_orange_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_orange_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_orange_top.png
new file mode 100644
index 000000000..a40809a4c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_orange_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_pink_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_pink_bottom.png
new file mode 100644
index 000000000..a62dc7f0c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_pink_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_pink_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_pink_top.png
new file mode 100644
index 000000000..7bdc03e39
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_pink_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_purple_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_purple_bottom.png
new file mode 100644
index 000000000..bc0584382
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_purple_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_purple_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_purple_top.png
new file mode 100644
index 000000000..fbb8fab0b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_purple_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_red_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_red_bottom.png
new file mode 100644
index 000000000..8574a0322
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_red_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_red_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_red_top.png
new file mode 100644
index 000000000..232255b65
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_red_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_silver_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_silver_bottom.png
new file mode 100644
index 000000000..a97957e07
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_silver_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_silver_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_silver_top.png
new file mode 100644
index 000000000..6134c1fcd
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_silver_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_bottom.png
new file mode 100644
index 000000000..3b7621069
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_top.png
new file mode 100644
index 000000000..cafe13003
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_yellow_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_yellow_bottom.png
new file mode 100644
index 000000000..27de03c68
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_yellow_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_yellow_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_yellow_top.png
new file mode 100644
index 000000000..363a4d27a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_yellow_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/leaves_caatinga.png b/src/main/resources/assets/minecraft/textures/block/leaves_caatinga.png
new file mode 100644
index 000000000..0cdfe6878
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/leaves_caatinga.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/leaves_caatinga_fancy.png b/src/main/resources/assets/minecraft/textures/block/leaves_caatinga_fancy.png
new file mode 100644
index 000000000..41d657b0c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/leaves_caatinga_fancy.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/mesh_gold.png b/src/main/resources/assets/minecraft/textures/block/mesh_gold.png
new file mode 100644
index 000000000..a2fd886f0
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/mesh_gold.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/rope.png b/src/main/resources/assets/minecraft/textures/block/rope.png
new file mode 100644
index 000000000..293d0696e
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/rope.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/slate_side.png b/src/main/resources/assets/minecraft/textures/block/slate_side.png
index c48d087d5..ffc86bb98 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/slate_side.png and b/src/main/resources/assets/minecraft/textures/block/slate_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/slate_top.png b/src/main/resources/assets/minecraft/textures/block/slate_top.png
index e4186c082..eaa13a35d 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/slate_top.png and b/src/main/resources/assets/minecraft/textures/block/slate_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_black_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_black_side.png
new file mode 100644
index 000000000..b841cc550
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_black_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_black_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_black_top.png
new file mode 100644
index 000000000..0f471ab7d
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_black_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_blue_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_blue_side.png
new file mode 100644
index 000000000..cbe17672d
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_blue_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_blue_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_blue_top.png
new file mode 100644
index 000000000..e9956529e
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_blue_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_brown_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_brown_side.png
new file mode 100644
index 000000000..4f6dfad83
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_brown_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_brown_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_brown_top.png
new file mode 100644
index 000000000..e139bfdf8
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_brown_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_cyan_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_cyan_side.png
new file mode 100644
index 000000000..547085cb6
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_cyan_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_cyan_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_cyan_top.png
new file mode 100644
index 000000000..5dc27d35a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_cyan_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_gray_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_gray_side.png
new file mode 100644
index 000000000..522604413
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_gray_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_gray_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_gray_top.png
new file mode 100644
index 000000000..5bdb963d4
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_gray_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_green_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_green_side.png
new file mode 100644
index 000000000..ff3f9b45c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_green_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_green_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_green_top.png
new file mode 100644
index 000000000..6aebf86e7
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_green_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lightblue_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lightblue_side.png
new file mode 100644
index 000000000..b9b1d4413
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lightblue_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lightblue_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lightblue_top.png
new file mode 100644
index 000000000..8eefff65c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lightblue_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lime_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lime_side.png
new file mode 100644
index 000000000..3abbd0e1e
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lime_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lime_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lime_top.png
new file mode 100644
index 000000000..b10070646
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_lime_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_magenta_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_magenta_side.png
new file mode 100644
index 000000000..b5562aab8
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_magenta_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_magenta_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_magenta_top.png
new file mode 100644
index 000000000..a971c1939
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_magenta_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_orange_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_orange_side.png
new file mode 100644
index 000000000..cd9c675d8
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_orange_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_orange_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_orange_top.png
new file mode 100644
index 000000000..c8862bd7b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_orange_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_pink_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_pink_side.png
new file mode 100644
index 000000000..f00603775
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_pink_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_pink_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_pink_top.png
new file mode 100644
index 000000000..6f44a8689
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_pink_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_purple_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_purple_side.png
new file mode 100644
index 000000000..e866b47b7
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_purple_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_purple_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_purple_top.png
new file mode 100644
index 000000000..c7e79c95f
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_purple_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_red_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_red_side.png
new file mode 100644
index 000000000..6be0b6532
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_red_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_red_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_red_top.png
new file mode 100644
index 000000000..cdbcf9953
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_red_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_silver_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_silver_side.png
new file mode 100644
index 000000000..4a760f40c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_silver_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_silver_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_silver_top.png
new file mode 100644
index 000000000..9c553e15f
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_silver_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_side.png
new file mode 100644
index 000000000..3fdfffed2
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_top.png
new file mode 100644
index 000000000..7fa791902
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_yellow_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_yellow_side.png
new file mode 100644
index 000000000..75c31f723
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_yellow_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_yellow_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_yellow_top.png
new file mode 100644
index 000000000..413198acd
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_yellow_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_black.png b/src/main/resources/assets/minecraft/textures/item/door_black.png
new file mode 100644
index 000000000..55327c354
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_black.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_blue.png b/src/main/resources/assets/minecraft/textures/item/door_blue.png
new file mode 100644
index 000000000..6d6976dc3
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_blue.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_brown.png b/src/main/resources/assets/minecraft/textures/item/door_brown.png
new file mode 100644
index 000000000..c19125ee5
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_brown.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_cyan.png b/src/main/resources/assets/minecraft/textures/item/door_cyan.png
new file mode 100644
index 000000000..f08f8f88e
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_cyan.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_glass.png b/src/main/resources/assets/minecraft/textures/item/door_glass.png
new file mode 100644
index 000000000..fbb120324
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_glass.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_gray.png b/src/main/resources/assets/minecraft/textures/item/door_gray.png
new file mode 100644
index 000000000..4049a60ea
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_gray.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_green.png b/src/main/resources/assets/minecraft/textures/item/door_green.png
new file mode 100644
index 000000000..f04468dd7
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_green.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_lightblue.png b/src/main/resources/assets/minecraft/textures/item/door_lightblue.png
new file mode 100644
index 000000000..7bb324ac3
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_lightblue.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_lime.png b/src/main/resources/assets/minecraft/textures/item/door_lime.png
new file mode 100644
index 000000000..6e308bb35
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_lime.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_magenta.png b/src/main/resources/assets/minecraft/textures/item/door_magenta.png
new file mode 100644
index 000000000..5fe231240
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_magenta.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_orange.png b/src/main/resources/assets/minecraft/textures/item/door_orange.png
new file mode 100644
index 000000000..3944bfc7a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_orange.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_pink.png b/src/main/resources/assets/minecraft/textures/item/door_pink.png
new file mode 100644
index 000000000..55d8e3096
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_pink.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_purple.png b/src/main/resources/assets/minecraft/textures/item/door_purple.png
new file mode 100644
index 000000000..059a2daa3
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_purple.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_red.png b/src/main/resources/assets/minecraft/textures/item/door_red.png
new file mode 100644
index 000000000..c4d4ee979
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_red.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_silver.png b/src/main/resources/assets/minecraft/textures/item/door_silver.png
new file mode 100644
index 000000000..1f3bc892f
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_silver.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_white.png b/src/main/resources/assets/minecraft/textures/item/door_white.png
new file mode 100644
index 000000000..4ac4fa91b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_white.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/door_yellow.png b/src/main/resources/assets/minecraft/textures/item/door_yellow.png
new file mode 100644
index 000000000..5e930bcba
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/door_yellow.png differ
diff --git a/src/main/resources/assets/minecraft/textures/item/rope.png b/src/main/resources/assets/minecraft/textures/item/rope.png
new file mode 100644
index 000000000..d9da72221
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/rope.png differ
diff --git a/src/main/resources/gui/creative.png b/src/main/resources/gui/creative.png
index 03ccbb25b..e76d44785 100644
Binary files a/src/main/resources/gui/creative.png and b/src/main/resources/gui/creative.png differ
diff --git a/src/main/resources/gui/icons.png b/src/main/resources/gui/icons.png
index 25c0662f8..bfd8f6086 100644
Binary files a/src/main/resources/gui/icons.png and b/src/main/resources/gui/icons.png differ
diff --git a/src/main/resources/misc/colors.properties b/src/main/resources/misc/colors.properties
index 2ade0dc08..7364b1198 100644
--- a/src/main/resources/misc/colors.properties
+++ b/src/main/resources/misc/colors.properties
@@ -95,6 +95,19 @@ override.leaves.shrub.winter.r=0.561
 override.leaves.shrub.winter.g=0.514
 override.leaves.shrub.winter.b=0.369
 
+override.leaves.caatinga.spring.r=0.675
+override.leaves.caatinga.spring.g=0.640
+override.leaves.caatinga.spring.b=0.164
+override.leaves.caatinga.summer.r=0.675
+override.leaves.caatinga.summer.g=0.640
+override.leaves.caatinga.summer.b=0.164
+override.leaves.caatinga.fall.r=0.343
+override.leaves.caatinga.fall.g=0.679
+override.leaves.caatinga.fall.b=0.203
+override.leaves.caatinga.winter.r=0.343
+override.leaves.caatinga.winter.g=0.679
+override.leaves.caatinga.winter.b=0.203
+
 override.leaves.cocoa.all.r=0.29
 override.leaves.cocoa.all.g=0.659
-override.leaves.cocoa.all.b=0.125
\ No newline at end of file
+override.leaves.cocoa.all.b=0.125
